Sqli 문제가 나왔다.
<?php
if($_GET['lv']){
$db = dbconnect();
$_GET['lv'] = addslashes($_GET['lv']);
$_GET['lv'] = str_replace(" ","",$_GET['lv']);
$_GET['lv'] = str_replace("/","",$_GET['lv']);
$_GET['lv'] = str_replace("*","",$_GET['lv']);
$_GET['lv'] = str_replace("%","",$_GET['lv']);
if(preg_match("/select|0x|limit|cash/i",$_GET['lv'])) exit();
$result = mysqli_fetch_array(mysqli_query($db,"select id,cash from chall46 where lv=$_GET[lv]"));
if($result){
echo("{$result['id']} information<br><br>money : {$result['cash']}");
if($result['id'] == "admin") solve(46);
}
}
?>
코드를 확인해보니, 입력값에 대한 검증이 몇가지 있었다.
입력값에 대한 검증
- addshlashes : ', ", \, NUL
- replace : 공백, /, *, %
- preg_match : select, 0x, limit, cash
위 검증을 우회하여, 쿼리문의 id 결과값을 admin으로 출력해야한다.
Sqli를 진행하기 전 어떤 데이터가 있는지 확인해봤다.
1~4번까지 데이터가 있었고, 그 이후에는 출력이 되지 않았다.
혹시 다른 ID를 SQL 함수로 admin을 만들 수 있지 않을까 했지만, 없는 것 같다.
확인을 끝냈으니, Sqli에 사용될 쿼리를 테스트하였다.
몇가지 방법을 시도 끝에 admin을 출력할 수 있었다.
하지만, 쿼리에 공백과 작음따음표가 있어서 이를 우회해야한다.
나는 공백 검증을 우회하기 위해 or
대신에 ||
를 사용하기로 했다.
작은 따음표는 Webhacking.kr 문제 풀이 중에 알아낸 Hex값을 넣으면 문자열로 반환되는 것처럼 Char 함수를 이용하기로 하였다.
Hex는 현재 preg_match에서 검증하고 있기 때문에 사용하지 않았다.
출력이 잘 되는 것을 볼 수 있다.
이를 서버로 보냈다.
Flag를 얻을 수 있었다.
'워게임 > webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] Old - 60 Write Up (0) | 2021.05.27 |
---|---|
[Webhacking.kr] Old - 49 Write Up (0) | 2021.05.27 |
[Webhacking.kr] Old - 11 Write Up (0) | 2021.05.27 |
[Webhacking.kr] Old - 7 Write Up (0) | 2021.05.26 |
[Webhacking.kr] Old - 5 Write Up (0) | 2021.05.25 |