XSS(跨站脚本)概述
Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写”CSS”冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;
XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
一、反射型XSS
通过构造url地址,地址中暗藏xss平台地址,当有受害者点击此连接,会访问两个网址,一个是受害者原本想访问的网站,另一个是xss平台,受害者原本想访问的网站的cookie会被记录在XSS平台
反射型XSS (Get)
有关 GET 请求的其他一些注释:(注释来自: 菜鸟教程 )
- GET 请求可被缓存
- GET 请求保留在浏览器历史记录中
- GET 请求可被收藏为书签
- GET 请求不应在处理敏感数据时使用
- GET 请求有长度限制
- GET 请求只应当用于取回数据
- 输入
<script>alert('xss')</script>
发现输入长度有限制,
- 解决方法,修改input标签里的maxlength值
- 修改后可输入完整长度
- 点击submit执行,成功
反射型XSS (Post)
有关 POST 请求的其他一些注释:(注释来自: 菜鸟教程)
- POST 请求不会被缓存
- POST 请求不会保留在浏览器历史记录中
- POST 不能被收藏为书签
- POST 请求对数据长度没有要求
登录
输入<script>alert('xss')</script>
点击submit执行,成功
附:GET方法与POST方法的区别
注:GET方法与POST方法的区别来自:W3School
二、存储型XSS
一般会存入网站数据库,比如留言板,网站后台日志啥的,等受害者或管理员查看点击链接时,发生访问xss平台并被记录cookie的情形
输入<script>alert('xss')</script>
点击submit执行,成功
留言板将输入的内容写入到网页中, 并且存储到网站数据库, 假如遭受到恶意代码攻击, 那么受到的攻击将是持久化的
三、DOM型XSS
DOM型XSS
DOM型XSS的核心是运用DOM函数去执行访问xss平台的目的,在本靶场中,我们通过DOM函数改变HTML的结构,使浏览器加载页面的同时访问了xss平台,记录了使用者的cookie。
随便输入一个数字,点击click时出现链接,点击链接实现跳转,在网页源代码可以看到点击click生成了标签。
方法一: 利用JavaScript伪协议
输入javascript:alert("xss")
方法二:代码闭合
输入'onclick="alert('xss')">
// a标签内部加属性
输入'> <img src="" onerror=alert('xss')>
// 闭合出a标签, 将img标签嵌入上一级div执行
DOM型XSS_x
输入 ' onfocus=alert('xss')>
四、XSS盲打
XSS盲打简单来说,盲打就是在一切可能的地方尽可能多的提交xss语句,然后看哪一条会被执行,就能获取管理员的cooike,就是不知道后台不知道有没有xss存在的情况下,不顾一切的输入xss代码在留言啊,反馈啊之类的地方,尽可能多的尝试xss的语句与语句的存在方式,就叫盲打
注:XSS盲打不是一种XSS漏洞的类型,它其实是一种XSS一种的攻击场景。
输入<script>alert('xss')</script>
管理员进入后台访问并受到攻击
五、XSS之过滤
很多网站为了避免XSS的攻击,对用户的输入都采取了过滤,最常见的就是对<>转换成<以及>,经过转换以后<>虽然可在正确显示在页面上,但是已经不能构成代码语句了。这个貌似很彻底,因为一旦<>被转换掉,什么
<script src=1.js></script>
就会转换成“<script src=1.js></script>”
,不能执行,因此,很多人认为只要用户的输入没有构成<>,就不能闭合前后的标签,其语句当然也不会有害。
输入<ScRiPt>alert('xss')</ScRipt>
// 大小写混合绕过
输入<img src="" onerror=alert('xss')>
// img标签
六、XSS之htmlspecialchars
htmlspecialchars — 将特殊字符转换为 HTML 实体
预定义的字符是:
& (和号) 成为 &
“ (双引号) 成为 "
‘ (单引号) 成为 '
< (小于) 成为 <
> (大于) 成为 >
可用引号类型
- ENT_COMPAT:默认,仅编码双引号
- ENT_QUOTES:编码双引号和单引号
- ENT_NOQUOTES:不编码任何引号
输入hack' onfocus='alert("xss")
// 单引号闭合+事件标签
输入javascript:alert("xss")
// JavaScript伪协议
七、XSS之href输出
herf输出做防御的两个逻辑
- 输入的时候只允许 http 或 https 开头的协议,才允许输出
- 再进行htmlspecialchars处理,把特殊字符给处理掉
输入javascript:alert(/xss/)
八、XSS之js输出
js输出漏洞:
输出点是在javaScript,通过用户的输入动态的生成JavaScript代码
javaScript里面是不会对tag和字符实体进行解释的,所以正常的输入得不到正常的输出,这不是我们需要的,所以,如果需要进行处理,就进行JavaScript转义处理,也就是用\ 对特殊字符进行处理。
输入</script><script>alert('xss~')</script>
这个漏洞的输出点是在JS中,通过用户的输入动态生成了JS代码
JS有个特点,它不会对实体编码进行解释,如果想要用htmlspecialchars对我们的输入做实体编码处理的话, 在JS中不会把它解释会去,虽然这样解决了XSS问题,但不能构成合法的JS
所以在JS的输出点应该对应该使用 \ 对特殊字符进行转义。
GitHub Discussions