old-18, SQL Injectinon 100점짜리 문제입니당
<?php
if($_GET['no']){
$db = dbconnect();
if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack");
$result = mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' and no=$_GET[no]")); // admin's no = 2
if($result['id']=="guest") echo "hi guest";
if($result['id']=="admin"){
solve(18);
echo "hi admin!";
}
}
?>
여기가 핵심 코드네여
chall18이라는 테이블?에서 no값을 받아 오는데요,
이렇게 생기지 않았을까여
id no
admin 2
guest ?
어쨌든 우리가 할 일은,
id가 guest로 고정되어 있을 때 admin에 대한 값으로 어떻게든 해서? admin 계정으로 풀면 되는 겁니당
preg_match 부분에서 여러가지를 필터링하고 보낸 쿼리에 필터링할 단어가 포함되면, exit 함수가 실행돼여
이 필터링을 잘 우회해서 풀어야 겠죠
select id from chall18 where id='guest' and no=$_GET[no]
이 부분을 건들면 뭐라도 될 것 같아요
일단 1이나 no라고 입력하면
hi guest 라는 문구가 뜹니다
select id from chall18 where id='guest' and no=$_GET[no]
이 부분을 건드리기로 했으니까,
admin의 no값인 2도 select되게 변형시켜 주면 됩니당
and 때문에 안되니까 바꿔서 or로!
no=0 or no=2
이런 식으로? 여기서 0 자리에는 1만 빼고 아무 값이나 들어가도 상관 없겠네요
하지만 이러면 no hack이라는 문구가 뜹니다
입력값에 필터링된 문자(공백 문자)가 포함돼 있어서 그래여
공백 문자 필터링을 우회하는 방법으로!
tab(%09), \n(%0a), \r(%0d), 주석(/* */), 괄호(), 더하기(+)
이런게 있어서..
0%0aor%0ano=2
'Wargame > webhacking.kr' 카테고리의 다른 글
Challenge old 49 (300) (0) | 2019.11.05 |
---|---|
Challenge old 27 (150) (0) | 2019.11.04 |
Challenge old 54 (100) (0) | 2019.10.13 |
Challenge old 39 (100) (0) | 2019.10.08 |
Challenge old 14 (100) (0) | 2019.10.01 |