티스토리 뷰

보안/Wargame

[Lord of SQLi] troll Writeup/문제풀이

돔돔이부하 2021. 8. 11. 21:11
728x90
반응형

$_GET[id]

PHP 소스코드 상으로는 id를 GET 파라미터로 받는다고 합니다.

 

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

그리고 id 파라미터에 '(작은따옴표)가 오면 필터링됩니다.

 

if(preg_match("/admin/", $_GET[id])) exit("HeHe");

또 id 파라미터에 admin 이라는 문자열이 오면 필터링됩니다.

 

$query = "select id from prob_troll where id='{$_GET[id]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id'] == 'admin') solve("troll");

query 변수에 GET 파라미터로 전달받은 id를 넣고, mysql에 query를 실행했을 때 결과로부터 id가 admin일 때 문제가 해결된다고 합니다.

 

이 문제의 핵심은 바로 두 번째 필터링하는 코드에서 admin 문자열의 대소문자 구분을 하고 있다는 것입니다. 쉽게 말해 admin 을 만약에 ADMIN이라고 입력했을 때 필터링에 걸리지 않는다는 말이죠.

 

만약 대소문자 구분을 안하게 정규식을 만드려면 아래와 같이 작성할 수 있겠습니다. i 가 빠짐으로서 커다란 취약점이 생긴 셈입니다.

if(preg_match("/admin/i", $_GET[id])) exit("HeHe");

 

결론적으로 URL에서 id 파라미터를 아래와 같이 한다면, 문제는 해결됩니다.

https://los.rubiya.kr/chall/troll_1.php?id=Admin
https://los.rubiya.kr/chall/troll_1.php?id=ADMIN

728x90
반응형
댓글