概述
目录
一、预备知识:关于DVWA
二、实验环境
三、实验步骤
1、反射性XSS
2、存储型XSS
四、实验思考
一、预备知识:关于DVWA
DVWA(Damn Vulnerable Web Application)是基于PHP+MySQL的一套用于常规Web漏洞教学和检测Web脆弱性的程序,可以为安全专业人员测试自己的专业技能和工具提供所需要的环境,帮助Web开发者更好地掌握Web应用安全防范的过程。
DVWA提供了以下10个功能模块。
- Brute Force(暴力破解)
- Command Injection(命令行注入)
- CSRF(跨站请求伪造)
- File Inclusion(文件包含)
- File Upload(文件上传)
- Insecure CAPTCHA(不安全的验证码)
- SQL Injection(SQL注入)
- SQL Injection(Blind)(SQL盲注)
- XSS(Reflected)(反射型跨站脚本)
- XSS(Stored)(存储型跨站脚本)
需要注意的是,DVWA 的代码分为4种安全级别:Low 、Medium、High和 Impossible。
二、实验环境
Windows7,需要搭建DVWA网址,请见1、在XAMPP中搭建DVWA_sliver呀的博客-CSDN博客
三、实验步骤
1、反射性XSS
(1)在XAMPP中打开Apache HTTP服务和MySQL服务。
(2)打开DVWA网站,在浏览器中输入“http://127.0.0.1:<port>/DVWA/login.php”,输入默认的名称和密码(admin password)后,即可登录。
(3)选择DVWA Security的安全级别,此处选择low选项。
(4)选择XSS(reflected)选项,进入以下界面。
(5)查看正常输入输出。在输入框中输入“test”,单击Submit按钮,可以看到页面上的正常返回结果,说明这个页面的功能是将用户输入的信息直接发送给用户。
(6)点击右下角的"View Source",可见页面的PHP源码。
<?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>';
}
?>
array_key_exists(“name”,$_GET):检查数组$_GET是否含有名字为“name”的键名,有,就返回True;否则返回False。
从源码来看,页面直接将用户输入的信息返回给用户。
(7)进行攻击测试。在输入框中输入“<script>alert(/xss/)</script>”,可以看到非正常返回结果页面。
在URL栏中,也可以看到:采用的是GET传参,由此可以说明,Web应用会将未经验证的数据通过请求发送给客户端。
(8)验证此类漏洞的持久性。再次选择左侧的XSS(Reflected)选项,可以看到页面恢复正常,说明此前输入的信息未保持,是非持久性跨站脚本漏洞。
2、存储型XSS
(1)在DVWA页面左侧选择XSS(Stored)。
(2)查看正常输入输出。在Name输入框中输入“test”,在Message输入框中输入“This is a test comment”。单击Sign Guestbook按钮,可以得到正常的返回结果,说明该网页是为用户发表署名和评论的。
(3)查看源代码。点击右下角的"View Source",可见页面的PHP源码。
if( isset( $_POST[ 'btnSign' ] ) ) {
// Get input
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] );
// Sanitize message input
$message = stripslashes( $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)) ? "" : ""));
// Sanitize name input
$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();
}
?>
- isset():判断变量是否存在,且是否为空;
- trim($string,$charlist):移除字符串两侧的空白字符或者其他自定义的字符。$charlist为可选项,如果没有$charlist,则trim函数会移除的内容有:“XOB”、“t”、“n”、“r”、“ ”、“”(空格);
- stripslashes($str):移除addslashes()函数添加的转义反斜杠字符(也就是说自己写的反斜杠不回被删);
- is_object(mixed $var):检查变量是否是一个对象;
- mysqli_real_escape_string(connection,escapestring):转义在字符串中的特殊字符(主要是NUL、n、r、、'、"和control-Z)。
$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)) ? "" : ""));
这段php代码,主要是一个三元操作符,蓝色部分满足就执行黄色代码——转义 $message中的特殊字符;否则,触发用户自定义的错误信息。可见它对用户提交的数据检测页很少。
$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>' );
这两行代码则是将用户提交的数据存入数据库。
(4)进行攻击测试。在Name输入框中输入“test”,在Message输入框中输入“<script>alert(XSS)</script>”。单击Sign Guestbook按钮,可以看到以下效果。
(5)验证漏洞的持久性。重新访问DVWA页面,单击刷新按钮或者选取左侧的XSS(Stored)选项,可以看到,仍然会弹框。
四、实验思考
XSS的防范方法:
1、XSS过滤
虽然XSS攻击的对象是客户端,但XSS的本质是Web应用服务的漏洞,所以必须同时对Web服务器和客户端进行安全加固才能避免攻击的发生。XSS过滤需要在客户端和服务器端同时进行。
2、输入验证
输入验证就是对用户提交的信息进行有效性验证,仅接受有效的信息,阻止或忽略无效的用户输入信息。在对用户提交的信息进行有效性验证时,不仅要验证数据的类型,还要验证其格式、长度、范围和内容。
3、输出编码
由于大多数Web应用程序都会把用户输入的信息完整地输出到页面中,从而导致XSS漏洞的存在。为解决这一问题,当需要将一个字符串输出到Web网页,但又无法确定这个字符串是否包含XSS特殊字符时,为了确保输出内容的完整性和正确性,可以使用HTML编码(HTMLEncode)进行处理。
最后
以上就是执着菠萝为你收集整理的5.6 XSS跨站脚本攻击的全部内容,希望文章能够帮你解决5.6 XSS跨站脚本攻击所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复