Almon Dev

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

웹 해킹/Lord of SQLi

[Lord of SQL Injection] giant 문제 풀이

Almon 2025. 4. 24. 03:49

giant 문제 풀이

 

giant 문제

 

문제 분석

 

 문제 목표

solve("giant") 함수는 SQL 쿼리의 결과가 존재할 경우 실행됩니다. 따라서 이 문제의 목표는 shit 파라미터에 적절한 값을 삽입하여 쿼리가 실행되도록 만드는 것입니다.

$query = "select 1234 from{$_GET[shit]}prob_giant where 1"; 
echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
$result = @mysqli_fetch_array(mysqli_query($db,$query)); 
if($result[1234]) solve("giant");

 

 입력 제한

shit 파라미터가 1글자를 초과하거나, ' '(공백), \n(줄 바꿈), \r(캐리지 리턴), \t(탭)이 포함된 경우 exit 함수가 실행되어 PHP 코드의 실행이 중단됩니다.

if(strlen($_GET[shit])>1) exit("No Hack ~_~"); 
if(preg_match('/ |\n|\r|\t/i', $_GET[shit])) exit("HeHe");

 

 취약점 분석

shit 파라미터에 삽입한 값은 SQL 쿼리에 삽입되어 실행됩니다. 현재 SQL 쿼리는 select 1234 from{$_GET[shit]}prob_giant where 1 형태이며 shit 파라미터에 공백과 같이 키워드를 구분할 수 있는 값을 삽입하면 SQL 쿼리가 실행됩니다. 따라서 위에서 알아본 입력제한을 우회하여 SQL 쿼리가 실행되도록 하는 것이 문제의 핵심입니다.

우회방식
giant 문제와 같이 파라미터의 입력값을 블랙리스트 방식으로 필터링한 경우, 필터링되는 문자열을 알아낸다면, 그에 해당하는 같거나 비슷한 기능을 하는 다른 함수나 연산자를 사용하여 우회할 수 있습니다.
ex)
\v → 수직 탭
=> 프린터에서 수평 위치는 고정한 채 수직으로 한칸 내리는 제어 문자입니다.
=> 현대 대부분의 프로그램(터미널, 웹 브라우저 등)에서는 \v를 무시하거나 공백으로 처리합니다. 
\f → 폼 피드
=> 프린터에서 현재 페이지를 종료하고, 다음 페이지로 넘어가는 제어 문자입니다.
=> 현대 대부분의 프로그램(터미널, 웹 브라우저 등)에서는 \f를 무시하거나 공백으로 처리합니다. 

 

문제 풀이

 

1. shit 파라미터에 \v를 URL 인코딩한 값인 %0b를  삽입합니다.