본문 바로가기
CTF, 워게임 문제 풀이/webhacking.kr

webhacking.kr 27번 문제 풀이

by secumark 2022. 8. 30.
728x90

 

오랜만에 SQL INJECTION 문제다.

 

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 27</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get action=index.php>
<input type=text name=no><input type=submit>
</form>
<?php
  if($_GET['no']){
  $db = dbconnect();
  if(preg_match("/#|select|\(| |limit|=|0x/i",$_GET['no'])) exit("no hack");
  $r=mysqli_fetch_array(mysqli_query($db,"select id from chall27 where id='guest' and no=({$_GET['no']})")) or die("query error");
  if($r['id']=="guest") echo("guest");
  if($r['id']=="admin") solve(27); // admin's no = 2
}
?>
<br><a href=?view_source=1>view-source</a>
</body>
</html>

코드는 다음과 같다.

id가 guest면 guest를, admin이면 문제가 풀린다. admin의 no는 2

이때 #, select, (,limit,=,0x,i는 필터링한다.

r변수는 select id from chall27 where id ='guest' and no ({$_GET['no']})")) 명령어를 실행하는데

이전 문제에서 비슷한 유형을 어떻게 풀었냐면, 

 

(TRUE AND FALSE) OR TRUE

현재 TRUE인게 id=guest, 그리고 no=가 false이면서 or no=2이면 됨

 

가볍게 적어보면

and no=-1 or no=2 이렇단 소린데 잘 보니 공백도 필터링하고 있다.

 

-1%09or%09no=2 이렇게 했는데 이것도 필터링 .. 왜냐하면 '='를 사용하면 안되기 때문이다.

여기서.. 또 실수한건.. false 부분을 적을 때 -1)하고 괄호를 닫아줘야하는데 까먹음..^^

 

참고로 url 창에 안 적고, 제출 폼에 입력하면 이렇게 이중 인코딩?이 된다

 

요로코롬..

그리고 맨 뒤에 주석 넣어주면 공백도.. 필요하단다. 몰랐다.. 꼭 익혀둬야지

728x90

댓글