Wargame/webhacking.kr

Challenge old 49 (300)

마띠(쥔장) 2019. 11. 5. 19:45

49번 SQL INJECTION 300점짜리 문제입니다

 

초기값으로 level: 1이라고 나와있어서 1부터 5까지 차례대로 제출을 눌러본 결과,

대충 level(1~4)값에 따라 저장된 값이 있는 것 같아요

 

php 소스를 보면

<?php
  if($_GET['lv']){
    $db = dbconnect();
    if(preg_match("/select|or|and|\(|\)|limit|,|\/|order|cash| |\t|\'|\"/i",$_GET['lv'])) exit("no hack");
    $result = mysqli_fetch_array(mysqli_query($db,"select id from chall49 where lv={$_GET['lv']}"));
    echo $result[0] ;
    if($result[0]=="admin") solve(49);
  }
?>

이래여..

 

preg_match()함수에서 lv input값에 필터링을 해주고 있어여.. 저거 우회해서 입력해야겠네요ㅠ

id lv
ltusy 1
udnrg 2
fvvcg 3
bzrbo 4
admin ?

chall49라는 테이블은 위와 같겠네요

select문에서, or id='admin'..을 넣어주면 풀릴 것 같아요..

0 대신 어느 숫자가 들어가도 무방합니다

근데 물론 이 방법은 될 리가 없고

 

이 중에서 일단, 

or이랑 공백이 필터링되니까 우회해서 다시 넣어볼게요!

or을 ||로 대체했슴다

그런데 여전히 필터링 된 값이 포함되어 있나봐요..

보이진 않지만 '싱글 쿼터'가 필터링 되어있는 듯한..?

 

구글링 끝에 앞에 0x를 붙이고 16진수값을 쓰면 그에 대응되는 문자열이 리턴된다는 정보를 얻었어여

오 그랬더니 바로 풀리네요!

이번 문제는, 0x가 필터링되지 않았다는 점을 이용해서, 문자열을 0x+16진수값으로 대입하는 것..!

728x90

'Wargame > webhacking.kr' 카테고리의 다른 글

Challenge old 1 (200)  (0) 2019.11.26
Challenge old 23 (300)  (0) 2019.11.12
Challenge old 27 (150)  (0) 2019.11.04
Challenge old 18 (100)  (0) 2019.11.02
Challenge old 54 (100)  (0) 2019.10.13