[LOS] darkelf

Yennytime·2023년 1월 13일
0

Lord of SQL Injection

목록 보기
4/20
post-thumbnail

<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect();  
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe"); 
  $query = "select id from prob_darkelf where id='guest' and pw='{$_GET[pw]}'"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id']) echo "<h2>Hello {$result[id]}</h2>"; 
  if($result['id'] == 'admin') solve("darkelf"); 
  highlight_file(__FILE__); 
?>

🔺 코드분석

  1. if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
    GET방식으로 pw를 받으며, pw에 prob, _, ., () 가 들어 있고, /i 대소문자가 구분 되지 않으면 필터링되서 No Hack ~_~ 이 출력된다.

  2. if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe");
    만약, or, and 이 있거나 /i 대소문자가 구분 되지 않으면 필터링되서 HeHe 가 출력된다.

  3. $query = "select id from prob_darkelf where id='guest' and pw='{$_GET[pw]}'";
    id=guest로 고정되며 pw가 쿼리문 안에 있는 것을 알 수 있다.

  4. if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
    만약 result 값이 id(guest) 일 때, "Hello (id)"가 출력

  5. if($result['id'] == 'admin') solve("darkelf");
    result 값이 admin과 같을 때 성공적으로 출력할 수 있다.


🔺 풀이 과정

  1. pw='||id='admin

논리 연산자 || (OR) 을 사용해 문제를 풀었다.

또 다른 방법은 && (AND) 를 사용할 수 있다.

  1. pw='||'1'='1'%26%26id='admin

&& (AND) 같은 경우, 특수문자를 사용할 수 없기 때문에 URL encoding이 된 %26%26을 사용해줘야 한다.

profile
It's Yennytime💙

0개의 댓글