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 |