基础#
tip: PHPversion <8.0#
源代码:
<?php
highlight_file(__FILE__);
error_reporting(0);
$var = $_REQUEST['D T.'];
var_dump($_REQUEST);
echo '</br>';
echo phpversion();
可以看见这里做了一个传参,参数名为D T.
我们可以试一下传参.
号做了转义变成了_
同样的我们举例子·
<?php
highlight_file(__FILE__);
error_reporting(0);
$var = $_REQUEST['D_T.'];
var_dump($_REQUEST);
echo '</br>';
echo phpversion();
明显可以知道,我们无法传入我们需要的参数
那么此时要用到一个phpversion<8的特性:当传入的参数中含有[
时,[
会被转义成_
但是后面的参数就不会被转义
也就是说
分析#
首先,从php官网查看
可以看见这里对转义写的很明白了
所以我们在php8中可以预见
示例#
<?php
highlight_file(__FILE__);
error_reporting(0);
$query = $_SERVER['QUERY_STRING'];
if (preg_match('/_|%5f|\.|%2E/i', $query)){
die('you are a hacker!');
}
$var = $_REQUEST['D_T_'];
var_dump($_REQUEST);
echo '</br>';
echo phpversion();
这时候,需要你去传入D_T_这个参数,这个时候可以看见
$query = $_SERVER[‘QUERY_STRING’];
对传入的参数也做了限制,无法直接传入_
所以我们就可以利用php的特性
简单的举个CTF中的例子
<?php
highlight_file(__FILE__);
error_reporting(0);
$query = $_SERVER['QUERY_STRING'];
if (preg_match('/_|%5f|\.|%2E/i', $query)){
die('you are a hacker!');
}
$var = $_REQUEST['D_T.'];
$b = $_GET['b'];
var_dump($_REQUEST);
if(is_null($var)){
eval($b);
}else{
echo '没有成功!';
}
echo '</br>';
echo phpversion();
所以我们的playload就是http://127.0.0.1/1/1.php?D T[=1&b=phpinfo();