`

解决跨站脚本注入,跨站伪造用户请求,sql注入等http安全漏洞(转)

    博客分类:
  • xss
 
阅读更多

转载:

http://blog.csdn.net/u011794238/article/details/46419911

 

跨站脚本就是在url上带上恶意的js关键字然后脚本注入了,跨站伪造用户请求就是没有经过登陆,用超链接或者直接url上敲地址进入系统,类似于sql注入这些都是安全漏洞。

 

  • sql注入

 

1、参数化查询预处理,如Java使用PreparedStatement()处理变量。
2、转义敏感字符及字符串(SQL的敏感字符包括“exec”,”xp_”,”sp_”,”declare”,”Union”,”cmd”,”+”,”//”,”..”,”;”,”‘”,”--”,”%”,”0x”,”><=!-*/()|”,和”空格”)。
3、屏蔽出错信息:阻止攻击者知道攻击的结果。
4、在服务端正式处理之前对提交数据的合法性(合法性检查主要包括三项:数据类型,数据长度,敏感字符的校验)进行检查等,在确认客户端的输入合法之前,服务端拒绝进行关键性的处理操作。

 

  • 跨站脚本

 

一般性建议:转义或过滤客户端提交的危险字符,客户端提交方式包含GET、POST、COOKIE、User-Agent、Referer、Accept-Language等,其中危险字符如下:
建议转义或过滤以下字符:
[1] |(竖线符号)
[2] & (& 符号)
[3];(分号)
[4] $(美元符号)
[5] %(百分比符号)
[6] @(at 符号)
[7] '(单引号)
[8] ""(引号)
[9] \'(反斜杠转义单引号)
[10] \""(反斜杠转义引号)
[11] <>(尖括号)
[12] ()(括号)
[13] +(加号)
[14] CR(回车符,ASCII 0x0d)
[15] LF(换行,ASCII 0x0a)
[16] ,(逗号)
[17] \(反斜杠)
[18]  (空格)
[19] . (点号)
过滤以下关键字、标签:alert、img、script、document、document.title、document.write、eval、prompt、onclick、onerror、onmouseenter、onreadystatechange、confirm、JavaScript、String.fromCharCode、onload、DYNSRC、LOWSRC、behavior、vbscript、msgbox、mocha、livescript、expression。

开发语言的建议:
[1]严格控制输入:
    Asp:request
    Aspx:Request.QueryString、Form、Cookies、SeverVaiables等
    PHP:$_GET、$_POST、$_COOKIE、$_SERVER、$_GlOBAL、$_REQUEST等
    Jsp:request.getParameter、request.getCookies 等
    客户端提交的变量一般从以上函数获得,严格限制提交的数据长度、类型、字符集。

[2]严格控制输出:
    HtmlEncode:对一段指定的字符串应用HTML编码。
    UrlEncode:对一段指定的字符串URL编码。
    XmlEncode:将在XML中使用的输入字符串编码。
    XmlAttributeEncode:将在XML属性中使用的输入字符串编码 
    escape:函数可对字符串进行编码
    decodeURIComponent:返回统一资源标识符的一个已编码组件的非编码形式。
    encodeURI:将文本字符串编码为一个有效的统一资源标识符 (URI)。"  "get型xss:

  • 跨站请求伪造

 

方案一、存在漏洞的页面加验证码或手机短信验证 
方案二、检测HTTP请求中的访问来源是否可信,对http头中的referer进行过滤,只允许本域站点 
方案三、一次性令牌Token 
添加一个参数Token,其值是随机的。这样攻击者因为不知道Token而无法构造出合法的请求进行攻击。实现方法:首先服务器端要以某种策略生成随机字符串,作为令牌(token),保存在 Session 里。然后在发出请求的页面,把该令牌以隐藏域一类的形式,与其他信息一并发出。在接收请求的页面,把接收到的信息中的令牌与 Session 中的令牌比较,只有一致的时候才处理请求,否则拒绝请求或者要求用户重新登陆验证身份。 
Token 使用原则: 
Token要足够随机————只有这样才算不可预测 
Token是一次性的,即每次请求成功后要更新Token————这样可以增加攻击难度,增加预测难度 
Token要注意保密性————敏感操作使用post,防止Token出现在URL中 
方案四、临时cookie:对会话进行时效限制,将持久化的授权方法(例如cookie或者HTTP授权)切换为短时或瞬时的授权方法 
方案五、session标记随机生成;确认已有的session标记无法被二次使用 
方案六、过滤用户输入,例如论坛、博客等,不允许发布含有站内操作URL的链接(作用有限,因为可以通过qq、第三方网站进行发布,图片形式会自动加载等) 
方案七、根据不可预测性原则,我们可以对参数进行加密从而防止CSRF攻击。"
已解密的登录请求 对诸如用户名、密码和信用卡号之类的敏感输入字段进行加密传递
会话定置 "COOKIE中的登陆前JSESSIONID与登陆后JESSIONID不能相同
例如在登录页面上加上一段代码:

[java] view plain copy
 
  1. request.getSession().invalidate() ;         //清空session  
  2. if (request.getCookies()!=null) {  
  3.    Cookie cookie = request.getCookies()[0];     // 获取cookie  
  4.    cookie.setMaxAge(0);                    // 让cookie过期  
  5. }"    

 

  • 文件上传

 

[1]严格判断上传文件的类型,设置上传文件白名单,只允许上传指定类型的文件。
[2]禁止在上传目录下执行脚本。
[3]上传文件的目录必须是http请求无法直接访问到的。如果需要访问的,必须上传到其他(和web服务器不同的)域名下,并设置该目录为不解析jsp等脚本语言的目录。
[4]上传文件要保存的文件名和目录名由系统根据时间生成,不允许用户自定义。
[5]图片上传,要通过处理(缩略图、水印等),无异常后才能保存到服务器。"

  • jQuery跨站脚本

 

"升级jQuery到1.7版本以上,或在js中修改如下行,quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/
修改为:quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/"

 

  • 启用了不安全的HTTP方法

 

 

修改web.xml,增加如下配置

[html] view plain copy
 
  1. <login-config>  
  2.        <!-- Authorization setting for SSL -->  
  3.        <auth-method>CLIENT-CERT</auth-method>  
  4.        <realm-name>Client Cert Users-only Area</realm-name>  
  5.   <auth-method>BASIC</auth-method>  
  6.    </login-config>  
  7.    <security-constraint>  
  8.        <!-- Authorization setting for SSL -->  
  9.   <web-resource-collection>  
  10.    <web-resource-name>SSL</web-resource-name>  
  11.    <url-pattern>/oa/login.jsp</url-pattern>  
  12.        </web-resource-collection>  
  13.          
  14.        <user-data-constraint>  
  15.            <transport-guarantee>CONFIDENTIAL</transport-guarantee>  
  16.        </user-data-constraint>  
  17.    </security-constraint>  
  18.   
  19.   
  20.  <!-- 禁止不安全的http方法 -->  
  21.  <security-constraint>  
  22.   <web-resource-collection>  
  23.         <web-resource-name>fortune</web-resource-name>  
  24.         <url-pattern>/*</url-pattern>  
  25.         <http-method>PUT</http-method>  
  26.         <http-method>DELETE</http-method>  
  27.         <http-method>HEAD</http-method>  
  28.         <http-method>OPTIONS</http-method>  
  29.         <http-method>TRACE</http-method>  
  30.   </web-resource-collection>  
  31.   <auth-constraint></auth-constraint>  
  32.  </security-constraint>   


 

  • 登录错误消息凭证枚举

 

对每个错误的登录尝试发出相同的错误消息,不管是哪个字段发生错误,特别是用户名或密码字段错误。
文件备份 "删除备份文件。
.arc/.bac/.backup/.bak/.bck/.copy/.old/.orig/.sav/.save/.saved/.swp/.temp/.test/.tmp/.txt"。

 

以下是我自己写的一份拦截器,里面可以实现对http请求的参数拦截,解决跨站脚本注入:

 

[java] view plain copy
 
  1. package com.asiainfo.aiga.common.filter;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.Enumeration;  
  5.   
  6. import javax.servlet.Filter;  
  7. import javax.servlet.FilterChain;  
  8. import javax.servlet.FilterConfig;  
  9. import javax.servlet.ServletException;  
  10. import javax.servlet.ServletRequest;  
  11. import javax.servlet.ServletResponse;  
  12. import javax.servlet.http.HttpServletRequest;  
  13. import javax.servlet.http.HttpServletResponse;  
  14.   
  15. import org.apache.commons.lang3.StringUtils;  
  16.   
  17. public class XSSCheckFilter implements Filter  
  18. {  
  19.     private FilterConfig config;  
  20.     private static String errorPath;//出错跳转的目的地  
  21.     private static String[] excludePaths;//不进行拦截的url  
  22.     private static String[] safeless = { "<script", //需要拦截的JS字符关键字  
  23.     "</script", "<iframe", "</iframe", "<frame", "</frame", "set-cookie", "%3cscript", "%3c/script", "%3ciframe", "%3c/iframe", "%3cframe", "%3c/frame", "src=\"javascript:", "<body", "</body", "%3cbody", "%3c/body", "alert", "script", "document", "document.title", "document.write", "eval", "prompt", "onreadystatechange", "javascript", "msgbox"  
  24.     //"<",  
  25.     //">",  
  26.     //"</",  
  27.     //"/>",  
  28.     //"%3c",  
  29.     //"%3e",  
  30.     //"%3c/",  
  31.     //"/%3e"  
  32.     };  
  33.   
  34.     public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException  
  35.     {  
  36.         Enumeration params = req.getParameterNames();  
  37.         HttpServletRequest request = (HttpServletRequest) req;  
  38.         HttpServletResponse response = (HttpServletResponse) resp;  
  39.   
  40.         boolean isSafe = true;  
  41.         String requestUrl = request.getRequestURI();  
  42.         if (isSafe(requestUrl))  
  43.         {  
  44.             requestUrl = requestUrl.substring(requestUrl.indexOf("/"));  
  45.             if (!excludeUrl(requestUrl))  
  46.             {  
  47.                 while (params.hasMoreElements())  
  48.                 {  
  49.                     String cache = req.getParameter((String) params.nextElement());  
  50.                     if (StringUtils.isNotBlank(cache))  
  51.                     {  
  52.                         if (!isSafe(cache))  
  53.                         {  
  54.                             isSafe = false;  
  55.                             break;  
  56.                         }  
  57.                     }  
  58.                 }  
  59.             }  
  60.         }  
  61.         else  
  62.         {  
  63.             isSafe = false;  
  64.         }  
  65.         if (!isSafe)  
  66.         {  
  67.             request.setAttribute("msg", "There is some illegal characters in paramters.");  
  68.             request.getRequestDispatcher(errorPath).forward(request, response);  
  69.             return;  
  70.         }  
  71.         else  
  72.         {  
  73.             String referer = request.getHeader("referer");  
  74.             if (!("/index.jsp".equals(request.getServletPath()) || "/refresh.jsp".equals(request.getServletPath())))  
  75.             {  
  76.                 if(request.getServletPath()!=null&&request.getServletPath().endsWith(".action")){  
  77.                       
  78.                 }else if (referer == null || !referer.contains(request.getServerName()))  
  79.                 {  
  80.                     System.out.println("跨站请求伪造");  
  81.                     //转到一个错误的图片  
  82.                     request.getRequestDispatcher(errorPath).forward(request, response);  
  83.                 }  
  84.             }  
  85.         }  
  86.         filterChain.doFilter(req, resp);  
  87.     }  
  88.   
  89.     private static boolean isSafe(String str)  
  90.     {  
  91.         if (StringUtils.isNotBlank(str))  
  92.         {  
  93.             for (String s : safeless)  
  94.             {  
  95.                 String[] strs = str.split("/");  
  96.                 for (String urlStr : strs)  
  97.                 {  
  98.                     if (s.equals(urlStr.toLowerCase()))  
  99.                     {  
  100.                         return false;  
  101.                     }  
  102.                 }  
  103.             }  
  104.         }  
  105.         return true;  
  106.     }  
  107.   
  108.     private boolean excludeUrl(String url)  
  109.     {  
  110.         if (excludePaths != null && excludePaths.length > 0)  
  111.         {  
  112.             for (String path : excludePaths)  
  113.             {  
  114.                 if (url.toLowerCase().equals(path))  
  115.                 {  
  116.                     return true;  
  117.                 }  
  118.             }  
  119.         }  
  120.         return false;  
  121.     }  
  122.   
  123.     public void destroy()  
  124.     {  
  125.     }  
  126.   
  127.     public void init(FilterConfig config) throws ServletException  
  128.     {  
  129.         this.config = config;  
  130.         errorPath = config.getInitParameter("errorPath");  
  131.         String excludePath = config.getInitParameter("excludePaths");  
  132.         if (StringUtils.isNotBlank(excludePath))  
  133.         {  
  134.             excludePaths = excludePath.split(",");  
  135.         }  
  136.     }  
  137. }  

 

 
分享到:
评论

相关推荐

    WebGoat是一个开源的Web安全教育平台,旨在通过实践课程帮助用户理解并防御SQL注入、XSS(跨站脚本攻击)、CSRF(跨

    webgoat通关WebGoat是一个开源的Web安全教育平台,旨在通过实践课程帮助用户理解并防御SQL注入、XSS(跨站脚本攻击)、CSRF(跨站请求伪造)等常见的Web安全漏洞。以下是WebGoat通关的一般步骤和建议: 一、注册与...

    360提供的php防sql注入代码修改类

    在网络安全领域,SQL注入和HTTP跨站攻击是两种常见的攻击方式,它们对网站的安全构成严重威胁。PHP作为广泛应用的服务器端脚本语言,其代码安全至关重要。本文将深入探讨360提供的PHP防SQL注入代码修改类,以及如何...

    软件安全实验2 SQL注入实验

    DVWA目前的版本共有十个漏洞模块,分别是Brute Force(暴力破解)、Command Injection(命令行注入)、CSRF(跨站请求伪造)、File Inclusion(文件包含)、File Upload(文件上传)、Insecure CAPTCHA (不安全的...

    第二节 针对asp+access网站进行sql注入利用-01

    OWASP ZAP是一款开源的Web应用程序安全扫描工具,能够检测Web应用程序中的漏洞,包括SQL注入、跨站脚本、跨站请求伪造等。使用OWASP ZAP可以快速地检测Web应用程序中的漏洞,并提供详细的漏洞报告。 漏洞分析 漏洞...

    Web应用常见漏洞修复方案

    在 Web 应用程序中,安全漏洞是非常普遍的存在,而 SQL 注入攻击、跨站脚本攻击和跨站请求伪造是最常见的三种漏洞,本篇文章将详细介绍这三种漏洞的成因、危害和防护措施。 一、SQL 注入攻击 SQL 注入攻击是指攻击...

    webProject:具有XSS,SQL注入和Croos站点请求伪造的跨站点脚本

    在IT安全领域,Web应用程序常常面临多种威胁,其中包括SQL注入、XSS(跨站脚本)和CSRF(跨站请求伪造)。这个名为"webProject"的项目显然旨在模拟这些常见漏洞,帮助开发者和安全研究人员了解它们的工作原理,以及...

    WEB开发安全漏洞修复方案

    1.3.8 链接注入(便于跨站请求伪造) 18 1.3.9 应用程序错误 25 1.3.10 SQL注入 29 1.3.11 发现数据库错误模式 38 1.3.12 启用了不安全的HTTP方法 48 1.3.13 发现电子邮件地址模式 50 1.3.14 HTML注释敏感信息泄露 ...

    sqlinject-sql注入资料

    Web应用的安全性面临诸多挑战,其中包括但不限于跨站脚本(XSS)、跨站请求伪造(CSRF)以及SQL注入等。这些漏洞如果被利用,可能会导致敏感信息泄露或系统功能受损。因此,在开发阶段就应当采取预防措施,并持续进行...

    一个基于java开发的漏洞测试环境,其中包括了sql注入,csrf,任意文件上传,越权等等.zip

    这些漏洞包括SQL注入、CSRF(跨站请求伪造)、任意文件上传以及权限越权,这些都是网络安全领域中至关重要的知识点。 **SQL注入**是一种攻击手段,攻击者通过在输入数据中嵌入恶意的SQL语句,欺骗数据库执行非预期...

    一个漏洞脚本 大家自己看吧

    4. **注入攻击**: 如果wininet.dll在处理HTTP请求时不正确地处理用户输入,可能会受到SQL注入、命令注入等类型的攻击。这些攻击允许黑客执行非预期的数据库查询或系统命令,对系统造成破坏。 5. **身份验证与安全**...

    Web安全开发:SQL注入攻击和网页挂马.pdf

    * 跨站请求伪造攻击(CSRF):攻击者通过inject恶意代码到Web页面中,以伪造用户请求。 * 点击劫持攻击(Clickjacking):攻击者通过inject恶意代码到Web页面中,以劫持用户点击事件。 4. 网页挂马的危害 网页挂马...

    SQL注入百科全书1

    例如,跨站脚本攻击(XSS)和跨站请求伪造(CSRF)也可能与SQL注入一起被利用,以实现更复杂的攻击链。 SQL注入的一些著名案例包括MySpace、Heartbleed和Target零售店的大规模数据泄露事件。这些事件强调了SQL注入...

    常见的网站安全漏洞视频课程.rar

    3. **跨站请求伪造(CSRF)**:CSRF利用受害者浏览器已有的身份认证信息执行非预期操作。学习识别CSRF攻击的迹象,以及使用CSRF令牌等技术防止这类攻击。 4. **文件包含漏洞**:当Web应用允许用户指定要加载的文件时...

    WEB安全漏洞集锦

    12. CSRF漏洞:跨站请求伪造攻击可能导致用户在不知情的情况下执行非预期的命令。防御CSRF攻击需要在用户请求中增加随机令牌,验证用户请求的来源,限制请求的来源域。 13. 源代码泄漏:源代码泄漏可能使攻击者了解...

    PHP开发漏洞环境(SQL注入+文件上传+文件下载+XSS+万能密码+session/cookie+购物逻辑漏洞的学习等等)

    这个PHP开发漏洞环境提供了学习和实践多种常见安全问题的机会,如SQL注入、文件上传、文件下载、跨站脚本(XSS)、弱口令、Session/Cookie管理以及购物逻辑漏洞等。下面将对这些知识点进行详细的阐述。 1. SQL注入:...

    关于呼伦贝尔地区PHP网站安全漏洞的分析和研究.pdf

    同时,我们也对呼伦贝尔地区 PHP 网站的安全状态进行了分析,并发现了许多网站存在着语义 URL、跨站请求伪造、跨站脚本、SQL 注入、文件上传等安全漏洞。这些安全漏洞给 Web 应用的安全带来了严重的威胁。我们建议...

    明小子 网页 注入

    网页注入主要包括SQL注入、XSS(跨站脚本)注入、CSRF(跨站请求伪造)等类型: 1. SQL注入:当Web应用没有对用户输入的数据进行充分过滤,攻击者可以通过构造恶意的SQL语句,使服务器执行非预期的数据库操作,可能...

    Web常见十大漏洞.pdf

    其他常见的Web漏洞包括跨站请求伪造(CSRF)、文件包含漏洞、命令注入漏洞等。防范这些漏洞的方法包括: * 验证用户的输入 * 限制用户的权限 * 使用安全的编码和解码方式 * 及时更新和修补漏洞 Web应用程序的安全...

Global site tag (gtag.js) - Google Analytics