dvwa代码审计

dvwa代码审计

Brute Force爆破

low

得到用户名$user、密码$pass,MD5加密,进入数据库查询匹配。只进行了密码的MD5加密

存在注入,也没有次数限制,可以暴力破解。

例:admin'or'1'='1 、‘$pass’

Medium

$user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); 
else {     // Login failed    
    sleep( 2 );
    echo "Username and/or password incorrect.";   
} 

isset判断非空函数,

mysqli_real_escape_string字符串特殊字符的转义(\x00、\n、\r、\、'、"、\x1a)

  • 将$users和$pass变量中的特殊字符进行了过滤
  • sleep(2)每运行一次程序休眠2秒,给爆破增加了时间

High

$user = stripslashes( $user );
$pass = stripslashes( $pass );
generateSessionToken();
sleep( rand( 0, 3 ) );

stripslashes()剥离反斜杠字符的函数

增加了token动态令牌的验证

sleep随机0-3秒休眠

总结:high主要区别就是过滤了字符串的反斜杠,增加了令牌验证。sleep还是休眠只是增加了爆破的时间,没有限制次数。还是可以用爆破来解决。

Command Injection(ping)

low

stristr函数,搜索字符串在另一字符串中首次的出现

判断点击按钮submit,得到IP,拼接执行ping xxx,显示结果。无任何过滤。

可以在后面拼接其他命令行代码,如:127.0.0.1&&net user

Medium

$substitutions = array(     '&&' => '',     ';' => '',   );   
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );

增加了黑名单过滤,

str_replace为字符串替换函数。在$target中将$substitutions黑名单替换为空值。

只过滤了&&和;号,但是还有很多可以代替的符号,如’||‘,127.0.0.1||net user ,黑名单很难全面。

High

$substitutions = array(
		'&'  => '',
		';'  => '',
		'| ' => '',
		'-'  => '',
		'$'  => '',
		'('  => '',
		')'  => '',
		'`'  => '',
		'||' => '',
	);

只是扩充了黑名单的数量,感觉并没有什么变化。

而且'| ' => '',这个名单多了一个空格,你用一个|还是可以使用。

sqli

low

点击事件sunbmit,获取ID,查找数据库信息

mysqli_fetch_assoc函数从结果取得一行作为关联数组

没有过滤,与数据库通信,可以实现注入

Medium

$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);

mysqli_real_escape_string 对ID实现了字符串特殊字符的转义,

但是这个注入是数字型,可以不使用‘ ’和“ ”。毫无作用

High

$query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";

虽然代码变少了,但是写入数据库语句编译时加上了limit限制,

limit 1,只选择0-1的参数进行检索,后面的语句无效。

xssdoc

medium

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;
	}
}

array_key_exists() 函数检查某个数组中是否存在指定的键名,如果键名存在则返回 true,如果键名不存在则返回 false。

stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)。

过滤掉了

posted @ 2020-05-03 16:02  admin刍狗  阅读(696)  评论(0编辑  收藏  举报