Almon Dev

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

웹 해킹/Lord of SQLi

[Lord of SQL Injection] dragon 문제 풀이

Almon 2025. 5. 10. 01:59

 dragon 문제 풀이

 

dragon 문제

 

문제 분석

 

 문제 목표

쿼리 결과의 id가 admin인 경우 solve("dargon") 함수가 실행됩니다. 이 함수는 문제를 성공적으로 해결했을 때 호출되는 것으로 보이므로,  이 문제는 pw 파라미터에 적절한 값을 삽입하여 쿼리 결과의 id가 admin이 되도록 마드는 것이 목표니다.

$query = "select id from prob_dragon where id='guest'# and pw='{$_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("dragon");

 

 입력 제한

dargon 문제에서는 pw 파라미터에 대한 별다른 필터링은 존재하지 않지만, 해당 파라미터의 값이 # 뒤에 삽입되어 주석 처리됩니다.

if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
$query = "select id from prob_dragon where id='guest'# and pw='{$_GET[pw]}'";

 

 취약점 분석

pw 파라미터의 값은 주석으로 삽입되지만, #은 한 줄 주석을 의미하기 때문에 개행 문자(\n)를 삽입하면 SQL 쿼리의 구조를 변경할 수 있습니다.

\n => 개행문자를 의미합니다.
ex)
"1\n2" => "1
2"

 

문제 풀이

 

1. 개행문자와 함께 1=2 거짓 쿼리를 삽입하여 SQL 쿼리의 구조가 변경된 것을 확인합니다.

=> %0A는 개행문자인 \n을 URL 인코딩 한 값입니다.

 

2. 참 쿼리를 삽입하여 거짓 쿼리와 결과가 다른 것을 확인합니다.

 

3. UNION SELECT 문을 삽입하여 쿼리의 결과가 admin이 되도록 합니다.

본래는 참과 거짓의 결과가 다른 점을 이용해 Blind SQL Injection을 하고자 하였으나, 쿼리의 결과가 admin이기만 하면 된다는 생각에 더 쉬운 방식인 UNION SQL Injection을 이용했습니다.