上传漏洞
0xx1 上传漏洞简介
如何确定web应用程序是否存在上传漏洞呢?比如,有些网站,用户可以上传自己的个性头像,即图片文件,但是文件上传时并没有做验证,导致用户可以上传任意文件,这就是上传漏洞
0xx2 解析漏洞
2.1 什么是解析漏洞?攻击者利用上传漏洞时,通常会与web容器的额解析漏洞配合使用,常见的web容器为iis nginx Apache tomcat,下面具体说下常见容器的解析漏洞。
2.2 iis的解析漏洞。iis6.0在解析文件时存在二个解析漏洞。一 当建立.asa,.asp格式的文件夹时,其目录下的任意文件都将被iis当做asp文件解析,比如,当建立一个test.asp文件夹,里面放有1.txt,1.txt里面的内容为<%=NOW()%>,然后在浏览器中访问时,则会把1.txt当做正常的.asp文件解析(本来是不解析.txt文件的)。 如图:这样就可以上传webshell,来获取自己想要的内容。二 当文件为*.asp;1.jpg时,iis6.0同样会以为asp脚本来执行。
2.3 Apache解析漏洞。Apache解析漏洞存在于1.x和2.x版本,Apache的解析漏洞为当上传一个名为1.php.rar包时,应为Apache不识别*.rar包,所以Apache继续上上一级读,知道读取到apache是别的格式时,才停止。其中1.php.rar中是正常的php。即Apache在解析文件时的原则是:当遇到不认识的扩展名时,将会从后向前解析,知道遇到认识的扩展名为止,如果都不认识,则直接显示其源码
如图:
mime type 这里只展示一线部分了:
2.4 可以说是php cgi的解析漏洞,也可以说的是nginx的锅。@[email protected]。比如当在浏览器中输入www.ldxbbs.cn/1.jpg/1.php时如图:,
注意:1.jpg是有php代码的图片,而/1.php是你在浏览器中输入www.ldxbbs.cn/1.jpg后随便添加的后缀名为php的。此时的1.jpg就会被当做php脚本解析的。这样,我们就可以上传有问题的图片,然后在url后面加上“/xxx.php”,就可以获得网站的webshell。《最终原因还是php解析时,遇到不存在的会继续向上解析。前提是cgi.fi:x_pathinfo开启》
0xx3 绕过上传漏洞
3.1 程序员在防止上传漏洞时,可以分为以下2种。
客户端检测:客户端使用JavaScript检测,在文件未上传时,就对文件进行验证。
服务器端验证:服务器端脚本一般会检测文件的mime类型,检测文件扩展名是否合法。
3.2 客户端检测,使用js对文件扩展名进行白名单验证,如果不是白名单的扩展名则不提交至服务器,代码如图:用php接受文件后,将文件重名名,然后放到本目录下。可以使用burpsite拦包 改名就能绕过前端验证。如图:
3.3 服务器端验证。 大体分为:白名单 黑名单 文件类型检测 文件重命名等操作。
黑名单过滤:即定义了一系列不安全的扩展名,服务器在接受文件后,与黑名单扩展名对比,如果发现一样的 则禁止上传 否 ok 代码如图:
绕过: 1 攻击者可以从黑名单中找到web开发人员忽略的扩展名 2 尝试大小写混用
白名单过滤:定义允许的上传的扩展名,当上传的文件扩展名和白名单的对应,则允许上传 否 不允许 代码如图:
绕过:和解析漏洞结合 具体问题具体解决,00*0阶段绕过 即通过burpsite抓包后,通过修改需要上传的文件的16进制的,比如上传的文件为1.php1.1.jpg 修改1.php1.1jpg的16进制代码 将.php1.中的第二个1的16进制改为0的16进制 即可
mime验证:mime类型用来设定某种扩展名文件的打开方式,当具有该扩展名的文件被访问时,浏览器就会自动使用指定的应用程序来打开。如GIF图片的mime为image/gif css的为mime text/css
大致代码如下:当然你上传个*.php文件 他的mime为application/php显然无法上传,用burpsite抓包之后修改content-Type的类型为服务器端设定的类型即可通过验证 如图:
目录验证:当文件上传时,通常允许用户将文件放到指定的目录中,如果指定的目录不存在 就新建 这样就出问题了,代码如图:
桡过:因为在html代码中有一个隐藏标签,这是文件上传时的默认路径,但是当我们吧value的值改为自己上传的一句话木马时,因为不存在 所以新建 所以目的达到了。即程序在接受到文件后,对目录判断,如果服务器不存在你的一句话木马的文件名 就会新建一个 然后把一句话写进去 如果web为iis6 则就会被解析,绕过暂时就不写了
0xx4 随后再补。。。。。。