Wargame/webhacking.kr

Challenge old 18 (100)

마띠(쥔장) 2019. 11. 2. 18:37

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

 

 

728x90

'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