본문 바로가기

웹해킹/webhacking.kr

old-27 롸업(webhacking.kr)

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>

view-source로 확인한 코드이다.

if(preg_match("/#|select|\(| |limit|=|0x/i",$_GET['no']))

부분에서 입력한 값을 #, select, \, 공백, limit, =, 0x가 들어있는지 확인하고 대소문자를 구분하지 않고 검사한다.

union select로 하려고 했는데 못할거 같다.

like 절을 이용하면 된다.

like는 where조건절에서 주로 사용되고 부분적으로 일치하는 컬럼을 조회할 때 사용된다.

SELECT * FROM 테이블명 WHERE 컬럼명 LIKE 이런식으로 사용이 된다.

%like%이면 like가 포함된 모든 값을 찾고 

li_ 이런식으로 쓰면 li로 시작하는 3글자짜리 값을 조회한다.

 

코드에 친절하게 admin의 no값이 2라고 나와있다.

그래서 문제의 sql 구문에서 마지막 부분을 no=0) or no like 2-- 로 하면 된다.

#을 못쓰니 --로 뒤에 die를 주석 처리한다.

그리고 공백은 탭 문자인 %09로 바꿔서 url에 넣어주면 된다.

0)%09or%09no%09like%092%09--%09

이렇게 url에 넣어주면 된다.

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

old-33 롸업(webhacking.kr)  (0) 2023.12.08
old-32 롸업(webhacking.kr)  (0) 2023.12.08
old-26 롸업(webhacking.kr)  (0) 2023.12.07
old-25 롸업(webhacking.kr)  (0) 2023.12.07
old-24 롸업(webhacking.kr)  (0) 2023.12.06