XSS概述
Cross Site Scripting – 跨站脚本攻击,为了和CSS层叠样式表区分,故称跨站脚本攻击为XSS
跨站脚本攻击是指攻击者往Web页面里插入恶意Script代码,当用户浏览该页面之时,嵌入Web页面中的Script代码就会被执行,从而达到恶意攻击用户的目的
本质
用户输入的数据被当作代码代码执行
形成原因
主要原因是页面对输入和输出的控制不够严格,导致“精心构造的脚本代码”输入后,被浏览器当作有效代码解析执行从而产生危害
危害
- 盗取用户Cookie
- 钓鱼攻击
- 键盘记录
- 截取网页屏幕
- 获取内网ip
- 获取浏览器保存的明文密码
- …
注意:静态站点则完全不受其影响
攻击流程
- 攻击者在 存在XSS漏洞的站点中,插入脚本代码
- 用户访问该站点后,会触发攻击者插入的脚本代码,返回带有“恶意JS”的页面
- 脚本代码执行,将用户的cookie数据,发送给攻击者
- 攻击者利用cookie,伪造用户登录,造成破坏
常见类型
-
反射型
交互的数据一般不会被存放在数据库里面,一次性。一般出现在查询类页面等
-
存储型
交互的数据会被存在数据库中,一般出现在留言板、注册等页面
-
DOM型
不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题
-
危害程度:存储型 > 反射型 > DOM型
测试流程
- 在目标站点上找到输入点,如查询接口,留言板等
- 输入一组 “特殊字符+唯一识别字符”,点击提交后,查看返回的源码,是否有做对应的处理
- 通过搜索定位到唯一识别字符,结合唯一识别字符前后语法,确认是否可以构造执行JS的条件(闭合)
- 提交构造的脚本代码(各种姿势),看是否可以执行成功
注意:
- 一般查询接口容易出现反射型XSS,留言板容易出现存储型XSS
- 由于后台可能存在过滤措施,构造的script可能会被过滤掉,而无法生效,或者环境限制了执行(浏览器)
- 通过变化不同的script,尝试绕过后台过滤机制
JavaScript基础
注释符
- 单行注释 //
- 多行注释 /**/
前端代码触发JavaScript脚本
1、直接使用script标签 <script>alert(222)</script>
2、伪协议: <a href=javascript:alert(2) />1</a>
3、事件型
HTML事件:HTML 事件可以是浏览器或用户做的某些事情,当在 HTML 页面中使用 JavaScript 时, JavaScript 可以触发这些事件
常见的HTML事件:
事件 | 描述 |
---|---|
onchange | HTML元素改变 |
onclick | 用户点击HTML元素 |
onmouseover | 用户从一个html元素上移动鼠标 |
onmouseout | 用户从一个HTML元素上移开鼠标 |
onkeydown | 用户按下键盘按键 |
onload | 浏览器已完成页面的加载 |
onfocus | 元素获得焦点 |
onerror | 当加载文档或图像时发送某个错误 |
oninput | 当用户输入时 |
等等事件
https://www.w3school.com.cn/js/jsref_events.asp
反射型XSS
一次性,插入的脚本代码不会存储在数据库
当用户 点击攻击者构造好的URL时,就会中招
出现场合
一般出现在查询框
存储型XSS
与反射型XSS最大的不同就是攻击者输入的恶意脚本代码会存储到数据库中
只要脚本代码在数据库中,用户浏览页面就会中招
出现场合
一般出现在留言板、注册等与数据库交互的地方
“看见框就X”
DOM型XSS
通过JavaScript,可以重构整个HTML文档,可以添加、移除、改变或重排页面上的项目
要改变页面的某个东西,JavaScript就需要获得对HTML文档中的所有元素进行访问的入口。这个入口,连同对HTML元素进行添加、移动、改变或移除的方法和属性,都是通过文档对象模型来获得的(DOM)
故DOM可以理解为一个一个访问HTML的编制编程接口
注意:DOM型XSS 不与数据库进行交互
HTML DOM 是关于如何获取、修改、添加或删除 HTML 元素的标准。
常见DOM方法与属性
方法:
-
getElementById(id) — 获取带有指定id的节点元素
-
document.lastModified—获取当前页面最后的修改时间(判断是否是伪静态页面)
-
document.cookie—获取当前页面的cookie
-
Document.write—向页面写入文本
-
注意:document.write接受native编码
native编码地址:
http://tool.oschina.net/encode?type=3
属性:
- innerHTML—节点的文本值
- parent—节点的父节点
- childNodes—节点的子节点
- attribute—节点的属性节点
XSS盲打
有与前端数据交互的地方,比如:建议框
相当于只有后台才能看到前端输入的内容,从前端无法判断是否存在XSS时,就可以采用盲打的形式
盲打:不管3721,往里面插JS代码,然后等待,可能会有惊喜
由于是后端,可能安全考虑不太严格,当管理员登录时,就会被被X
XSS绕过
- 前端限制绕过:直接抓包重放,或者修改HTML前端代码
- 大小写绕过:如 <ScRipT>AlERt(3)</ScrIPt>
- 拼凑绕过: 如 <scri<script>pt>alert(4)</scr</script>ipt>
- 使用注释进行干扰绕过: <scr ipt>alert(5)</sc ript>
编码
核心思路:后台过滤了特殊字符,比如:<script>标签,但该标签可以被各种编码,后台不一定会过滤
当浏览器对该编码进行识别时,会翻译成正常的标签,从而执行
常见的编码:URL编码 HTML编码
注意:使用编码时,需要注意编码在输出点是否会被正常识别和翻译
htmlspecialchars()函数
htmlspecialchars()函数把预定义的字符转换为HTML实体
预定义的字符是:
&(和号) ---->&
" ---->"
' ---->'
< ----><
> ---->>
用法:
$ok = htmlspecialchars($_GET['message'])
可用的引号类型
ENT-COMPAT--默认,仅编码双引号
ENT-QUOTES--编码双引号和单引号
ENT-NOQUOTES--不编码任何引号
XSS常见防范措施
总的原则:输入做过滤,输出做转义
- 过滤:根据业务需求进行过滤
- 转义:所有输出到前端的数据都要根据输出点做转义
a标签href做防范措施
a标签一般都是用来写一个超链接
防范:只允许用户输入http或hppts开头的协议,其次在进行htmlspecialchars()处理