sql injection 문제다.
id, pw에 guest라고 적혀 있어서 그대로 제출 버튼을 눌렀는데, hi guest라고 뜬다.
소스코드를 보자.
<?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>
<?php로 시작하는 부분을 보자.
데이터베이스로 연결되는 것을 일단 확인할 수 있다.
if($result['id'] == "admin") solve(45); 그리고 이 부분을 잘 보면 id가 admin일때 문제가 풀리는거 같다.
하지만 admin, select, limit, pw, =, <, >, i를 사용하면 exit()를 하고 있다.
"select id from chall45 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')"
이 부분을 조작하면 된다.
참고로 addslashes는 ', ", \, null이 오면 백슬래시를 추가해준다.
그래서 sql 조작이 더 힘들어짐.
mb_convert_encoding는 처음보는거라 검색해봤는데 이 encoding에 취약점이 하나 존재한다고..! 바로 magic_quotes_gpc가 설정되어 있을 때 %a1 ~ %fe까지 아무거나 \앞에 붙으면 이걸 하나의 문자로 인식해버려서 우회가 가능하다고 한다.
예를 들어 id=%aa%27이면 %27이라고 인식함.
내가 원하는 답은 ' or id='admin'# 이다.
근데 지금 =도 우회해야 해서 이건 like로 적어주고..
%aa%27 or id like admin#
이런식으로 하면 되는데 admin도 우회해야하니까 .. 아스키코드로 바꿔보면
%61%64%6d%69%6e
%23은 #
%aa%27 or id like 0x61646d696e%23&pw=guest
mb_convert_encoding, 그리고 magic_quotes_gpc를 까먹지 말자.. 어려버라...
'CTF, 워게임 문제 풀이 > webhacking.kr' 카테고리의 다른 글
webhacking.kr 47번 문제 풀이 (0) | 2022.12.16 |
---|---|
webhacking.kr 46번 문제 (0) | 2022.12.14 |
webhacking.kr 44번 문제 (0) | 2022.12.10 |
webhacking.kr 43번 문제 (0) | 2022.12.10 |
webhacking.kr 42번 문제 (0) | 2022.11.26 |
댓글