Wargame/Webhacking.kr
webhacking.kr - old 49
G_OM
2024. 3. 29. 13:17
문제화면이다.
소스코드를 확인해 보자.
중요한 부분을 따로 봐보자.
<?php
if($_GET['lv']){
$db = dbconnect();
if(preg_match("/select|or|and|\(|\)|limit|,|\/|order|cash| |\t|\'|\"/i",$_GET['lv'])) exit("no hack");
$GET에서 'lv' 값을 확인한다.
preg_match 함수로 필터링을 한다.
해당 필터링은
select, or, and, limt, order에 대한 SQL 구문 필터링
슬래시 , 공백, 싱글, 더블쿼터, tab
이 막혀있다.
$result = mysqli_fetch_array(mysqli_query($db,"select id from chall49 where lv={$_GET['lv']}"));
echo $result[0] ;
if($result[0]=="admin") solve(49);
}
GET 요청을 통해 lv 받을 값을 할당하여 chall49 테이블에 있는 id 열을 확인한다.
그럼 필터링을 우회해서 id 가 admin을 불러와야 한다.
코드를 통해서 id라는 이름의 열이 있다는 것을 확인했다.
근데 lv 값이 이미 부여된 lv=1, lv=2, lv=3, lv=4 들은 넘기고
아무 값이 뜨지 않는 lv=5를 위주로 해보자.
일단은 필터링에 'admin'에 싱글쿼터를 사용할 수 없으니 저번문제에서 풀었을 때 사용했었던 16진수로 admin이라는 문자열을 치환하도록 하자.
or, and 가 막혔긴 했지만 "||,&&" 특수기호 논리연산자로 바꿔 쓰면 된다.
참고로 lv=1,2,3,4에서는 and 연산자인 '&' 를 쓰면 문제가 해결된다.