모의해킹/Wargame
[Lord of SQL Injection] assassin 15번
klus!
2022. 12. 22. 08:15
0. assassin
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=________ (8번) 사용했을 때 hello guest라는 문구가 나오는 것을 보아 pw의 길이는 8인 것을 알 수 있습니다.
그럼, pw를 하나씩 찾아보도록 하겠습니다.
스포주의!!
더보기
?pw=9%
?pw=90______
?pw=902_____
참고 :
https://coding-factory.tistory.com/114