안녕하세요.
웹 해킹 45번 문제풀이 하겠습니다.
소스코드를 분석해보면,
- addslashes( ) : 문자열에 싱글쿼터( ' ), 더블쿼터( " ) 등 특수문자가 포함되어 있다면 역슬래시( \ )를 붙여 하나의 문자로 인식시키게 하는 함수 ( SQL 인젝션 공격에 대응방안으로 사용되는 함수입니다.)
- mb_convert_encoding( ) : 문자 인코딩을 바꿔주는 함수
* mb_convert_encoding(문자열, 바꿀 인코딩, 현재인코딩)
이 문제에서는 euc-kr -> utf-8로 변경해주고 있습니다.
* UTF-8 : 유니코드를 위한 가변길이 문자 인코딩 방식 중 하나
- preg_match( ) : 문자열에 특정 문자가 포함되어 있는지 확인하는 함수
이 문제에서는 admin, select, limit, pw, =, <, >를 필터링 하고 있습니다.
문제는 위 함수들을 우회해서 id값을 admin으로 출력하면 됩니다.select id from chall45 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')
그럼 차례대로 내려와보면,
id 값은 addslashes함수로 인하여 싱글쿼터 ( ' ) 앞에 역슬래시( \ ) 가 포함된다.
역슬래시가 포함된 id는 utf-8로 인코딩 되어 멀티바이트 사용환경에서 역슬래시( \ ) 앞에 %a1 ~ %fe가 오면 역슬래시와 합쳐서 하나의 문자가 됩니다.
따라서 utf-8 환경에서도 %aa%27 같은 (%27은 싱글쿼터) 값을 입력하면, 필터링에 의한 슬래쉬(%5c) 추가 뒤에 %aa%5c%27 에서 %aa%5c가 하나의 문자로 인식되면서 싱글쿼터인 %27이 독립적으로 살아남게 됩니다.
멀티바이트 : 2byte 이상의 문자들로 문자를 표현
유니코드 : 모든 문자를 2byte로 표현
-> select id from chall45 where id=''%aa' or id ='admin#' and pw=md5('{$_GET['pw']}')
그리고 필터링 되던 문자열인
admin을 HEX로 우회하여 0x61646D696E
=를 like
'를 %27
공백을 %20
#을 %23으로 하여
-> select id from chall45 where id=''%aa%27%20or%20id%20like%200x61646D696E%23' and pw=md5('{$_GET['pw']}')
이를 GET 방식으로 전달해주면
감사합니다.
'Hacking > Webhacking.kr' 카테고리의 다른 글
Webhacking.kr 47번 문제풀이 (0) | 2021.02.23 |
---|---|
Webhacking.kr 46번 문제풀이 (0) | 2021.02.19 |
Webhacking.kr 44번 문제풀이 (0) | 2021.02.08 |
Webhacking.kr 43번 문제풀이 (0) | 2021.02.07 |
Webhacking.kr 42번 문제풀이 (0) | 2021.02.05 |