반응형

ID와 PHONE을 입력해 회원가입과 로그인하는 페이지가 보이고 소스보기가 있다.



<?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')");
  }
?>
<html><head><title>Challenge 59</title></head><body>
<form method=post>
<table border=1>
<tr><td></td><td>ID</td><td>PHONE</td><td></td></tr>
<tr><td>JOIN</td><td><input name=id></td><td><input name=phone></td><td><input type=submit></td></tr>
<tr><td>LOGIN</td><td><input name=lid></td><td><input name=lphone></td><td><input type=submit></td></tr>
</form>
<br>
<a href=./?view_source=1>view-source</a>
</body></html>


먼저 회원가입 부분은 id와 phone을 입력받아 POST 방식으로 전송하고 있으며  addslashes를 통해 싱글쿼터'를 필터링 하고 있으며 글자수 제한또한 걸려있다. 그외에 문자열을 우회할수 있는 0x,hex,char,ascii,ord와 select,#을 필터링 하고있다.그뒤 insert문에 넣는데 마지막 lv값은 'guest'로 고정되어있다.

로그인에서는 lid와 lphone을 입력받아 post방식으로 전송하며 싱글쿼터( ' )를 필터링 하며 lv가admin일때 성공하는 모습을 보여줄거같다.

먼저 로그인 부분에서 admin으로 접속하는걸 시도해 볼수 있을것이며 회원가입에 'guest' 부분을 'admin'으로 바꾸어 시도해 볼수 있을것이다.

( ' )를 우회하기 위해 a1%'를 이용해보자 회원가입 창을 통해 시도해본 결과 %a1'이 그대로 출력되는걸로 보아 ( ' )의 필터링을 우회하는건 어려워 보인다.

그렇다면 두번째 부분을 시도해보아야 하는데 역시 ( ' )가 필터링 되기때문에 일반적인 방법은 쉬워보이지 않는다. 

'를 쓰지않고 admin을 만들기 위해선 reverse()함수를 이용해야할거같다.

reverse()함수는 문자열을 뒤집어서 반환해준다.

이함수를 이용해 쿼리문을 조작해보면

id=nimda(admin을 뒤집음) phone=1,reverse(id));-- 이렇게 만들어 주면 될거같다.phone의 마지막 부분은 띄워준다.

이렇게 회원가입을 진행후 nimda/1로 접속해보면 성공!



반응형

'보안 > webhacking' 카테고리의 다른 글

webhacking.kr old-61  (0) 2019.12.10
webhacking.kr old-60  (0) 2019.12.09
webhacking.kr old-58  (0) 2019.12.09
webhacking.kr old-56  (1) 2019.12.08
webhacking.kr old-55  (0) 2019.12.08
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기