挖掘文件上传漏洞有哪些思路?
1,基础知识:
为了深入理解文件上传,我们必须了解上传属性、常见文件的结构、图形处理功能等等。
1)报文特征:
观察文件上传消息的特征:
头中的内容类型有两个特征:
1.multipart/form-data(表单的enctype属性,指定为二进制数据)
2 .边界字符串(用作区分POST数据的分隔符)
帖子内容有五个特点:
1.内容-处置:表单-数据
2.名称:输入表单名称
3 .文件名:文件名
4.Content-Type:定义文件的类型和网页的编码,决定浏览器以什么形式和编码读取这个文件;
5.边界:内容类型的值前面有两个-
2)常见的检查规则
现有常用的上传验证规则不外乎以下几类:
1.客户端javascript验证(后缀)
2.文件头内容类型字段检查(image/gif):带参数。
4.检查后缀:扩展名的黑/白列表
5.文件内容头检查:GIF89a
6.文件内容验证:文件信息,二次渲染
7.自定义规范检查
3)澄清
文件上传和文件解析是两个过程。即使我们上传了一个php文件,也被解析为图片。访问php文件时会显示“图片无法显示”。或者我们上传一个jpg文件,但是里面混了一个shell脚本,如果解析成php文件就会执行;或者上传地无法绕过检测只能上传jpg文件,但其他功能中有文件包含等其他功能,仍然可以成功执行。
让我们回到安全的本质。上传是“输入”,文件解析是“输出”。任何漏洞挖掘都需要结合输入和输出。
2、旁路技巧:
下面是一些实战中常用的绕过技术:
1)后缀黑名单
下列替换后缀也可以被解析为shell:
php:。phtml,。phpt,. php3,. php3p
asp:。aspx、asmx、ashx、web.config
perl:。pl,。pm,。cgi,。解放运动
jsp:。jspx,。jsw,。jsv,。jspf
Coldfusion:。cfm,。cfml,。cfc,。dbm
此外,它可以配合操作系统的文件命名规则:
。php。,.php空间,。php:1.jpg,。php::$DATA等。
带有这些后缀的文件,不规则符号后会被windows系统自动删除,只留下。php。
2)后缀白名单
除了组合各种服务器解析特性之外,还经常使用空字节注入。插入空字节值的原因是一些应用服务器脚本语言使用c/c++库来检查文件名和内容。在C/C ++中,一行以/00结尾,称为NullByte。所以只要解释器在字符串末尾看到一个空字节,就会停止读取,认为已经到了字符串末尾。
例如,我们将把Happy.jpg的名字改为Happy.phpA.jpg,然后上传文件,在打嗝中捕获请求,并切换到十六进制视图。在字符串视图中查找文件名。查看相应的十六进制表,将41('A ')替换为00(空字节)。结果字符串变成Happy.php(空)。jpeg。因为php解释器内部使用C语言库,在Happy.php之后会停止读取文件名,文件会保存为Happy.php。
另一种绕过白名单的方法是使用双后缀:shell.php.jpg。