[WARGAME][webhacking.kr] old-27

jckim22·2022년 11월 19일
0

[WEBHACKING] STUDY (WARGAME)

목록 보기
85/114

아래는 서버 코드이다.

<?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파라미터에 value를 받아서 아래 정규식으로 검사한다.

그 후 다음 쿼리에 삽입한다.

select id from chall27 where id='guest' and no=({$_GET['no']})")) or die("query error")

그리고 id가 admin이 되면 solve를 해주는 형식이다.

먼저 아래처럼 no를 1로 했더닌 guest가 나왔다.
코드를 보니 admin의 no는 2라고 한다.

더 효율적인 인젝션 쿼리를 찾기 위해 아래처럼 만들었다.
그리고 (여기)에 이것저것 대입해보았다.

)괄호는 필터링이 되어있지 않았고
select문이 안되는 관계로 바로 where문의 like를 떠올렸다.
아래처럼 ) || no like 2 -- 로 공백은 %09로 우회하거나 주석으로도 우회 해봤지만 실패였다.
계속 쿼리는 전달되었지만 쿼리 에러가 났다.

아래처럼 해본 것이다.

select문을 써보려고 아래처럼 0b로 이진수로 우회도 해보았지만 여전히 쿼리에러만 떴다.
이번 문제에서는 첫 행의 row를 가져오는 것이 아니라 id를 가져오기 때문에 select admin은 안되겠겠거니 했다.


그래서 union으로 완성된 쿼리도 해보았는데 실패였다.
아래는 이진수로 문자 우회를 시도해본 시도들이다.

결국 다 쿼리에러 였다.

그렇게 결국 like문으로 돌아왔다.
이게 왜 안되는지 도무지 이해가 되지 않아서 ||를 or로도 바꾸어보았지만 여전히 쿼리 에러 였다.

그렇게 여러 시도를 하는 중 앞에 괄호 안에 임의의 숫자를 넣어줬더니 성공을 했다...
처음에 했던 시도가 맞았던 것이다.

결국 아래처럼 괄호안을 채웠어야 했다.

select id from chall27 where id='guest' and no=(2) or no like 2

후에 궁금증을 풀고 가고 싶어 더 알아보았더니
괄호 안에 아무 숫자도 없어서 쿼리 자체가 에러가 나서 뒤에 코드도 실행되지 않았던 것 같다.

근데 2) union select id from ~~~ where id = 2 -- 이건 왜 안되었는지 모르겠다.

profile
개발/보안

0개의 댓글