🏆 2024

맛집 분야 크리에이터

🏆 2023

IT 분야 크리에이터

👩‍❤️‍👨 구독자 수

182

✒️ 게시글 수

0
https://tistory1.daumcdn.net/tistory/4631271/skin/images/blank.png 네이버블로그

🩷 방문자 추이

오늘

어제

전체

🏆 인기글 순위

티스토리 뷰

보안/Wargame

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

알 수 없는 사용자 2021. 8. 12. 01:27
728x90
반응형

$_GET[id]

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

 

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

그리고 id 파라미터의 입력값으로 '(작은따옴표)를 금지(필터링)하고 있습니다.

 

$_GET[id] = strtolower($_GET[id]);

그리고 입력받은 id 를 strtolower 함수로 인해 대문자가 있다면 소문자로 변환됩니다.

 

$_GET[id] = str_replace("admin","",$_GET[id]);

그리고 마지막으로 만약 id 파라미터에 admin 이라는 문자열이 올 경우 "" 즉 공백으로 치환합니다.

 

$query = "select id from prob_vampire 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("vampire");

query 변수에 위의 필터링 과정을 마친 결과값을 포함한 sql 구문이 대입됩니다. 그리고 해당 query 구문의 결과값으로 id가 admin 일 때 문제는 해결됩니다.

 

이 문제의 경우에는 문자열이 공백으로 replace 되는 특징을 활용해서 문제를 해결할 수 있습니다. 아래를 보시죠.

admadminin

해당 문자열의 경우 str_replace("admin", "", $_GET[id]) 함수를 만나서 어떻게 변환될까요? 아래와 같이 변환될 겁니다.

admin

위와 같이 마냥 금지어를 공백으로 치환한다고 해서 해결되는 것이 아닌 것을 알 수 있습니다. admin 이라는 문자열을 필터링하기 위해서 작성한 코드가 되려 또다른 admin 을 만들어버린 것이지요.

 

결론적으로 아래와 같은 URL을 전송하여 풀 수 있습니다.

https://los.rubiya.kr/chall/vampire_1.php?id=adadminmin

728x90
반응형
댓글