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、 、 、、'、"、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() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)。
过滤掉了