문제페이지는 해당 페이지와 같다.
해당 페이지는 view-source 링크와 join 과 login 창이 존재한다.
먼저 소스 페이지를 확인해본다.
if($_POST['lid'] && isset($_POST['lphone'])){
$_POST['lid'] = addslashes($_POST['lid']);
$_POST['lphone'] = addslashes($_POST['lphone']);
$result = mysqli_fetch_array(mysqli_query($db,"select id,lv from chall59 where id='{$_POST['lid']}' and phone='{$_POST['lphone']}'"));
if($result['id']){
echo "id : {$result['id']}<br>lv : {$result['lv']}<br><br>";
if($result['lv'] == "admin"){
mysqli_query($db,"delete from chall59");
solve(59);
}
이 부분은 select 구문을 생성하는 걸로 보아 Login 하는 부분이고 생성된 쿼리문의 결과 값 중 lv 값이 admin 인 경우 해당 문제가 풀린다는 것을 알 수 있다.
if($_POST['id'] && isset($_POST['phone'])){
$_POST['id'] = addslashes($_POST['id']);
$_POST['phone'] = addslashes($_POST['phone']);
if(strlen($_POST['phone'])>=20) exit("Access Denied");
if(preg_match("/admin/i",$_POST['id'])) exit("Access Denied");
if(preg_match("/admin|0x|#|hex|char|ascii|ord|select/i",$_POST['phone'])) exit("Access Denied");
mysqli_query($db,"insert into chall59 values('{$_POST['id']}',{$_POST['phone']},'guest')");
}
이 부분은 insert 구문을 생성하는 것으로 보아 join 하는 부분이다. id 와 phone 값을 입력받아서 insert 하는데 이 때 고정된 값인 guest 도 insert 한다.
고정된 값인 guest 가 lv 값인 것으로 추정되고 이 값을 admin 이 되도록 하면 해당 문제가 풀린다.
lv 가 admin 이 되도록 join 을 먼저 해야 한다.
lv 값을 admin으로 변경하기 위해서는 순서상 phone 입력 값을 조작하여 가입해야한다.
phone 에 입력값에 admin/0x/#/hex/char/ascii/ord/select 을 필터링 시키기 때문에 다른 방법을 통해 우회해야 한다.
문자의 순서를 거꾸러 만들어 반환해주는 REVERSE() 함수를 이용하여 우회해본다.
id를 test로 입력하고 1, REVERSE("nimda"))-- 로 입력하여 가입한다.
그러면 phone 에 입력한 값이 20자가 넘어가 Access Denied 가 뜨면 가입이 실패된다.
그래서 id 를 nimda 로 입력하여 id 파라미터 값을 지정해주고 phone 에 nimda 값을 id 로 치환하여 넣어준다.
그러면 phone 입력값의 글자수도 만족했기 때문에 가입이 완료되고 해당 입력값을 통하여 Login 하면 해당 문제가 풀린다.
'프로젝트 > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] Challenge(old) 61번 문제 (0) | 2021.07.19 |
---|---|
[Webhacking.kr] Challenge(old) 60번 문제 (0) | 2021.07.19 |
[Webhacking.kr] Challenge(old) 54번 문제 (0) | 2021.07.19 |
[Webhacking.kr] Challenge(old) 53번 문제 (0) | 2021.07.19 |
[Webhacking.kr] Challenge(old) 49번 문제 (0) | 2021.07.19 |