源码
题目限制:
- webshell长度不超过35位
- 除了不包含字母数字,还不能包含
$
和_
这里使用php5来解决
可以围绕以下两点展开:
- shell下可以利用
.
来执行任意脚本 - Linux文件名支持用glob通配符代替
.
或者叫period,它的作用和source一样,就是用当前的shell执行一个文件中的命令。比如,当前运行的shell是bash,则. file
的意思就是用bash执行file文件中的命令
并且用. file
执行文件,是不需要file有x权限的
我们可以发送一个上传文件的POST包,此时PHP会将我们上传的文件保存在临时文件夹下,默认的文件名是/tmp/phpXXXXXX
由于执行该命令也需要用到字母,那此时可以用到glob通配符
1.*
可以代替0个及以上任意字符
2.?
可以代表1个任意字符
这是由于能够匹配上/???/?????????
这个通配符的文件有很多,如果先匹配到别的文件则会出现错误,导致整个流程停止,根本不会执行到我们上传的文件。
通过ASCII码表可得知,大写字母位于@
与[
之间
先创建一个文件(文件名要对上),测试
构造POC,执行任意命令
php生成临时文件名是随机的,最后一个字符不一定是大写字母
复现漏洞还需要用于存放shell命令的文件以及用于提交表单的html
这里把提交的表单数据复制过来
需要将request中的get改为post,因为get提交没有临时文件。这里post作为请求体,而code作为get传参,执行完后才会删除临时文件
code为
php
`?><?=`. +/???/????????[@-[]`;?>`
get传参需要url编码
第一个?>为闭合,+为空格编码
通过eval()执行反引号从而执行系统命令
在burpsuite中可以不转码
注意:这里的POST与GET参数是并行的
想要查看临时文件是否生成,可以用sleep()函数