워게임
Lord of SQL Injection - 15번 문제풀이
풉키홍키
2023. 1. 24. 23:13
[15번 문제 - assassin]
1
2
3
4
5
6
7
8
9
10
11
12
|
<?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__);
?>
|
cs |
이번 문제 핵심은 like 문법을 이용한 와일드카드 문제이다.
SQL 인젝션 관점에서 like 문법은 '%'는 어떠한 문자가 여러개 들어간다는 것을 알려주고, '_' 는 어떤 한 문자가 들어간다는 것을 알려준다.
즉, '_' 를 통해서 비밀번호가 몇 글자인지 알아낼 수 있으며, 무작위로 문자를 대입할 때 %를 이용해서 어떤 글자가 비밀번호인지 알아낼 수 있다.
이런 특성을 이용해서 비밀번호를 유추하는 방법은 pw 파라미터에 'N%' (N은 임의의 한 문자)를 무작위로 대입해서 비밀번호의 첫 글자를 알아 낼 수 있다. 이 방법으로 진행했을때 '9%'에서 Hello guest 문자열이 화면에 출력되는데 다른 어떤 글자를 입력해도 Hello admin은 나타나지 않는다. 이런 경우엔 비밀번호 첫 글자가 guest와 admin이 동일하다는 것을 알 수 있다. 해당 방법으로 계속해서 진행하면 두 번째도 guest와 admin이 동일한 글자가 나오고 세 번째 글자에서 admin을 확인할 수 있을 것이다.
내가 풀었을때는 Burp Suite를 리피터를 이용해서 임의의 숫자들을 먼저 넣어보고 풀었는데, 운이 좋게도 비밀번호 앞의 세 자리가 모두 숫자여서 금방 풀어낼 수 있었다. 귀찮다면 파이썬으로 코드를 짜서 푸는것도 괜찮을 거 같다.
[문제 풀이 구문]
https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php?pw=902%