프로젝트/Webhacking.kr

[Webhacking.kr] Challenge(old) 46번 문제

Uggjjini 2021. 7. 19. 11:36

문제페이지는 해당 페이지와 같다.

 

SQL INJECTION 문구와 level 을 입력하는 창에 1이 입력된 채로 존재하고 view-source 링크가 존재한다.

 

view-source 링크를 통해 해당 페이지의 소스코드를 확인한다.

 

 

$_GET['lv'] = addslashes($_GET['lv']);

 

addslashes() 함수는 문자열 안의 특수문자가 잘 인식되도록 역슬래쉬를 추가해주는 함수이다.

 

$_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();

 

공백 / * %  select 0x limit cash 가 대소문자 구분없이 필터링 된다.

 

$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);

 

id가 admin 인 경우 문제가 풀릴 거 같다.

 

쿼리문을 만들어  $result 에 넣고 id 부분이 admin 인 경우 해당 문제는 풀린다.

 

그렇기 때문에 GET 형식으로 받아오는 lv 파라미터의 값을 lv=1 and id='admin' 처럼 입력해야 한다.

 

addslashes() 때문에 따옴표를 이용한 공격이 불가하여 admin을 다른 방식으로 보내야되는데 hex 값은 필터링되기 때문에 char() 을 이용하여 우회한다.

 

공백 또한 필터링 되기 때문에 and 대신 && 을 넣어 입력해준다.

 

그렇게 입력창에 입력할 때에는 1&&id=char(97,100,109,105,110) 를 입력해주면 해당 문제가 풀린다.