문제페이지는 해당 페이지와 같다.
해당 페이지에는 view-source 링크만 존재한다.
해당 링크를 통해 소스 페이지를 확인해본다.
if(!$_GET['id']) $_GET['id']="guest";
Get 방식의 id 파라미터 값이 존재하지 않으면 guest로 지정한다.
$_GET['id'] = addslashes($_GET['id']);
if(preg_match("/\(|\)|select|from|,|by|\./i",$_GET['id'])) exit("Access Denied");
if(strlen($_GET['id'])>15) exit("Access Denied");
id 파라미터에 addslashes() 함수를 적용해 특수문자가 잘 인식되도록 역 슬래쉬를 추가해주고, ( ) select from , by . 가 존재하는 경우 대소문자 구분없이 필터링된다.
또한 id 파라미터 값이 15자 이상일 경우 Access Denied 문구를 출력한다.
$result = mysqli_fetch_array(mysqli_query($db,"select {$_GET['id']} from chall61 order by id desc limit 1"));
echo "<b>{$result['id']}</b><br>";
if($result['id'] == "admin") solve(61);
chall61 테이블에서 id 컬럼을 내림차순으로 정리한 것중 id의 첫번째 줄에서 1개를 가져오는 구문을 생성하여 그 결과의
id 파라미터 값이 admin 인경우 문제가 풀린다.
from 이 필터링 되기 때문에 'admin' from chall6 -- 을 넣어 뒤의 조건을 주석처리 시키는 공격은 불가능하다.
alias 기능을 사용하여 id 라는 별칭을 만들어 id=admin 를 선언하여 아래 구문과 같이 만들어 준다.
SELECT 'admin' as id from chall6 order by id desc limit 1
하지만 'admin' as id 로 입력하면 addslashes() 때문에 ' 가 인식을 못하기 때문에 admin 을 hex 값으로 고친다.
그리고 admin 대신 hex값을 사용하면 15자가 넘어가기 때문에 as 를 생략시켜 전송시킨다.
그러면 해당 문제가 풀리는 것을 확인할 수 있다.
'프로젝트 > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] Challenge(old) 58번 문제 (0) | 2021.07.19 |
---|---|
[Webhacking.kr] Challenge(old) 60번 문제 (0) | 2021.07.19 |
[Webhacking.kr] Challenge(old) 59번 문제 (0) | 2021.07.19 |
[Webhacking.kr] Challenge(old) 54번 문제 (0) | 2021.07.19 |
[Webhacking.kr] Challenge(old) 53번 문제 (0) | 2021.07.19 |