klaus

[Lord of SQL Injection] nightmare 18번 (feat. 주석 필터링 우회) 본문

모의해킹/Wargame

[Lord of SQL Injection] nightmare 18번 (feat. 주석 필터링 우회)

klus! 2023. 1. 1. 15:08

0. 나이트메어

나무위키

1. 전체 소스 코드

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

 

2. 주요 코드 분석

1) preg_match함수를 통해 필터링되는 문자열

/Prob,  _, ., (, ), #, - 그리고 대소문자를 구분하지 않습니다.

 

2) strleng함수

입력되는 pw의 패이로드 값은 6Byte이하로 제한됩니다.

 

3) $query = "select id from prob_nightmare where pw=('{$_GET[pw]}') and id!='admin'";

[빨강] 부분을 주석처리하여 날려버리거나 [pw]를 True로 만들어 주면 문제 풀이가 가능합니다

 

 

3.Solve

')를 사용하여 pw부분을 닫아줘야한다는 점 그리고 solve하기 위해서는 어떤 id값이라도 가져온다면

즉, pw값을 넣고 주석처리를 하면 되는 문제로 보입니다.

[주석 필터링 우회 방법]

주석 처리 방법 설명 비고
-- 뒤에 반드시 공백이 있어야 정상적으로 주석처리가 됨 (한줄)  해당 문제에서는 필터링
# (URL %23) 공백 유무와 상관없이 주석처리 됨(한줄) 해당 문제에서는 필터링
/* 문자 */ /*사이에 문제열을 입력하여 해당 글자를 필터링*/ 사용 불가
;%00 세미클론(;), NULL값(%00) 문자 결합  사용 가능

앞 pw부분을 =0을 사용하여 참값으로 만들고 주석 처리하면  clear되는 것을 볼 수 있습니다.

스포주의!!

더보기

pw=')=0;%00

Comments