php文件上传
文章目录
- 文件上传机制
- 文件上传脚本
- 文件上传绕过
- php后缀替换为空
- web服务器的解析漏洞绕过
- nginx
- iis
- apache
- 高级文件上传
- nginx自定义配置文件(默认三分钟刷新一次)
- 服务端内容检测
- 结合伪协议使用
- 配合日志包含
- 只允许图片上传
- 上传实战训练
文件上传机制
文件上传本质上是对服务器端的一个写操作
向服务器端上传的php文件会被放到\tmp\php???临时文件夹下,在脚本执行完后,临时文件夹中的文件会被销毁
文件上传脚本
脚本为html文件
<form action="index.php" enctype="multipart/form-data" method="post">
<input name="file" type="file" />
<input type="submit" value="upload"/>
</form>
文件上传绕过
php后缀替换为空
- 采用双写绕过:pphphp
web服务器的解析漏洞绕过
nginx
基于错误的nginx和php=fpm配置,当我们访问\shell.txt\1.php时,如果1.php不存在,服务器端就会按照php去解析shell.txt。利用这个特性,可以先上传shell.txt,再访问一个不存在的php文件
iis
如果iis版本为6.0,目录的后缀是a.php,那么目录中的文件就会按照php解析去执行
apache
上传多后缀时,apache会从后向前解析,直到自己能解析的后缀,比如test.php.lally,会被解析成test.php
高级文件上传
nginx自定义配置文件(默认三分钟刷新一次)
.user.ini
在配置文件使用auto_apppend_file=1.txt使所有文件包含1.txt,执行里面的php代码
任意找一个php文件,利用1.txt里的一句话木马执行php代码即可
服务端内容检测
如果服务端进行eval,$_POST,php等关键词的检测,首先使用二分法(删除部分内容)确定黑名单,再结合.user.ini和绕过策略进行绕过,如base64编码,使用$_REQUEST,$_COOKIE等超全局变量进行绕过
结合伪协议使用
auto_prepend_file=php://input
这样就可以在首页的php文件里使用伪协议了
配合日志包含
- 日志包含,就是通过将恶意代码通过user-agent等方式传入日志中,再包含日志,就会执行其中的php代码
日志文件默认路径
\var\log\nginx\access.log
注意代码一定不要写错,否则报错了就只能重置环境
只允许图片上传
通过XBM格式图片的特性绕过getimagesize函数检测
在配置文件中加入
#define hight100
#define width 100
就会把这个文件当成图片来处理,并且图片的高度和宽带为100,即完成了绕过,在语句后加入其他代码可正常执行
上传实战训练
显然只允许上传图片,用xmp的方法试一下,发现对后缀名有限制,必须是.png
那怎么办呢?看到提示,前台校验不可靠,意思就是说,在我们上传的时候,前端会做一个后缀名检测,如果是.png,才会发出数据包,在发出数据包后,将包拦截下来,后缀改回.php即可
成功绕过,接下来找flag即可
如果在后端加入了判断png后缀的逻辑,仅凭抓包更改后缀是绕不过去的,但是如果后端判断的逻辑不够严密(如采用黑名单只校验几个后缀),我们就可以把.user.ini这样的配置文件偷渡过去,在.user.ini里使用文件包含
抓包改后缀绕过前端检测
auto_prepend_file=1.png
配置文件中写入
在1.png中写入一句话木马,接着上传即可
我们继续看,如果后端的检测机制更厉害一点,能够检测到一句话木马中的一些关键词并过滤怎么办呢
先分析一下一句话木马
<?php eval($_POST[1]);?>
php是大概率被检测到的,可以换成短标记<?=或script标签
3和4需要php配置开启一些项,所以不一定能用
POST的替换策略在上文有详细说明
那么如果一句话木马在上传中被禁到用不了(比如把<禁用了),又该怎么办呢?答案是日志包含
\var\log\nginx\access.log
通过user-agent传入恶意代码并执行