저장소
[webhacking.kr] 35번 풀이 본문
Webhacking.kr
Index Welcome Stranger! Chatting Notice(en) [2021-04-16] Score of old challenges has been adjusted to 1/10. For a while now, new challenges will be added "without" notice. [2020-08-12] Replace chat feature with Discord. Please do not cause inconvenience to
webhacking.kr
35번 문제를 선택하면 나오는 화면이다.
아무런 번호나 입력하면 Done 메시지가 출력된다.
view-source 통해 소스를 확인했다.
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 35</title>
<head>
<body>
<form method=get action=index.php>
phone : <input name=phone size=11 style=width:200px>
<input name=id type=hidden value=guest>
<input type=submit value='add'>
</form>
<?php
$db = dbconnect();
if($_GET['phone'] && $_GET['id']){
if(preg_match("/\*|\/|=|select|-|#|;/i",$_GET['phone'])) exit("no hack");
if(strlen($_GET['id']) > 5) exit("no hack");
if(preg_match("/admin/i",$_GET['id'])) exit("you are not admin");
mysqli_query($db,"insert into chall35(id,ip,phone) values('{$_GET['id']}','{$_SERVER['REMOTE_ADDR']}',{$_GET['phone']})") or die("query error");
echo "Done<br>";
}
$isAdmin = mysqli_fetch_array(mysqli_query($db,"select ip from chall35 where id='admin' and ip='{$_SERVER['REMOTE_ADDR']}'"));
if($isAdmin['ip'] == $_SERVER['REMOTE_ADDR']){
solve(35);
mysqli_query($db,"delete from chall35");
}
$phone_list = mysqli_query($db,"select * from chall35 where ip='{$_SERVER['REMOTE_ADDR']}'");
echo "<!--\n";
while($r = mysqli_fetch_array($phone_list)){
echo htmlentities($r['id'])." - ".$r['phone']."\n";
}
echo "-->\n";
?>
<br><a href=?view_source=1>view-source</a>
</body>
</html>
문제 풀이의 핵심이 되는 부분이 어디인지 확인했다.
$isAdmin = mysqli_fetch_array(mysqli_query($db,"select ip from chall35 where id='admin' and ip='{$_SERVER['REMOTE_ADDR']}'"));
if($isAdmin['ip'] == $_SERVER['REMOTE_ADDR']){
solve(35);
mysqli_query($db,"delete from chall35");
}
해당 부분이 35번을 푸는 조건이 쓰여있다.
id는 admin, ip의 자리에는 나의 아이피를 전달하도록 하고 있었다.
if($_GET['phone'] && $_GET['id']){
if(preg_match("/\*|\/|=|select|-|#|;/i",$_GET['phone'])) exit("no hack"); /* *, /, select, -, # 필터링 */
if(strlen($_GET['id']) > 5) exit("no hack"); /* 5글자 초과 제한 */
if(preg_match("/admin/i",$_GET['id'])) exit("you are not admin"); /* admin을 필터링 */
mysqli_query($db,"insert into chall35(id,ip,phone) values('{$_GET['id']}','{$_SERVER['REMOTE_ADDR']}',{$_GET['phone']})") or die("query error");
/* id, ip, phone 순서로 insert */
echo "Done<br>";
}
다만 admin이 필터링 조건에 존재하므로 주의해야한다.
일반적인 방법으로는 admin을 전달할 수 없다.
이럴 때 insert문을 활용하는 방법이 있다.
한번에 여러 개의 값을 전달할 수 있다.
입력 시 한 번에 입력 값을 여러 개 전달하도록
1), ('admin', '나의 ip주소', '1'
와 같이 입력해주면 문제가 풀린다. (id, ip, phone)의 순서를 고려해줘야 한다.
이때 각 1의 자리에는 임의의 숫자 아무거나 가능하고, 마지막 부분에는 소스에 괄호( ) )와 따옴표( " )가 있으므로 입력하지 않는다.
URL로 인코딩 되었을 때 위와 같다.
문제 풀이에 성공했다.
'IT > 웹 해킹' 카테고리의 다른 글
[webhacking.kr] 12번 풀이 (0) | 2021.08.23 |
---|---|
[webhacking.kr] 39번 풀이 (0) | 2021.08.23 |
[webhacking.kr] 3번 풀이 (0) | 2021.08.20 |
[webhacking.kr] 54번 풀이 (0) | 2021.08.13 |
[webhacking.kr] 34번 풀이 (0) | 2021.08.12 |
Comments