웹/LOS

Lord of SQL Injection # troll

묘나 2021. 3. 13. 05:32
728x90
반응형
SMALL

쿼리문이다!

query : select id from prob_troll where id=''

 

php코드를 간단하게 분석해보쟈.

 

<?php  
  
include "./config.php"
  
login_chk(); 
  
$db dbconnect(); 
  if(
preg_match('/\'/i'$_GET[id])) exit("No Hack ~_~");

  if(preg_match("/admin/"$_GET[id])) exit("HeHe");

// 입력 받은 id 에서 문자를 필터링하고 있다.

이 필터링 조건들을 우회해 주어야 할 것으로 보인다.

-> 싱글 쿼터 ('), 문자열 'admin'


  
$query "select id from prob_troll where id='{$_GET[id]}'";
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>";
  
$result = @mysqli_fetch_array(mysqli_query($db,$query));
  if(
$result['id'] == 'admin'solve("troll");

// 문제의 해결 조건이다.

id가 'admin'이면 된다는데....분명 위에서는 'admin'이라는 문자열을 필터링 해주고 있었다!


  
highlight_file(__FILE__);
?>

 

 

여러가지 방법들이 떠올랐다..

 

가장 먼저 'admin'을 hex로 바꿔 입력하는 방법이 떠올랐지만 문제가 해결되지 않았다.

' 필터링으로 의해, 입력값이 무조건 문자열 형태로 변환되어 인식되기 때문인 것 같았다.

 

주석처리를 통해 해결하는 방법도 떠올려봤지만 귀찮을 것 같았다..

 

preg_match에서

preg_match('/\'/i', ) 이런식으로 뒤에  i를 붙여 쓰게 되면,

대/소문자를 구분하지 않게 된다.

반대로 이 i를 붙여 쓰지 않으면, 대/소문자를 구분하지 않는다.

 

이 문제의 preg_match의 경우는

'admin'과 'ADMIN'을 다르게 여긴다는 것이다.

이렇게 작성하면, preg_match 필터링을 우회할 수 있게 된다.

 

(굳이 모두 대문자로 쓰지 않고,

대/소문자를 섞어서 써 주어도 우회가 가능하다!)

 

그리고, 데이터베이스에서는 대/소문자를 구별 없이 인식하므로

문제를 해결 할 수 있다!

 

 

생각보다 간단하게 해결했다!

728x90
LIST