DVWA(xss部分源码分析)

前言

DVWA靶场都不陌生,最新学习xss,从新又搞了一遍xss部分,从源码方面康康xss的原因,参考了很多大佬的博客表示感谢
更多web安全知识欢迎访问:https://lmg66.github.io/

环境配置

官网:http://www.dvwa.co.uk/
下载地址:https://github.com/ethicalhack3r/DVWA
下载方式:zip下载或git https://github.com/ethicalhack3r/DVWA
下载完成放入http服务下即可
我使用的是phpstudy下载地址:https://m.xp.cn/

反射性xss

级别low

查看源码:
Hello ' . $_GET[ 'name' ] . '
'; } ?>
分析

name变量没有过滤,直接输出

payload

/vulnerabilities/xss_r/?name=

分析

lang变量通过document.location.href来获取url,并没有过滤就输入到了option标签中
DVWA(xss部分源码分析)_第7张图片
DVWA(xss部分源码分析)_第8张图片

payload

DVWA(xss部分源码分析)_第9张图片

级别:Medium

查看源码:

分析

对default变量进行了过滤,通过stripos()函数查找在default中的位置(不区分大小写),如果匹配到,则变为default=English,但是可以使用其他标签来绕过,先要闭合和标签
DVWA(xss部分源码分析)_第10张图片
DVWA(xss部分源码分析)_第11张图片

payload:
/vulnerabilities/xss_d/?default=English 
/vulnerabilities/xss_d/?default=English

DVWA(xss部分源码分析)_第12张图片
DVWA(xss部分源码分析)_第13张图片

级别:high

查看源码:

分析

使用白名单,进行匹配,如果值不为就default=English,但是只是对default进行了过滤,可以使用其他变量,document.location.href来获取url,仍然会输出到标签中显示,当然也可以用注释符号#

payload:
/vulnerabilities/xss_d/?default=English&a=
/vulnerabilities/xss_d/?default=English&a=?default=English&a=
/vulnerabilities/xss_d/?default=English#
/vulnerabilities/xss_d/?default=English#)

DVWA(xss部分源码分析)_第14张图片
DVWA(xss部分源码分析)_第15张图片
DVWA(xss部分源码分析)_第16张图片
DVWA(xss部分源码分析)_第17张图片

级别:impossible

查看源码:
# For the impossible level, don't decode the querystring
$decodeURI = "decodeURI";
if ($vulnerabilityFile == 'impossible.php') {
	$decodeURI = "";
}
分析:

如果是impossible难度则decodeURI="",意思就是不解码,那么标签就会被过滤,无法闭合标签和创建新标签,所以无法xss
DVWA(xss部分源码分析)_第18张图片

存储型xss

级别:low

查看源码:
' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' ); //mysql_close(); } ?>
分析:trim()函数 stripslashes() 函数 mysqli_real_escape_string() 函数只是对/类型的处理过滤转码,主要是对数据库的保护并未设计的xss的内容,故可以直接xss

DVWA(xss部分源码分析)_第19张图片
DVWA(xss部分源码分析)_第20张图片
DVWA(xss部分源码分析)_第21张图片

payload
name:Lmg66
message:

DVWA(xss部分源码分析)_第22张图片

级别:medium

查看源码:
', '', $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( '
' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' ); //mysql_close(); } ?>
分析:

对name用str_replace()是区分大小写的,可以大写绕过,只是匹配了一次可以嵌套绕过,也可以使用其他的标签
对message,addslashes()函数在预定字符加/,strip_tags()函数剥去字符串中HTML,XML,以及php标签,htmlspecialchars()函数预定的函数转换为HTML实体,基本都过滤和转义了,所以突破name变量,name变量限制了输出长度,要F12更改name的maxlength
DVWA(xss部分源码分析)_第23张图片
DVWA(xss部分源码分析)_第24张图片
DVWA(xss部分源码分析)_第25张图片
DVWA(xss部分源码分析)_第26张图片

payload:
name:
message:Lmg66
name:cript>alert('xss')
message:Lmg66
name:
message:Lmg66

级别:high

查看源码:
' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' ); //mysql_close(); } ?>
分析:

对message和上一个一样,没希望突破,对name来说preg_replace( '/<(.)s(.)c(.)r(.)i(.)p(.)t/i', '', $name )之前反射型xss见过,不区分大小写,通配符过滤,可以使用其他标签,name同样限制了长度,F12改一下maxlength="100"

payload:
name:
message:Lmg66

级别:impossible

查看源码:
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();

?>
分析:

对name和message都进行了严格过滤

你可能感兴趣的:(DVWA(xss部分源码分析))