klaus

[Lord of SQL Injection] assassin 15번 본문

모의해킹/Wargame

[Lord of SQL Injection] assassin 15번

klus! 2022. 12. 22. 08:15

0. assassin

http://www.gamejob.co.kr/community/gallery/view?Gallery_Stat=11&Idx=202021&mode=V

1. 전체 코드

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

 

2. 중요 코드 분석

if(preg_match('/\'/i', $_GET[pw])) exit("No Hack ~_~"); 
$query = "select id from prob_assassin where pw like '{$_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("assassin");

1) preg_match함수를 통해 필터링

- '

- 대소문자 구분하지 않음

2) query를 보면 pw를 like구문을 통해 입력(GET) 받아 처리합니다.

6)  입력받은 id값이 admin이면 solve

 

3. solve

 

이번 문제의 핵심은 like구문을 통해 레코드에서 admin을 찾는 문제입니다.

Like구문

SELECT * FROM [테이블명] WHERE LIKE [조건]
% 모든 문자
_ 문자 하나
A% A로 시작하는 모든 문자
%A A로 끝나는 모든 문자
%A% A를 포함하는 모든 문자
^A A로 시작하지 않는 모든 문자

예) PW 값이 1234라고 가정할 때,

like 1%

like_2%

like__3% or %3%

like___4% or %4와 같이 검색할 수 있습니다.

그럼 문제로 넘어가서 pw=%사용한다면

 

pw=% (모든 문자열)

 

그럼 _ 을 사용하여 pw의 레코드의 길이가 어떻게 되는지 보겠습니다.

pw=________ (8번) 사용했을 때 hello guest라는 문구가 나오는 것을 보아 pw의 길이는 8인 것을 알 수 있습니다.

그럼, pw를 하나씩 찾아보도록 하겠습니다.

 

스포주의!!

더보기

?pw=9%

?pw=90______

?pw=902_____

 

참고 : 

https://coding-factory.tistory.com/114

 

 

 

 

 

 

Comments