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
복사했습니다!