550점인 45번 문제를 풀어보자.
addslashes() : DB에서 ', ", /, Null Byte 와 같이 특수문자들을 이스케이프 처리해주는 함수
mb_convert_encoding(문자열,바꿀 인코딩,현재인코딩); : 인코딩 변환
id와 pw에는 admin, select, limit, pw, =, <, > 문자열을 필터링 된다.
최종적으로 쿼리의 결과가 id=admin이면 문제가 풀리게 되지만, pw를 md5로 암호화해서 쿼리하기 때문에 Blind SQL Injection을 통해 비밀번호를 유추하기가 힘들 것 같다.
그럼, id를 통해 SQL Injection을 시도해보자.
우리는 mb_convert_encoding 함수의 취약점을 이용할 것이다.
멀티바이트를 사용하는 언어셋 환경에서는 백슬래시 앞에 %a1~%fe의 값이 들어오면 인코딩이 깨지면서 백슬래시를 덮어씌어버려서 2바이트의 멀티바이트를 하나의 문자(1바이트)처럼 표현이 되는 취약점이 있다.
예를 들어 addslashes함수나 mysql_real_escape_string함수에 0x27(')이 들어가게 되면 0x27앞에 백슬래쉬를 붙여준다. 즉 0x5c27(\')이 된다. 여기서 %a1~%fe의 값이 들어오면 백슬래쉬를 먹어버린다고 했으니 0xa15c27을 삽입하면 '만 남개된다. 이로써 우회가 가능하다고 볼 수 있다.
id값이 admin일 경우에 참으로 만들고 뒤는 주석 처리하여 쿼리 결과가 admin이 반환되도록 만든다.
쿼리문 : ?id=%a1' or id='admin'#
이렇게 참으로 만들어야 하지만, admin, =문자열이 필터링되고 있기 때문에 쿼리문을 hex값으로 인코딩해준다.
쿼리문 : ?id=%a1' or id like 0x61646d696e%23&pw=guest
'CTF & WarGame > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] 47번 문제 (0) | 2020.03.15 |
---|---|
[webhacking.kr] 46번 문제 (0) | 2020.03.15 |
[webhacking.kr] 44번 문제 (0) | 2020.03.15 |
[webhacking.kr] 43번 문제 (0) | 2020.03.14 |
[webhacking.kr] 42번 문제 (0) | 2020.03.14 |