文件上传漏洞
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务端命令的能力
文件上传后导致的常见问题有:
上传文件是病毒、木马文件,以诱骗用户或管理员下载执行
上传文件是钓鱼图片或者是包含了脚本的图片,被用于钓鱼和欺诈
上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码的执行
上传文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行为
php一句话木马
1 | <?php echo shell_exec($_GET['a']);?> |
shell_exec():通过环境执行命令,并且将完整的输出以字符串的方式返回
1 | <?php @eval($_POST['a']); ?> |
eval() 函数:把字符串作为PHP代码执行
执行a接收到的内容
如果是POST方法传参,在上传包含一句话木马的文件后(一般为php文件),用hackbar在Post data里写执行的命令的参数,点Execute执行。改变a的值可以返回我们想要得到的结果
例如:
a=phpinfo() 查看phpinfo
a=dir 列出目录
要注意Linux命令会与Windows命令有所区别
菜刀Cknife
在一句话木马文件上传后,将其上传到的位置作为url填入地址栏,菜刀连接成功即可取得网站权限
dvwa靶机测试
- 设置安全等级low,选择Upload
图一
- 上传木马文件,上传成功,返回出来一个的地址,该地址就是文件上传到的位置
图二
- 菜刀添加shell,修改变量名
图三
1 | <?php @eval($_POST['Cknife']);?> |
上述是我一句话木马的代码,所以地址框后的变量框中填Cknife
- 成功连接,获得网站权限
图四
绕过方法
前台脚本检测拓展名
原理:
在客户端还未向服务器发送消息时,就对本地文件进行检测判断上传的类型
绕过方法:
上传的时候发送符合要求的文件名使其成功通过本体文件的检测,之后用Burpsuit截包,修改回原来的.php文件,再forward发送至服务器
MIME类型检测
原理
通常是使用Content—Type检测文件类型
如图,在上传文件的过程中,客户端会向服务端发送一系列数据
其中Content-Type会被服务器检测,如果是白名单允许的,就可以上传成功
绕过方法
截包,直接对Content-Type进行修改,使其符合白名单
比如改为:image/gif或者image/jpg
JS检测上传文件
原理
上传文件时,对方使用JavaScript语句语法检测上传文件的合法性问题
绕过方法
- 本地浏览器禁用JS
- 截包修改
文件系统00截断
原理
文件系统读取到0x00时,会认为文件已经结束
绕过方法
截包抓取将【evil.php.jpg】后面的一个【.】换成【0x00】。在上传的时候,当文件系统读到【0x00】时,会认为文件已经结束,从而将【evil.php.jpg】的内容写入到【evil.php】中,从而达到攻击的目的
服务器端扩展名检测黑名单
原理
如果文件拓展名在检测黑名单中,则不允上传
绕过方法
截包,将evil.php改成evil.php.123,系统检测到的拓展名是.123,肯定不会再黑名单中,但Apache解析不了.123拓展名,会向前寻找可解析拓展名,这样就成功上传evil.php
其他方式
- 后缀名大小写绕过
- 双写后缀名绕过
- 特殊后缀名绕过
upload-labs-pass-11
利用一道例题加深记忆
1 | $is_upload = false; |
分析源码,首先会判断你上传文件的后缀名,必须符合jgp,jng,gif中的一个,再判断文件是否存在的路径,但其间有个操作会在你路径后面加很多乱七八糟的东西,所以需要利用到%00去截断
上传的文件名写成1.jpg, save_path改成../upload/1.php%00,最后保存下来的文件就是1.php
图一
不知道是配置问题还是靶场设置问题,这道题按照正确步骤却始终不能上传成功,这里先用网上的图代替,后面有空了再看看能不能解决这个问题