目录
['PHP_SELF']、$_SERVER['SCRIPT_NAME'] 与 $_SERVER['REQUEST_URI']
RCE命令注入可参考:
[GXYCTF 2019]Ping Ping Ping
先输入127.0.0.1,ping成功了
ls查看根目录,发现flag.php与index.php文件
先cat查看一下index.php文件,用$IFS$9绕过空格
正则过滤了很多东西,包括.*f.*l.*a.*g.*
<?php
if(isset($_GET['ip'])){
$ip = $_GET['ip'];
if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
print_r($match);
print($ip);
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
}
else if(preg_match("/ /", $ip)){
die("fxck your space!");
}
else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
}
else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "<pre>";
print_r($a);
}
?>
内联执行
在linux系统中,反引号作为内联执行,输出查询结果的内容。
于是就可以使用cat$IFS$9`ls` 这个命令来输出ls里面的flag.php以及index.php中的内容。以得到flag。
[鹤城杯 2021]EasyP
先学习一下:
['PHP_SELF']、$_SERVER['SCRIPT_NAME'] 与 $_SERVER['REQUEST_URI']
_SERVER['PHP_SELF']、$_SERVER['SCRIPT_NAME'] 与 $_SERVER['REQUEST_URI'] 三者区别-CSDN博客
1.$_SERVER['PHP_SELF']:获取当前执行脚本的文件名(相对于网站根目录的路径及 PHP 程序名称。)
2.$_SERVER['SCRIPT_NAME']:获取相对于网站根目录的路径及 PHP 程序文件名称。
3.$_SERVER['REQUEST_URI']:获取当前URL的 路径地址。
e.g 有URL:http://www.baidu.com/php/flag.php/flag?a=11111
$_SERVER['PHP_SELF'] 得到:/php/flag.php/flag
$_SERVER['SCRIPT_NAME'] 得到:/php/flag.php
$_SERVER['REQUEST_URI'] 得到:/php/flag.php/flag?a=11111
POST传参了guess,并且(string)转换成了字符型
如果$guess等于$secret,回显一个名为$flag的变量的字符串(===强制类型)
1. $_SERVER['REQUEST_URI']:获取当前URL的 路径地址
$secret,$flag都不知道是哪来的,所以这一串代码没有什么用... ...看下面就行。
正则过滤了包含的文件名utils.php,
以及后面GTE传参的show_source
2. basename():删除从最后一个斜杠之前的所有内容
#输出4.txt basename /1/2/3/4.txt
3. $_SERVER['PHP_SELF']:
用于获取当前执行脚本的文件名,读取文件夹下的一个文件。
__FILE__
是一个魔术常量,它包含当前脚本的完整路径和文件名。
故 用show[source或show.source绕过正则show_source
由于basename() 显示最后一个斜杠 / 后的所有内容,所以用utils.php/啊(
只要在后面加个非ASCII码的东西就可以绕过)
绕过
最终payload为:
utils.php/啊?show[source=1