目录
DVWA(Damn Vulnerable Web Application)是基于PHP+MySQL的一套用于常规Web漏洞教学和检测Web脆弱性的程序,可以为安全专业人员测试自己的专业技能和工具提供所需要的环境,帮助Web开发者更好地掌握Web应用安全防范的过程。
DVWA提供了以下10个功能模块。
需要注意的是,DVWA 的代码分为4种安全级别:Low 、Medium、High和 Impossible。
Windows7,需要搭建DVWA网址,请见1、在XAMPP中搭建DVWA_sliver呀的博客-CSDN博客
(1)在XAMPP中打开Apache HTTP服务和MySQL服务。
(2)打开DVWA网站,在浏览器中输入“http://127.0.0.1:

(3)选择DVWA Security的安全级别,此处选择low选项。

(4)选择XSS(reflected)选项,进入以下界面。

(5)查看正常输入输出。在输入框中输入“test”,单击Submit按钮,可以看到页面上的正常返回结果,说明这个页面的功能是将用户输入的信息直接发送给用户。

(6)点击右下角的"View Source",可见页面的PHP源码。
-
- header ("X-XSS-Protection: 0");
-
- // Is there any input?
- if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
- // Feedback for end user
- echo '
Hello '
. $_GET[ 'name' ] . ''; - }
-
- ?>
array_key_exists(“name”,$_GET):检查数组$_GET是否含有名字为“name”的键名,有,就返回True;否则返回False。
从源码来看,页面直接将用户输入的信息返回给用户。
(7)进行攻击测试。在输入框中输入“”,可以看到非正常返回结果页面。


在URL栏中,也可以看到:采用的是GET传参,由此可以说明,Web应用会将未经验证的数据通过请求发送给客户端。
(8)验证此类漏洞的持久性。再次选择左侧的XSS(Reflected)选项,可以看到页面恢复正常,说明此前输入的信息未保持,是非持久性跨站脚本漏洞。
(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( '
'
. ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '' ); -
- //mysql_close();
- }
-
- ?>
$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( '
'
. ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '' );
这两行代码则是将用户提交的数据存入数据库。
(4)进行攻击测试。在Name输入框中输入“test”,在Message输入框中输入“”。单击Sign Guestbook按钮,可以看到以下效果。

(5)验证漏洞的持久性。重新访问DVWA页面,单击刷新按钮或者选取左侧的XSS(Stored)选项,可以看到,仍然会弹框。
XSS的防范方法:
1、XSS过滤
虽然XSS攻击的对象是客户端,但XSS的本质是Web应用服务的漏洞,所以必须同时对Web服务器和客户端进行安全加固才能避免攻击的发生。XSS过滤需要在客户端和服务器端同时进行。
2、输入验证
输入验证就是对用户提交的信息进行有效性验证,仅接受有效的信息,阻止或忽略无效的用户输入信息。在对用户提交的信息进行有效性验证时,不仅要验证数据的类型,还要验证其格式、长度、范围和内容。
3、输出编码
由于大多数Web应用程序都会把用户输入的信息完整地输出到页面中,从而导致XSS漏洞的存在。为解决这一问题,当需要将一个字符串输出到Web网页,但又无法确定这个字符串是否包含XSS特殊字符时,为了确保输出内容的完整性和正确性,可以使用HTML编码(HTMLEncode)进行处理。