안녕하세요.
웹 해킹 27번 문제풀이 하겠습니다.
문제의 소스코드를 확인해보면,
- if(preg_match("/#|select|\(| |limit|=|0x/i",$_GET['no'])) exit("no hack");
-> preg_match 함수를 통해 select, limit등 문자열을 필터링하고 no hack을 출력하고 있습니다.
- $r=mysqli_fetch_array(mysqli_query($db,"select id from chall27 where id='guest' and no=({$_GET['no']})")) or die("query error");
-> chall27 테이블에서 가져온 id를 가져오는데 id의 no가 guest가 아닐경우 "query error"를 출력하고 종료합니다.
- if($r['id']=="guest") echo("guest");
if($r['id']=="admin") solve(27); // admin's no = 2
-> id가 guest일 경우 "guest"를 출력하고 guest는 id가 no가 1입니다. 또한 id가 "admin"일 경우 문제가 해결됩니다. admin의 id no는 2라고 알려주고 있습니다.
문제는 결국, "select id from chall27 where id='guest' and no=({$_GET['no']})")) 구문에서
-> "select id from chall27 where id='guest' and no=(0) or no 2 )")) or die("query error");
필터링 값들을 우회하여
= -> like
공백 -> %09
2이하 주석 -> -- / --뒤에 공백이 포함되어 있어야 주석처리가 됩니다.
감사합니다.
'Hacking > Webhacking.kr' 카테고리의 다른 글
Webhacking.kr 29번 문제풀이 (1) | 2021.01.08 |
---|---|
Webhacking.kr 28번 문제풀이 (0) | 2021.01.07 |
Webhacking.kr 26번 문제풀이 (0) | 2020.12.31 |
Webhacking.kr 25번 문제풀이 (0) | 2020.12.29 |
Webhacking.kr 24번 문제풀이 (0) | 2020.12.26 |