精华内容
下载资源
问答
  • GO语言学习——用beego框架搭建WEB安全小系统(5)跨目录上传文件漏洞

    跨目录上传文件漏洞

    • 攻击原理
      绝对路径名或者相对路径名中可能会包含文件链接(例如:软链接、硬链接、快捷方式、影子文件、别名等),或者包含特殊字符(例如:.与…),这使得验证文件路径变得困难;同时还有很多操作系统和文件系统相关的命名约定,也增加了验证文件路径的困难。

    • 攻击影响
      若不对文件路径进行验证,攻击者便可以在任意目录上传任意文件,或者利用目录遍历、等价路径等方式,读取/修改系统重要数据文件,对系统进行攻击。

    • 防范措施
      当文件路径来自非信任域时,在文件操作之前必须对文件路径进行验证,而对文件路径标准化使得验证文件路径简单起来。

    添加代码

    views部分

    views 文件夹里新建一个File,命名为FileController.tpl ,添加如下代码(即在body标签里添加两个表单,各放一个input 表示要上传的文件):

    <div class="postform">
        <p> 文件上传 </p>
        <form enctype="multipart/form-data" action="http://127.0.0.1:8080/problems/FileUpload" method="post">
            <input type="file" name="uploadname" />
            <input type="submit">
        </form>
        <br><br><br><br>
        <p> 文件上传防范 </p>
        <form enctype="multipart/form-data" action="http://127.0.0.1:8080/problems/SafeFileUpload" method="post">
            <input type="file" name="uploadname" />
            <input type="submit">
        </form>
    </div>
    

    controllers部分

    controllers 文件夹里新建一个go文件,命名为FileController.go ,添加如下代码(老惯例,仍然是声明了两个对比的控制器,并分别重写了GetPost函数):

    package controllers
    
    import (
    	"log"
    		"fmt"
    		"github.com/astaxie/beego"
    	"path/filepath"
    	"regexp"
    )
    
    // 文件上传问题
    type FileController struct {
    	beego.Controller
    }
    
    func (c *FileController) Get() {
    	c.TplName = "FileController.tpl"
    }
    
    // 上传文件的post请求处理
    func (c *FileController) Post() {
    	c.TplName = "FileController.tpl"
    	if c.Ctx.Request.MultipartForm.File["uploadname"] == nil {
    		fmt.Println("哈哈,我很健壮")
    		return
    	}
    	// 获取控制器数据流里的文件
    	f, h, err := c.GetFile("uploadname")
    	if err != nil {
    		log.Fatal("getfile err ", err)
    	} else {
    		// 保存位置在 static/upload, 没有文件夹要先创建,不然文件保存失败
    		// 不限制文件类型,但是存在跨目录上传漏洞 ../
    		fmt.Println("uploadname", "static/upload/" + h.Filename)
    		c.SaveToFile("uploadname", "static/upload/" + h.Filename)
    	}
    	defer f.Close()
    }
    
    // 文件上传问题防范
    type SafeFileController struct {
    	beego.Controller
    }
    
    func (c *SafeFileController) Get() {
    	c.TplName = "FileController.tpl"
    }
    
    /**
    * 验证文件路径是否在安全目录pattern下
    */
    func validate(path string, pattern string) bool {
    	relpath, err := filepath.Abs(path) /** 【修改】对文件路径进行标准化 **/
    	if err != nil {
    		fmt.Println("It's error when converted to an absolute path.")
    		return false
    	}
    	fmt.Println(relpath)
    	reg := regexp.MustCompile(pattern)
    	/**【修改】对标准化后的路径进行正则匹配,确保在安全目录下 **/
    	return reg.MatchString(relpath)
    }
    
    // ../a.php,abc\a.php,
    func (c *SafeFileController) Post() {
    	c.TplName = "FileController.tpl"
    	if c.Ctx.Request.MultipartForm.File["uploadname"] == nil {
    		fmt.Println("哈哈,我很健壮")
    		return
    	}
    	// 获取控制器数据流里的文件,不限制文件类型
    	f, h, err := c.GetFile("uploadname")
    	if err != nil {
    		log.Fatal("getfile err ", err)
    	} else {
    		// 保存位置在 static/upload, 没有文件夹要先创建,不然文件保存失败
    		pathSrc := "static/upload/" + h.Filename
    		// 正则匹配,\表转义
    		pattern := `\\static\\upload\\`
    		// 验证文件是否在安全路径下
    		if !validate(pathSrc, pattern) {
    			fmt.Println("file not in security directory.")
    			return
    		}
    		c.SaveToFile("uploadname", pathSrc)
    	}
    	defer f.Close()
    }
    

    routers部分

    routers/router.go 文件添加如下代码(即为上述两个控制器注册路由):

    // 文件上传问题
    beego.Router("/problems/FileUpload", &controllers.FileController{})
    beego.Router("/problems/SafeFileUpload", &controllers.SafeFileController{})
    

    这样,无论url是访问/problems/FileUpload 还是/problems/SafeFileUpload,两种Get请求都能正确渲染FileController.tpl这个页面,然后当从表单发送Post请求时,一个表单会发送至FileControllerPost函数响应并处理,而另一个表单会发送至SafeFileControllerPost函数响应并处理。

    进行实验

    在浏览器中输入http://127.0.0.1:8080/problems/FileUpload
    这里写图片描述

    正常情况

    在“文件上传”的表单里选择任意文件并提交上传:
    这里写图片描述

    后台显示如下:
    这里写图片描述

    上传成功。

    跨目录上传

    使用burpsuite软件监听抓包
    在“文件上传”的表单里选择任意文件并提交上传:
    这里写图片描述

    burpsuite软件抓到的包如下:
    这里写图片描述

    filename="1.png"修改为filename="../1.png"后,点击Forward按钮,让修改后的报文送达服务器。
    这里写图片描述

    后台显示如下:
    这里写图片描述

    可以看到,上传的文件“1.png”出现在了与upload文件夹同级的目录中(即static目录下)。

    跨目录上传防范

    在“文件上传防范”的表单里选择任意文件并提交上传:
    这里写图片描述

    burpsuite软件抓到的包如下:
    这里写图片描述

    先右键(或者CTRL+R)将其添加到Repeater
    这里写图片描述

    Repeater这,将filename="2.png"修改为filename="../2.png"后,点击GO按钮,获得相应报文。
    这里写图片描述

    后台显示如下:
    这里写图片描述

    后台输出了文件上传目录的绝对路径,然后输出文件并不在安全目录下,上传失败。

    Repeater这,将filename="../2.png"修改为filename="abc/2.png"后,点击GO按钮,获得相应报文。
    这里写图片描述

    后台显示如下:
    这里写图片描述

    后台输出了文件上传目录的绝对路径,但是并没有输出文件并不在安全目录下,然而还是上传失败。

    原因分析

    表单的本意设计是可以选择一个本机内的文件,将其上传至服务器的\static\upload 目录下。

    然而在FileControllerPost函数中,直接取了表单上传的文件名作为参数,传入c.SaveToFile函数中

    c.SaveToFile("uploadname", "static/upload/" + h.Filename)
    

    所以当文件名被burpsuite中间人修改为../1.png 后,上传的目录随之变成了static/upload/../1.png

    ../”对系统来说表示上级目录,因此“static/upload/../1.png”中的“upload”与“../”是抵消的,最终实际上传目录为“static/1.png”。

    于是便产生了跨目录上传漏洞,通过这个漏洞,攻击者可以将文件上传到任意目录(可以通过添加多个“../”来找到根目录)

    推荐防范措施:先把目录传入filepath.Abs()函数,删除所有符号链接,获得绝对路径,然后再对标准化后的路径进行正则匹配,比较是否在安全目录下。

    /**
    * 验证文件路径是否在安全目录pattern下
    */
    func validate(path string, pattern string) bool {
    	relpath, err := filepath.Abs(path) /** 【修改】对文件路径进行标准化 **/
    	if err != nil {
    		fmt.Println("It's error when converted to an absolute path.")
    		return false
    	}
    	fmt.Println(relpath)
    	reg := regexp.MustCompile(pattern)
    	/**【修改】对标准化后的路径进行正则匹配,确保在安全目录下 **/
    	return reg.MatchString(relpath)
    }
    

    这里就是将标准化后的路径与\\static\\upload\\ 进行正则匹配,如果标准化后的路径缺乏\\static\\upload\\ 这一子串,说明肯定不是在安全路径下(即存在../跨目录的问题)。

    而在实验当中,还存在将文件名改为abc/2.png 使得最后的文件路径变成\static\upload\abc\2.png 的做法,此时是符合正则匹配的。但是仍然上传失败了。还记得c.SaveToFile这个函数嘛,当发现要保存的文件的路径中存在未创建的文件夹是没法保存成功的,所有文件夹必须由我们事先创建好,因而将上传的文件名改为abc/2.png是没办法开一个子文件夹的。

    健壮性

    若用户不选择任何文件,直接点击文件提交,此时后台代码c.GetFile("uploadname") 获取key值为"uploadname"的文件失败,直接报错,整个服务器断开连接。

    这里写图片描述

    解决方案即在获取文件前进行一次非空判断

    if c.Ctx.Request.MultipartForm.File["uploadname"] == nil {
    	fmt.Println("哈哈,我很健壮")
    	return
    }
    

    问:怎么发现表单Post过来的文件就保存在c.Ctx.Request.MultipartForm.File当中呢?
    答:通过查看c.GetFile()的源码发现,返回值为c.Ctx.Request.FormFile(key)
    这里写图片描述

    于是再查看FormFile()的源码:
    这里写图片描述

    红框部分,r指的是Request,即c.Ctx.Request
    r.MultipartForm.File[key]即为我们要找的文件,因而组合起来就是c.Ctx.Request.MultipartForm.File["uploadname"]

    可以看到,有什么不懂的直接看源码也是可以解决问题的= =

    现在再不选文件直接点提交试试:
    这里写图片描述

    小总结

    上传是Web中最常见的功能,如果上传功能存在设计、编码缺陷,就容易形成上传漏洞,从而成为致命的安全问题。攻击者可以通过上传脚本木马,实现查看/篡改/删除源码和任意涂鸦网页,可以连接和操作对应的数据库,还可以通过操作系统漏洞、配置缺陷、信息泄露进行提权,获取操作系统提权

    今天这里只讲跨目录上传文件漏洞,所以只提到要对文件的路径进行标准化校验。在实际的WEB上传模块中,文件的后缀名,文件的类型,文件的大小都是需要严格把关的(白名单机制)

    展开全文
  • 如果想在WEB-INF文件夹下的pages文件夹的books.jsp页面中引用WebContent目录下css文件夹的css文件,用简单的 <link rel="stylesheet" type="text/css" href="../../css/a.css" /> 语句是办不到的。 因为...

    项目的目录

    如果想在WEB-INF文件夹下的pages文件夹的books.jsp页面中引用WebContent目录下css文件夹的css文件,用简单的

    <link rel="stylesheet" type="text/css" href="../../css/a.css" />
    


    语句是办不到的。

    因为动态页面的WEB-INF文件夹是一个安全文件夹,不允许任何页面进行调用和调用其他页面,所以需要进行一些处理。

    在books.jsp页面中头部引入一个jstl的库

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    


    在head中加入如下的代码即可。

    <c:set value="${pageContext.request.contextPath}" var="path" scope="page" />
    <link rel="stylesheet" type="text/css" href="${path }/css/a.css" />



     

    展开全文
  • java项目防止访问防止越过登录直接访问

    问题:网站在运行时,有些可能会在地址栏中直接输入带有传值的地址,使得越过登录页面直接操作系统。

    解决:可以在项目的web.xml中配置过滤器,对请求进行过滤,在过滤器判断请求是否是越过登录直接输入恶意url地址进行访问的,如果是的话进行处理,不是则放行。

    如何还有其它方式欢迎探讨

    ************web.xml配置************
    <filter>
          <filter-name>validateLogin</filter-name>
          <filter-class>com.test.action.LoginedCheckInterceptorAction</filter-class>
      </filter>
    <filter-mapping>
          <filter-name>validateLogin</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>
    *********过滤器类*******************
    package com.test.action;
    
    import java.io.IOException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * filter过滤访问路径
     * @author ***
     *
     */
    public class LoginedCheckInterceptorAction implements Filter {
    
    	/**
    	 * filter过滤非法访问
    	 */
    	@SuppressWarnings("unused")
    	private static final long serialVersionUID = 1L;
    	
    	public void destroy() {
    		
    	}
    
    	public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
     
            HttpServletRequest req = (HttpServletRequest) request;
            HttpServletResponse res = (HttpServletResponse) response;
            
            System.out.println("===================filter开始执行======================");
            String referer = req.getHeader("referer"); //跨站访问、越过登录访问判断条件
            if(referer == null||referer == ""){
            	System.out.println("======================跨站访问或没有登录===============");
    	        String path = "http://www.baidu.com";//处理跨站访问、越过登录访问,跳转(预处理)。
    	        res.sendRedirect(path);
            }else{
            	chain.doFilter(req, res);//放行
            }
        }
    
    	public void init(FilterConfig arg0) throws ServletException {
    	}
    
    }
    
    

    
    
    
    
    
    
    展开全文
  • 由于TP5框架的一些特性规则,在nigix下导致跨目录的一些访问不能执行 最开始我尝试配置文件夹目录,导致出现各种奇葩错误,然后搜了以下资料发现原来只要简单的修改几个配置文件即可。 声明系统环境: 系统:...

    由于TP5框架的一些特性规则,在nginx下导致跨目录的一些访问不能执行
    最开始我尝试配置文件夹目录,导致出现各种奇葩错误,然后搜了以下资料发现原来只要简单的修改几个配置文件即可。
    声明系统环境:
    **系统:Centos6.+版本 **
    **TP框架:5.0+ 版本 **
    **使用lnmp一键安装包安装环境(配置文件地址在其官网有写) **
    首先修改网站根目录:
    我个人的config文件在如下地址:
    /usr/local/nginx/conf
    随后找到:
    nginx.conf
    并且打开文件找到如下设置:
    这里写图片描述
    如上所示,我在:
    root /home/wwwroot/default
    后添加了tp5的根目录,也就是public作为网站根目录,当然你也不用和我一样修改。

    随后,在同目录下,找到
    fastcgi.conf
    配置文件,随后找到最后一行,这一行的作用是锁定只在当前目录活动,所以我们并不能访问public的上级目录,导致我们的tp5框架部署不成功,解决办法注释掉这一行即可:这里写图片描述

    最后重启nginx即可:
    执行命令:service nginx restart
    或:service nginx reload
    或者检查一下是否配置有误:nginx -t

    展开全文
  • 如何访问web文件夹之外的文件

    千次阅读 2013-12-02 09:21:09
    如何访问web文件夹之外的文件
  • 菜鸟浅谈——web安全测试

    万次阅读 多人点赞 2018-02-27 22:29:32
    本文仅为小白了解安全测试提供帮助 一:安全测试注意事项 1)要注意白帽子与黑客之间的区别 ...二:web介绍 1)world wide web 万维网,也被叫做www(3w),非常普遍的互联网应用,每天都有数以亿万...
  • 原生App与Web APP优劣势分析

    千次阅读 多人点赞 2019-06-25 10:45:33
    现如今APP开发有两个主流的方向:原生App 以及移动Web App。那么您是否知道这两者有何区别?什么是原生APP,什么是web APP?今天小编在此对二者进行一个对比。 ☛ 什么是原生APP 在智能手机上运行的App应用程序有...
  • MVC WebAPI平台开发例子

    热门讨论 2015-11-12 12:11:37
    本例子是一个WebAPI架构的应用,应用WebAPI部署一下服务,可以平台访问,所有的消费端都可以访问WebAPI,包括:移动端,B/S,C/S。数据格式为:json,xml。是一个很好的平台框架应用例子。
  • Java Web如何限制访问的IP的两种方法

    万次阅读 2018-07-29 11:40:48
    Java Web限制IP访问的两种方法   前一阵子因为在做项目时碰到了这个功能,现在好好总结一下,至于为什么要限制IP访问,我就不多说了。然后百度了一下,现在主要有两种方式去限制IP访问,第一种是最简单的方便的...
  • 1.关闭电脑的防火墙 默认的: 关闭后之后的防火墙: 点击确定 2.打开cmd 找到最下面的IPv4地址   3.将本机运行的项目URL发给另一台电脑:将localhost换成Ipv4地址即可 如:192.168.2.188:8080/...
  • Web安全:站点攻击csrf

    千次阅读 多人点赞 2021-04-24 16:26:24
    它被称为“站请求伪造”。它能干的事情有很多:当你打开某个网站时,你另一个已经打开的购物网站已经完成支付;以你名义发送邮件,发评论;网络蠕虫;虚拟货币转账… CSRF攻击流程 用户登录A网站(受信任的) A...
  • web测试知识详解

    千次阅读 多人点赞 2018-11-21 17:09:19
    web测试 web测试..............................................................................................................................1 1. 分类及测试要点...........................................
  • 什么是终端web开发

    千次阅读 2019-03-30 20:14:01
    一句话概括:其实Web原本并非终端,但应用场景多了,就变成了”终端“。 既然说是Web,我就把范围划定在互联网相关的技术栈内。 任何基于TCP/IP模型应用层协议的Web应用的请求方,都可视为“Web终端”,与此...
  • 常见的Web攻击有SQL注入、XSS站脚本攻击、站点请求伪造共三类,下面分别简单介绍。 1 SQL注入 1.1 原理        SQL注入就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符...
  • 因为项目是部署在你机器上,所以他们需要通过你的ip来访问。 如果是局域网内的话, 你先查询出自己的IP地址,打开命令提示符: 输入:ipconfig 然后就将其修改为(比如): 你的局域网的IP地址+你的Tomcat的...
  • 移动端app开发,原生开发与混合开发的区别

    万次阅读 多人点赞 2019-09-26 18:47:01
    目前市场上主流的APP分为三种:原生APP、Web APP(即HTML5)和混合APP三种,相对应的定制开发就是原生开发、H5开发和混合开发。那么这三种开发模式究竟有何不同呢?下面我们就分别从这三者各自的优劣势来区分比较吧...
  • pdf.js服务器访问文件夹

    千次阅读 2019-01-11 17:58:42
    话不多少直接操作 1,先附带一个官方地址提供下载 pdf.js官网:... 减压下来的文件夹 我们新建一个项目 ...我们在web文件夹里面找到viewer.js打开,把value的默认值清空 下面我们...
  • Web安全之XSS站脚本攻击

    千次阅读 2015-08-26 09:06:30
    本文主要选择常见web攻击手段之一的XSS(站点脚本攻击)来进行讲解,说明其攻击原理,并提出相应的解决办法。XSSXSS 攻击,全称是“站点脚本攻击”(Cross Site Scripting),之所以缩写为 XSS,主要是为了和...
  • 我们通过一个AnyChat的项目来举例说明如何实现web浏览器访问本地文件: 通过该Web服务器便访问本地路径下的文件方法: AnyChat内置的Web服务器默认是关闭状态,需要在初始化SDK成功之后通过如下的API接口打开...
  • XSS站脚本攻击一直都被认为是客户端Web安全中最主流的攻击方式。因为Web环境的复杂性以及XSS站脚本攻击的多变性,使得该类型攻击很难彻底解决。那么,XSS站脚本攻击具体攻击行为是什么,又该如何进行有效的...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...
  • JavaBean在Java Web访问范围总结

    千次阅读 2015-05-30 20:12:07
    JavaBean是一种可重复使用、平台的软件组件,在JSP中通过特定的JSP标签可以访问JavaBean。本文总结JavaBean的4种存放范围的特性。
  • 如果您知道如何使用Delphi,Delphi会帮助您迅速并且能够创建任何应用程序APP及WEB网站应用! 当前,使用Delphi,您可以为许多操作系统创建应用程序: 微软Windows 安卓系统 苹果系统 Linux iOS 而且,更棒的是...
  • 解决了配置windows的NLB时,多播模式下,无网段访问的问题
  •  CSRF(Cross-site request forgery),中文名称:站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。 二.CSRF可以做什么?  你这可以这么理解CSRF攻击:攻击者盗用了你的身份...
  • web渗透--1--web安全原则(上)

    万次阅读 多人点赞 2018-09-10 22:25:32
    web安全原则 安全应该是系统开发之初就考虑的问题。换句话说,安全是一个成熟系统的必备特性。在项目说明中不谈安全,并非因为不需要,而是因为安全都是隐藏的。 安全性设计中的关键问题是挖掘出系统存在的安全...
  • 毕业设计题目

    万次阅读 热门讨论 2018-10-29 17:05:54
    基于Web的学校教室租赁系统 学校在线二手交易平台 基于移动平台的轻博客系统开发 基于web的IT技术论坛 基于Java EE新闻管理系统的设计与实现 网上员工考试培训系统 基于JAVA/JSP/SSH...
  • WebStorm安装教程和激活方式

    千次阅读 2017-10-15 13:27:31
    Meteor App ----Meteor是时代的全栈Web开发框架,Github stars数已超越Ruby on Rails。使用它能够迅速地开发实时的(Real-Time)和响应式的(Reactive)应用,并且可以在一套代码中支持Web,iOS,Android, ...
  • WebApi Cors 对ajax的跨域访问支持

    千次阅读 2016-12-07 23:22:48
    CORS简介 ...浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片或者脚本。但是Javascript脚本是不能获取这些资源的...主要原因还是出于安全考虑,浏览器会限制脚本中发起的站请求。(同源策略, 即JavaScrip...
  • Web应用跨域访问解决方案汇总

    万次阅读 2011-11-02 17:54:00
    做过跨越多个网站的Ajax开发的朋友都知道,如果在A网站中,我们希望使用Ajax来获得B网站中的特定内容,如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题。Ajax的跨域访问问题是现有的Ajax开发人员比较常...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 219,005
精华内容 87,602
关键字:

web跨目录访问