WEB安全第二篇--用文件搞定服务器:任意文件上传、文件包含与任意目录文件遍历
最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件、底层安全、漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的payload技巧以便于备忘。不是大神、博客内容非常基础,如果真的有人看而且是大牛们,请不要喷我,欢迎指正我的错误(水平有限)。
一、文件上传:
1、这本身是一个功能,但是如果没做好,就成为一个大漏洞。本质:
对上传文件没有进行类型检查,没有做进一步处理,上传文件保存路径泄露,且可访问可执行。
2、文件payload部分:
文件:
(1)一句话小马
(2)大马
(3)其他配置文件.htaccess / crossdomain.xml等
3、上传文件的方式:
(1)直接上传
(2)绕过前端扩展名限制上传(firebug)
(3)绕过后端扩展名限制上传:
#Apache的:1.php.rax.rax.rax。
#lighttpd的:xx.jpg/xx.php。
#IIS的:1.asp;abc.jpg,1.jpg%00.asp。
#Nginx:1.jpg 访问的时候http://localhost/1.jpg/x.php 当版本低时,存在xx.jpg%00.php解析漏洞。
#低版本IIS 会将/asp/目录下的所有文件都按照asp解析,或者webdav目录下上传.txt move 成.asp#
其他手段:
#截断 1.php%00.jpg。
#转换大小写:1.PHP。
#修改文件类型对抗检查content-type。
#终极大招:使用copy a.gif /b + b.php /a c.php 构造包含恶意代码的正常类型文件。
4、防御:
(1)接受文件使用临时路径,然后转存、文件名更换为随机字符串。
(2)不泄露文件最终保存目录。
(3)使用没有解析漏洞的高版本服务器。
(4)严格限制上传扩展名--白名单机制。
(5)做文件类型mime-type检查,对图像文件做二次渲染。
二、文件包含:
1、本质:
当上传的文件不能直接被执行时,可以借助文件包含来搞定。什么是文件包含,其实就是编程中的文件或者包引入
2、分类:
(1)本地文件包含
(2)远程文件包含
3、PHP文件包含:
1 //All of these function: 2 /* 3 include() 4 include_once() 5 require() 6 require_once() 7 */ 8 <?php 9 include($_GET["file"]); 10 ?> 11 //http://localhost/include.php?file=phpinfo.php 12 /* 13 Remote -> allow_url_include = 1 & allow_url_fopen = 1 14 //http://localhost/include.php?file=//http://localhost/phpphpinfo.php 15 */ 16 //pgpinfo.txt: 17 <?php 18 phpinfo(); 19 ?>
4、JSP文件包含
1 //分为静态和动态: 2 //静态 3 <%@include file="page.txt"%> 4 //动态: 5 <%String pages = request.getParameter("file") %> 6 <jsp:include page="<%=pages>"></jsp:include> 7 //http://localhost/include.jsp?file=xxx.jsp
5、文件包含的利用:
(1)读取敏感信息:
#/etc/passwd
#/etc/shadow
#my.cnf\php.ini\httpd.conf\access_log等等
(2)远程包含shell小马(一句话)。
(3)配合访问上传的文件。
(4)使用封装协议,也就是说file参数后面可以是各种协议伪协议表示的文件。
(5)绕过waf和防火墙。
6、防御:
(1)包含文件白名单。
(2)用户输入过滤掉. / \ 和伪协议关键词。
(3)包含的文件不允许外部可控。
三、任意目录文件遍历:
1、原因:
web服务器配置不当,导致可以访问到web根目录(www目录)以外的文件,应该是绝对禁止的。且web程序设计没有对访问的目录做检查和限制。
2、比较容易发生的位置:
(1)下载类
(2)图片等文件显示类
3、检测:
(1)file = /etc/passwd 或者 C:/Users/
(2)file = ../../../../../../../../../../../../etc/passwd
(3)http://www.test.com/index/index.php/../../../../../../../../../etc/passwd
4、防御:
1、配置不能访问WEB根目录之外的项目。
2、对可以访问的文件放在一个资源文件夹下。
3、对用户输入的特殊字符例如.和/以及\进行过滤