Almon Dev

[Lord of SQL Injection] assassin 문제 풀이 본문

웹 해킹/Lord of SQLi

[Lord of SQL Injection] assassin 문제 풀이

Almon 2025. 4. 28. 01:20

assassin 문제 풀이

 

assassin 문제

 

문제 분석

 

 문제 목표

pw 파라미터를 삽입한 쿼리를 실행한 후 조회된 데이터베이스의 id가 admin 계정인 경우, solve("assassin") 함수가 실행됩니다. 이 함수는 문제를 성공적으로 풀었을 때 호출되는 것으로 보입니다. 따라서 이 문제의 목표는 admin 계정의 비밀번호를 탈취하는 것입니다.

$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");

 

 입력 제한

pw 파라미터에서 '(작은따옴표)를 필터링하여 문자열 탈출(SQL Injeciton 시도)을 방지하고 있습니다. 

if(preg_match('/\'/i', $_GET[pw])) exit("No Hack ~_~");

 

 취약점 분석

pw 파라미터 처리에서 '(작은따옴표)를 필터링하여 SQL Injection을 방지하였으나 비밀번호 인증 조건문에 like를 사용하여 %, _(언더바)와 같은 와일드카드를 이용하여 admin 계정의 비밀번호를 탐색할 수 있습니다.

와일드카드
% → 0개 이상의 모든 문자를 뜻합니다.
ex)

'1%' => 1,  12, 123, 1234, 134 등 1로 시작하는 모든 경우의 수입니다.
'%가%' =>  가수, 요가, 허가증 등 '가'가 포함된 모든 단어입니다.
_(언더바) → 임의의 1개 문자를 뜻합니다.
ex)
'_7' => 27, 37, 47 등 앞에 아무 문자 1개와 7인 단어입니다.

 

문제 풀이

 

1. Burp의 Intruder 기능을 이용하여 pw 파라미터에 페이로드 + % 문자를 삽입하여 요청을 반복하도록 설정합니다.

=> 페이로드는 키보드로 입력 가능한 모든 문자의 리스트입니다.

 

2. pw 파라미터에 9%를 삽입했을 때 Hello guest가 출력되는 것으로 비밀번호의 첫 번째 자릿수가 9인 것을 알 수 있습니다.

=> Hello admin이 아니라 guest인 이유는 fetch_array 함수가 데이터베이스 조회 결과 중 첫 번째 행의 값만 가져왔기 때문입니다.

 

3. pw 파라미터에 9 + 페이로드 + %를 삽입하여 요청을 반복하도록 설정합니다.

 

4. pw 파라미터에 90%를 삽입했을 때 Hello guest가 출력되는 것으로 비밀번호의 두 번째 자릿수가 0인 것을 알 수 있습니다.

 

5. pw 파라미터에 90 + 페이로드 + %를 삽입하여 요청을 반복하도록 설정합니다.

 

6. pw 파라미터에 902%를 삽입하면 Hello admin이 출력되는 것으로 pw 파라미터에 902%를 삽입했을 때 실행된 쿼리의 결과가 admin 계정인 것을 확인할 수 있습니다.

 

7. pw 파라미터에 902%를 삽입하여 문제풀이를 완료합니다.