动态文件:具有交互性的文件
格式:.py .php 等与代码相关的文件,与后台进行交互
静态文件:不具有交互性的文件
格式:.jpg .txt .mp3(二进制流通过播放器所呈现的效果).html(将二进制流发送至用户端,浏览器对页面信息进行解析)
当静态文件当成动态文件同样会被执行,某些漏洞也会导致静态文件被执行
漏洞—动态文件:上传、找到路径调用
—静态文件:上传、找到路径、利用可执行的漏洞进行调用
我们在上网时经常会使用文件上传的功能,比如上传一个头像图片,上传一个文件,上传一个视频等等,我都知道这是一个正常的功能,但是大家有没有想过文件上传后,服务器是怎么处理或者解析这些文件的呢,如果服务器在处理这些上传文件的时候做的不够安全,就会导致安全事件的发生:比如,
上传web脚本文件让服务器执行
上传木马病毒文件诱导用户或者管理员下载
上传钓鱼文件
上传欺诈文件
要使得文件上传攻击能够成功,一般需要满足俩个要素:
一般而言文件上传遇到的检测技术:
客户端 javascript 检测 (通常为检测文件扩展名)
服务端 MIME 类型检测 (检测 Content-Type 内容)
服务端目录路径检测 (检测跟 path 参数相关的内容)
服务端文件扩展名检测 (检测跟文件 extension 相关的内容)
服务端文件内容检测 (检测内容是否合法或含有恶意代码)
这类检测通常在上传页面里含有专门检测文件上传的 javascript 代码最常见的就是检测扩展名是否合法,这类绕过很简单。
做法:制作webshell文件(比如shell.php)—>修改为合法扩展名(shell.png)—>burp拦截改为(shell.php) —>上传
该检测是在服务器上进行,主要检查的是content-type类型值(白名单或者黑名单)。当然这个绕过也简单。
做法:制作webshell文件(比如shell.php,Content-Type: text/plain)—>burp拦截改为(sontent-Type: image/gif) —>上传
该检测是在服务器上进行,一般就检测路径是否合法,但稍微特殊一点的都没有防御。
比如,shell.php.[\0].png [\0]就是0x00是php,c语言的截断符,就是说服务器在读文件的时候读到shell.php碰到【\0】就截止了当做shell.php执行了。
类似还有post提交文件shell.php%00.png
顾名思义就是检查文件扩展名,一般通过白黑名单防御。
黑名单
比如扩展名不能包含 html、php、php3,php4,asp、exe、bat、jsp
文件名大小写绕过用像 AsP,pHp 之类的文件名绕过黑名单检测
名单列表绕过用黑名单里没有的名单进行攻击,比如黑名单里没有 asa 或 cer 之类
特殊文件名绕过
比如发送的 http 包里把文件名改成 test.asp. 或 test.asp_(下划线为空格),这种命名方式在 windows 系统里是不被允许的,所以需要在 burp 之类里进行修改,然后绕过验证后,会被 windows 系统自动去掉后面的点和空格,但要注意 Unix/Linux 系统没有这个特性。
.htaccess 文件攻击
配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过各种检测
解析调用/漏洞绕过这类漏洞直接配合上传一个代码注入过的非黑名单文件即可,再利用解析调用/漏洞
白名单检测
白名单相对来说比黑名单安全一些,但也不见得就绝对安全了
用像 test.php%00.jpg 的方式进行截断,属于白名单文件,再利用服务端代码的检测逻辑漏洞进行攻击,目前我只遇到过 php 的程序有这种漏洞
解析调用/漏洞绕过这类漏洞直接配合上传一个代码注入过的白名单文件即可,再利用解析调用/漏洞
.htaccess 文件攻击
在 PHP manual 中提到了下面一段话
move_uploaded_file section, there is a warning which states
‘If the destination file already exists, it will be overwritten.’
如果 PHP 安全没配置好就可以通过 move_uploaded_file 函数把自己写的.htaccess 文件覆盖掉服务器上的这样就能任意定义解析名单了
如果文件内容检测设置得比较严格,那么上传攻击将变得非常困难也可以说它是在代码层检测的最后一道关卡如果它被突破了,就算没有代码层的漏洞也给后面利用应用层的解析漏洞带来了机会。
主要是检测文件内容开始处的文件幻数,比如:要绕过 jpg Value = FF D8 FF E0 00 10 4A 46 49 46。
要绕过 gif 文件幻数检测 Value = 47 49 46 38 39 61
要绕过 png 文件幻数检测 Value = 89 50 4E 47
图像文件相关信息检测常用的就是 getimagesize()函数只需要把文件头部分伪造好就 ok 了,就是在幻数的基础上还加了一些文件信息有点像下面的结构
GIF89a
(...some binary data for image...)
(... skipping the rest of binary data ...)
这个是最变态的检测了,一般是调用 API 或函数去进行文件加载测试常见的是图像渲染测试,再变态点的甚至是进行二次渲染,对渲染/加载测试的攻击方式是代码注入绕过对二次渲染的攻击方式是攻击文件加载器自身。