문제페이지는 해당 페이지와 같다.
페이지에는 SQL injection 문구와 입력창과 view-source 링크가 존재한다.
해당 문제는 SQL injection 공격을 이용하여 해결할 수 있을 것 같다.
입력창에 아무것도 입력하지 않고 제출 버튼을 누르면 URL 바뀌는 것을 볼 수 있다.
입력창에 입력한 정보가 index.php 파일의 no 파라미터 값에 저장된다는 것을 알 수 있다.
view-source 링크를 통하여 소스 코드를 확인한다.
하단의 php 부분을 중심으로 코드를 해석한다.
<?php
if($_GET['no']){
$db = dbconnect();
if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack");
$result = mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' and no=$_GET[no]")); // admin's no = 2
if($result['id']=="guest") echo "hi guest";
if($result['id']=="admin"){
solve(18);
echo "hi admin!";
}
}
?>
Get 방식으로 no 파라미터 값을 전달받아 db에 연결한다.
그리고 preg_match(정규표현식, 검색대상) 함수를 통하여 일치하면 "no hack" 라는 문구와 함께 종료된다.
만약 일치 하지 않는다면 연결한 db에서 하단의 SQL 쿼리문을 생성하여 그 결과 값을 배열 형태로 $result 변수에 저장한다.
admin의 no 파라미터의 값이 2라는 것을 주석을 통해 알려주고 있다.
최종 $result 변수의 값의 id 가 "guest"인 경우 "hi guest" 를 출력하고
최종 $result 변수의 값의 id 가 "admin"인 경우 해당 문제가 풀리고 "hi admin!" 이 출력된다.
mysqli_query() 함수에 의해 생성되는 SQL 쿼리문을 자세히 본다.
select id from chall18 where id='guest' and no=$_GET[no]
chall18 테이블에서 id는 'guest'이고 no 파라미터를 Get 방식으로 받아온 값인 부분의 데이터를 select 구문을 통해 가져오는 것을 확인 확인 할 수 있다.
고정되있는 id 값인 'guest'는 검색되지 않아야 하며, admin의 no 파라미터 값인 2를 이용하여 admin의 id 의 정보를 검색해야 한다.
그래서 Get 방식의 no 파라미터 값을 조작하여 하단의 SQL 쿼리문이 되도록 만들어야 한다.
select id from chall18 where id='guest' and no=-1 or no=2
where id = 'guest' and no= -1 // (거짓)
or
no=2 // (참)
no 파라미터 값을 조작하기 위해 입력창에 -1 or no=2 를 입력해서 no 파라미터 값이 2인 데이터만 불러들인다.
그런데 preg_match() 함수에 의해 |\/|\(|\)|\||&|select|from|0x/i 정규 표현식이 포함되면 "no hack" 라는 문구와 함께 종료된다.
(공백) | \/ | \( | \) | \| | & | select | from | 0x | /i |
공백 | 기호 / | 기호 ( | 기호 ) | 기호 | | & | select | from | 0x | 대소문자 구분 X |
입력창에 -1 or no=2 를 입력하면 공백이 포함되었기 때문에 "no hack" 문구가 뜨는 것이 확인된다.
공백을 우회하기 위해 공백 대신 tab을 사용한다.
tab은 입력창에서 사용할 수 없으므로 URL에서 index.php 의 no 파라미터 값을 직접 바꾸어준다.
단, tab은 URL 인코딩한 값인 %09로 입력한다.
해당 URL로 이동하면 문제가 해결되는 것을 확인할 수 있다.
'프로젝트 > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] Challenge(old) 20번 문제 (0) | 2021.07.07 |
---|---|
[Webhacking.kr] Challenge(old) 19번 문제 (0) | 2021.07.06 |
[Webhacking.kr] Challenge(old) 17번 문제 (0) | 2021.07.06 |
[Webhacking.kr] Challenge(old) 12번 문제 (0) | 2021.07.06 |
[Webhacking.kr] Challenge(old) 11번 문제 (0) | 2021.07.06 |