织梦网站tag自定义插件/sem代运营
一.原理:
攻击者利用服务器端没有对用户上传的文件进行正确的处理,导致攻击者可以向某个可通过 Web 访问的目录上传恶意文件,并且该文件可以被Web服务器解析执行。
move_uploaded_file(file,newloc):
• move_uploaded_file() 函数将上传的文件移动到新位置, 若成功,则返回 true,否则返回 false
1. 后缀绕过
部分服务仅根据后缀、上传时的信息或Magic Header来判断文件类型,此时可以绕过。
php由于历史原因,部分解释器可能支持符合正则 /ph(p[2-7]?|t(ml)?)/
的后缀,如 php / php5 / pht / phtml / shtml / pwml / phtm
等 可在禁止上传php文件时测试该类型。
jsp引擎则可能会解析 jspx / jspf / jspa / jsw / jsv / jtml
等后缀,
asp支持 asa / asax / cer / cdx / aspx / ascx / ashx / asmx / asp{80-90}
等后缀。
除了这些绕过,其他的后缀同样可能带来问题,如 vbs / asis / sh / reg / cgi / exe / dll / com / bat / pl / cfc / cfm / ini
等。
2. 系统命名绕过
在Windows系统中,上传 index.php. 会重命名为 . ,可以绕过后缀检查。 也可尝试 index.php%20 , index.php:1.jpg index.php::$DATA
等。 在Linux系统中,可以尝试上传名为 index.php/.
或 ./aa/../index.php/.
的文件
3 .user.ini
在php执行的过程中,除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)
。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。 .user.ini 中可以定义除了PHP_INI_SYSTEM以外的模式的选项,故可以使用 .user.ini 加上非php后缀的文件构造一个shell,比如 auto_prepend_file=01.gif
。
二.流程与攻击防御总结
三.上传攻击的条件
攻击者要想成功实施文件上传攻击,必须要满足以下四个条件:
1.网站有上传功能
2.上传的文件能够被Web服务器解析执行,特定的后缀名。并且存放上传文件的目录要有执行脚本的权限。
3.用户能够通过Web访问这个文件。如果文件上传后,不能通过Web访问,那么也不能成功实施攻击。
4.要知道文件上传到服务器后的存放路径和文件名称。
因为许多Web应用都会修改上传文件的文件名称,那么这时就需要结合其他漏洞去获取到这些信息。如果不知道上传文件的存放路径和文件名称,即使你上传了也无法访问。
四.上传检测绕过技术
1.客户端
a.javascript检测
客户端检测通常在上传页面里含有专门检测文件上传的javascript代码,在文件被上传之前进行检测,最常见的就是检测上传文件的文件类型和大小是否合法。
b.绕过方法
- 浏览器禁用JS
- 使用Web代理,抓取上传的表单数据,修改后缀
- 直接更改JS脚本,添加预期扩展名
- 删除onsubmit事件
2.服务端
(1)MIME防护
a.思路
这类检测方法通过检查http包的Content-Type字段中的值来判断上传文件是否合法。
b.绕过手段
由于通过验证MIME值,而Content-Type是由客户端浏览器自动生成的。即可抓包伪造.
- Http抓包后修改Content-Type类型
附上常用的MIMETYPE表
text/plain(纯文本)text/html(HTML文档)text/javascript(js代码)application/xhtml+xml(XHTML文档)image/gif(GIF图像)image/jpeg(JPEG图像)image/png(PNG图像)video/mpeg(MPEG动画)application/octet-stream(二进制数据)application/pdf(PDF文档)application/(编程语言) 该种语言的代码application/msword(Microsoft Word文件)message/rfc822(RFC 822形式)multipart/alternative(HTML邮件的HTML形式和纯文本形式,相同内容使用不同形式表示)application/x-www-form-urlencoded(POST方法提交的表单)multipart/form-data(POST提交时伴随文件上传的表单)
(2)服务端文件扩展名检测
a.思路
- 服务器接收上传信息后,校验文件名是否合法。
- 完全不信赖用户文件后缀名,重新给文件添加后缀名。
b.防御手段:
- 文件后缀重命名
- 白名单过滤
- 黑名单过滤
c.绕过
针对黑名单绕过:
- 多重测试过滤文件名(php、php4、php5、cer等)
- 大小写绕过(操作系统不区分后缀名大小写)【php、PHp、Php…】
- 特殊文件名构造(windows下)【在后缀处添加 '’ 、’. '如shell.php、shell.php.】
- %00截断(PHP 5.3.7之前)【如 shell.php .jpg】【jpg前面有空格】
上传页面进行转存时,之前文件名的空格会被当成终止符,导致之后被忽略。
针对白名单绕过
- 特殊文件名
- %00截断
针对文件重命名防护
- 如果文件名不随机,可能会有 %00截断、解析漏洞
(3)文件内容检测
a.思路
- 检测文件头来判断
- 调用API、函数加载文件进行测试。(图像的二次渲染)
- 检测上传文件是否为图像文件内容
b.防护手段
-
文件头判断
读取文件开头(10字节)判断文件真实类型 -
文件加载检测中的图像二次渲染
关键函数imagecreatefromjpeg从jpeg中生成新图片。 -
图像内容检测
getimagesize()函数,非图像无法读出信息。
c.绕过
- 文件头检测
修改文件头,对前20个字节进行替换,后面再插入一句话木马。
在要上传的文件的所有内容前添加 GIF89a,web会判断为gif类型
图片文件通常称作有幻数的头字节,我们来看一下几种图片文件的幻数:
-
JPG
FF D8 FF E0 00 10 4A 46 49 46
-
GIF
47 49 46 38 39 61(相当于文本的GIF89a)
-
PNG
89 50 4E 47
其他文件的头字节:
-
文件的二次渲染
1.数据二义性
2.对文件加载器进行溢出攻击 -
图像内容检测----------------对文件头处理
接下来我们可以之前讲过的本地包含文件漏洞原理来进行操作
我们可以利用include,我们在实际中需要对一些文件包含的点去进行测试,来找到include在哪个目录里,我们在测试中手动尝试一下就行
(4)竞争条件攻击
a.思路
一些网站上传逻辑是先上传,后删除。根据极短的时间差,完成攻击
五、文件解析攻击
1 .htaccess文件上传解析漏洞
a.思路
Apache中允许多站点解析,.htaccess可配置解析目标,如规定xxe后缀的文件以PHP解析。
b.绕过
有些服务器在上传认证时没有拦截.htaccess文件上传,就会造成恶意用户利用上传.htaccess文件解析漏洞,来绕过验证进行上传WEBShell,从而达到控制网站服务器的目的。
首先我们编写一个.htaccess文件。打开记事本,编写代码“AddType application/x-httpd-php .jpg”,然后点击文件选中另存为,编写文件名为.htaccess,选择保存类型为所有文件。然后将其进行上传。因为.htaccess是apache服务器中的一个配置文件,不在上传的文件的黑名单之内,所以.htaccess文件是可以上传成功。
六 、服务器解析漏洞
1.Apache解析漏洞
Apache早期版本,解析后缀test.php.x1.x2.x3时候,会从右到左开始判断,若x3非可识别后缀,再判断x2,直到找到可识别的后缀为止。
2.IIS解析漏洞攻击
a.IIS 6.0
1.目录名包含“.asp”,所有文件将按asp格式解析
2.文件名含“.asp”,优先按asp来解析。 **/xx.asp/xx.jpg ---- /xx.asp;.jpg
---- /xx.asp:.jpg【:.jpg 不被windows允许,会自动删:.jpg。剩下xx.asp】
**
本例中的知识点在于利用了IIS6.0目录路径检测解析,文件的名字为“1.php;yijuhua.jpg”,也同样会被IIS当作PHP文件来解析并执行
首先我们请求/1.php;yijuhua.jpg,然后服务器会从头部查找查找".“号,获得.php;yijuhua.jpg。接着查找到”;",有则内存截断,所以/1.php;yijuhua.jpg会当做/1.php进行解析。
- /xx.asa,/xx.cer,/xx.cdx 这几个后缀默认由 asp.dll来解析。
IIS6.0的解析漏洞有两个。一为目录解析漏洞,如果目录名中包含".asp"字符串,那么对于该目录下的所有文件都会以asp脚本执行,所以这一漏洞是针对IIS6.0/asp的情况。二是对于文件名中后缀为".asp;任意字符"的文件,在解析时将会忽略";"后面的任何字符,将文件以asp解析。
另外针对IIS7.0/7.5的情况,在对PHP解析时,对于任意文件名,只要在文件名后面追加字符串"/任意字符.php",那么IIS将会将该文件当做PHP处理,而实际上该漏洞是与php-cgi有关。
3.Nginx解析漏洞
Nginx的解析漏洞也有两个,对于任意文件名,可在其后面添加字符串"任意字符.php",这个漏洞与上面的IIS漏洞相同,另外一个便是对于任意文件名,可以在其后面添加%00.php,即可构成解析漏洞。
七.总结
八、防御总结
- 将文件上传目录设置为不可执行
- 判断文件类型
- 使用随机数修改文件名和文件路径
- 单独设置文件服务器的域名
九、服务器设置
限制Web Server对于特定类型文件的行为
导致文件上传漏洞的根本原因在于服务把用户上传的本应是数据的内容当作了代码,一般来说,用户上传的内容都会被存储到特定的一个文件夹下,比如我们很多人习惯于放在 ./upload/ 下面要防止数据被当作代码执行,我们可以限制web server对于特定文件夹的行为。
大多数服务端软件都可以支持用户对于特定类型文件的行为的自定义,以Apache为例:
在默认情况下,对与 .php文件Apache会当作代码来执行,对于 html,css,js文件,则会直接由HTTP Response交给客户端程序对于一些资源文件,比如txt,doc,rar等等,则也会以文件下载的方式传送的客户端。我们希望用户上传的东西仅仅当作资源和数据而不能当作代码
因此可以使用服务器程序的接口来进行限制
以Apache为例,我们可以利用 .htaccess 文件机制来对web server行为进行限制
在这里插一句,如果不是专门的文件下载目录,请务必关掉文件夹浏览的权限,以防止嗅探和可能的越权,也是使用.htaccess文件,在其中加上一句
Options All -Indexes
即可。
禁止脚本执行有多种方式可以实现,而且分别有不同的效果,我们分别来看一下
1.指定特定扩展名的文件的处理方式
原理是指定Response的Content-Type可以加上如下几行
AddType text/plain .pl .py .php
这种情况下,以上几种脚本文件会被当作纯文本来显示出来,你也可以换成其他的Content-Type
2.完全禁止特定扩展名的文件被访问
Options -ExecCGI
AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi`识别
在这种情况下,以上几种类型的文件被访问的时候,会返回403 Forbidden的错误
3.也可以强制web服务器对于特定文件类型的处理
第一条不同的是, 下面的方法直接强行让apache将文件识别为你指定的类型,而第一种是让浏览器
<FilesMatch "\.(php|pl|py|jsp|asp|htm|shtml|sh|cgi)$">ForceType text/plain</FilesMatch>
看代码就可以很明白的知道,符合上面正则的全部被认为是纯文本,也可以继续往里面加入其他类型。
4.只允许访问特定类型的文件
<Files ^(*.jpeg|*.jpg|*.png|*.gif)>order deny,allowdeny from all</Files>
在一个上传图片的文件夹下面,就可以加上这段代码,使得该文件夹里面只有图片扩展名的文件才可以被访问,其他类型都是拒绝访问。
这又是一个白名单的处理方案
永远记得,白名单是最有保障的安全措施
反制
可以通过 move_uploaded_file 函数把自己写的.htaccess 文件上传,覆盖掉服务器上的文件,来定义文件类型和执行权限如果做到了这一点,将获得相当大的权限。