728x90
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 |