<?php
include "../../config.php";
if($_GET['view_source']) view_source();
$db = dbconnect();
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);
}
echo "<br><a href=./?view_source=1>view-source</a>";
exit();
}
}
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')");
}
?>
2코드를 보면 lid와 id, lphone과 phone을 구분하는데, 'l'이 붙은 쪽이 LOGIN 박스다.
또 phone은 20자 미만으로 제한하고, 각각 phone과 id에 필터링 되는 문자열들이 있다.
id, phone에 관한 if문에 insert into chall59가 있으니, JOIN 후 DB에 내가 쓴 레코드가 추가되는 듯하다.
먼저, ID=hello, PHONE=1234로 가입하고, 로그인했다.
guest 레벨이 출력되었다.
이 lv에 admin이 박히면 문제가 풀린다.
일단, 어떻게 해야 내가 lv변수를 조정할 수 있을지 확인할 필요가 있다.
mysqli_query($db,"insert into chall59 values('{$_POST['id']}',{$_POST['phone']},'guest')");
내가 입력한 쿼리가 DB 테이블에 insert되는 구문이다.
순서대로 id, phone에 내가 입력한 값이 'guest'라는 문자열과 함께 삽입된다. 이 'guest'가 lv의 값을 결정한다.
그럼 {$_POST['phone']}, 'guest')"); 부분을 조작해보자.
phone이 들어갈 곳에는 아무거나, 그 뒤에 ,admin);--을 추가하면 lv값을 조작할 수 있을 것 같다.
하지만 'admin'이라는 문자열이 필터링 되므로 우회가 필요하다.
자주 쓰는 char()를 사용해보자.
admin의 아스키코드는 자리별 각각 97, 100, 109, 105, 110이므로
char(97,100,109,105,110)으로 admin 문자열을 우회해보자.
PHONE은 최대 19자라는 것을 간과했닿
char()대신 replace()쓰고 싶었다.
1, replace('bdmin', 'b', 'a'); --
역시 19자 제한에 걸린다.
어떻게든 admin이라는 문자열을 만들어야 하기 때문에 char(), replace()대신 reverse()를 이용해봤다..
1,reverse('nimda')--
역시 19자 초과다.
20자 미만으로 reverse()를 사용하려면,
id나 phone을 'admin'의 반대인 'nimda'로 설정하고 그 반대를 lv에 넣어야 한다는 걸 깨달았다.
하지만, phone에 nimda,reverse(phone);--를 넣기엔 역시 19자를 초과했다.
그래서 id를 nimda로 설정하고 아래 값을 넣었다.
여기선 꼭 돼야 할 것 같은데.. 안됐다...
라업도 찾아보고 별짓을 다했는데도 실패했다.
Access Denied가 뜨는 것도 아니고 그냥 아무 창도 안떴다..
알고보니,
1, reverse(id))--가 아니라 1, reverse(id))-- 였다.
뒤에 공백이 필수다..!!
공백을 넣고 JOIN 후 LOGIN 하면
'Wargame > webhacking.kr' 카테고리의 다른 글
Challenge old 61 (200) (0) | 2020.02.18 |
---|---|
Challenge old 60 (300) (0) | 2020.02.18 |
Challenge old 58 (150) (0) | 2020.02.17 |
Challenge old 56 (250) (0) | 2020.02.11 |
Challenge old 53 (350) (0) | 2020.02.11 |