什么是文件上传 文件上传是-个网站的常见功能,多用于上传照片、视频、文档等许多类型文件。 一般文件上传的流程如下: 1.前端选择文件,进行提交。 2.浏览器形成POST MultiPart报文发送到服务器。 3.服务器中间件接受到报文,解析后交给相关后端代码进行处理。 4.后端代码将上传的文件内容写入到临时文件中(PHP特有) 。 5.写入到文件中,文件名为提交的文件名或以一定规则生成的文件名。
当文件上传点未对.上传的文件进行严格的验证和过滤时,就容易造成任意文件.上传,包括上传动态文件(asp/php/jsp等等)。
如果上传的目标目录没有限制执行权限,导致所上传的动态文件(比如webshell) 可以正常执行并 且可以访问,即造成了文件上传漏洞。
总之,存在上传漏洞的必要条件是 ①存在上传点 ②可以上传动态文件 ③.上传目录有执行权限,并且.上传的文件可执行 ④可访问到上传的动态文件 Burp Suite的使用 Burp Suite是一个集成化的渗透测试工具,它集合了多种渗透测试组件,使我们自动化地或手工地能更好的完成对web应用的渗透测试和攻击。在渗透测试中,我们使用Burp Suite将使得测试工作变得更加容易和方便,即使在不需要娴熟的技巧的情况下,只有我们熟悉Burp Suite的使用,也使得渗透测试工作变得轻松和高效。
下载地址: https://portswigger.net/burp/
推荐配合插件SwitchyOmega使用,Chrome与Firefox均支持。 BurpSuite监听8080端口,如果使用了Tomcat/Squid- -类默认监听8080端口的软件,可以修改BurpSuite的监听端口。
前端检测绕过
客户端检测绕过 ①JavaScript检测:通过浏览器提交上传请求前,触发检测用JS脚本进行检测。 例如:普通的表单上传
②Flash AS脚本检测: . 上传用Flash中, 请选择个要强代通门上得面线提交上传请求前,触发检测用AS脚本进行检测。 例如: DZ的头像上传
③APP上传检测: 检测写在APP客户端代码中,或者所调用的HTML页面中
客户端检测一般只检测文件扩展名。 客户端进行的检测,可通过对客户端代码的一-些修改或直接拦截修改报文即可绕过,所以这种上传限制约等于没有。
前端JavaScript检测绕过 ①查看onchange、onsubmit等事件 onchange事件会在域的内容改变时发生。 onsubmit事件会在表单中的确认按钮被点击时发生,如下图示例。 ②删除掉相关事件中的检测函数
APP端BurpSuite抓包 APP端BurpSuite抓包(HTTPS抓包) ①将BurpSuite的代理端口监听IP设置为"All Interface" ②在wifi设置中将代理地址设置为burpip:8080 ③访问http://burpip:8080下载证书 ④(安卓) 将修改证书扩展名为.crt,设置->安全->凭据存储~>从SD卡安装,选择证书进行安装 ④(iOS)按照提示-路下一步安装 ⑤(iOS)进入设置->通用->关于本机->证书信任设置,将新添加的证书设置为信任
如果Android APP使用了证书校验,可以配合Xposed框架的JustTrustMe使用,iOS暂时没有办法。
Mumu模拟器打开Wifi配置的方法: adb connect 127.0.0.1:7555 adb shell am start -a android.settings.WIFl SETTINGS
服务器检测绕过
MIME类型检测绕过 MIME (Multipurpose Internet Mail Extensions)是描述消息内容类型的因特网标准。 MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。 浏览器会自动根据所上传的文件的扩展名,对应到相应的MIME类型上。
$uploaded type = $_ FILES[ 'upfile' ][ 'type' ];
if( ( $uploaded_type == "image/jpeg" | $uploadedt_type ==”image/png" || $uploaded type == "image/gif" ) ){
文件内容检测 1.简单文件头检测 文件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分。 文件头的起始部分中-般开头标记文件类型。 如gif的文件头为GIF89a或GIF87a。
2.完整文件结构检测 通过调用图像函数(如getimagesize/imagecreatefromgif/imagecreatefrompng) , 进行检测文 件是否为图像,需要文件内容保持相对完整,所以无法通过上种追加头部起始字节的方法进行绕过。
if( @imagecreatefromgif ($uploaded_tmp)) {
if (move_uploaded file($_FILES['upfile']['tmp_name'], $uploaddir . '/' . $_FILES['upfile']['name'])) {
echo '文件 上传成功,保存于:'. $uploaddir . $_FILES[ 'upfile' ]['name'] . "\n";
针对这种检测,可以将图片文件与欲上传的文件进行合并来绕过检测。 可通过copy命令进行文件合并。
合并后的文件只要未经过清洗或缩放等操作即可通过检测,并保持欲上传文件的完整
由于上传文件的图片部分在解析为PHP时会以乱码显示,建议与尽量小的图片文件进行合并,否则会有大量的乱码。
3.恶意文件内容检测 检测提交内容中是否包含Webshel等数据。 推荐使用强混淆的weevely进行尝试,Kali中自带。 https://github.com/sunge/Weevely
或者尝试开源的webshell收集项目: https://github.com/tennc/webshell
恶意文件内容检测,常见关键字 eval( base64 encode( assert( java.lang.Runtime java.lang.ProcessBuilder
一些小技巧 1.文件参数多filename属性 文件上传过程种,如果存在waf拦截-些扩展名,可以通过尝试多个filename属性
2.目录可控时,可以尝试使用目录穿越的方法(…/)
<Directory "D: /WWW/ichunqiu/up1oad/">
<FilesMatch "\. (?i :php Iphp3 |php4)$">
Order A1low, Deny
Deny from a11
</Fi1esMatch>
</Directory>
扩展名检测类型可控 1、可以从后台修改允许/禁止的扩展名类型 2、提交参数中存在允许/禁止的扩展名类型 3、前端单独抽出了文件扩展名进行了提交
解析漏洞
1.IIS/Nginx+PHP fastcgi取值错误解析漏洞(配置错误) 开启了cgi.fix_ pathinfo,如果开启以后,所执行文件不存在,会继续查找上一级文件是否存在。 并且未设置security.limit extensions,该选项限制可以执行的文件类型。
2.Nginx文件名逻辑漏洞(CVE-2013-4547) 影响版本: Nginx 0.8.41 ~ 1.4.3/ 1.5.0~ 1.5.7 上传一个以空格(%20) 为结尾的文件,例如" abcde.jpg " 当访问abcde.jpg%20%00.php时,会将刚刚. 上传的"abcde.jpg "文件,当做PHP进行执行。 abcde.jpg%20%00.php 一般的php匹配正则: .php$ 存在漏洞时,Nginx将abcde.jpg%20认当做了 脚本文件名
3.Apache解析漏洞(配置错误) 如果在Apache的conf文件中有如下配置 AddHandler application/x-httpd-php .php 则abcde.php.jpg也会被当做php去执行 如果在.htaccess中有如下配置,可以将扩展名.xx当做php执行 AddType application/x-httpd-php xxx
4.IIS 5.x/6.0解析漏洞 ①上传文件名: abcde.asp;jpg 服务器默认不解析;号后面的内容,因此abcde.asp;jpg被当做了 asp文件解析。 ②向xxx.asp目录下面.上传abcde.jpg 服务器会将xxx.asp目录下的文件都当做asp文件解析
文件上传高级利用
1.重绘图 应用调用图片库对.上传的文件进行了图像转换,所以即使将图片与文件合并,也会将尾部转换掉,无法使用前面所讲方法进行上传webshell ①将正常图片用目标使用的图形库进行转换 ②寻找转换前后两次未变的部分 ③将未变部分替换为欲上传的WebShell ④将替换后的文件进行图像转换,看是否转换后扔存在替换后部分 转换前: 12333333abcdefg[11111111233]sdas213
转换后: xsadssdsdsddssss[11111111233]2312443
2 PHPINFO与文件包含的利用 ①PHP在解析multipart/form-data请求时,会创建临时文件,并写入上传内容,脚本执行结束后即 删除 ②PHPINFO可以输出$_ FILES信息 ③通过多种方式争取时间,在临时文件删除前进行执行包含。
通过在数据报文中加入大量的垃圾数据,使PHPINFO页面过大,导致PHP输出进入流式输出,并不一次输出完毕。
通过大量请求来延迟PHP脚本的执行速度。
3.在线解压缩的利用 存在上传压缩包并解压的上传点,可使用如下方式利用。
将Webshell打包到压缩包中 模板上传处常用压缩包.上传后进行自动解压。部分此类有检测压缩包中内容的,可尝试建立目录进行压缩。使用目录穿越(…/)的方法向上一级目录进行上传。
存在上传压缩包并解压的上传点,可使用如下方式利用。 将文件软链接打包到压缩包中 文件软链接到/etc/passwd等文件,达到任意文件读取
|