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

    过滤掉了

  • 相关阅读:
    redis的其他命令
    redis的有序集合ZSET(stored set)
    redis 的set数据类型
    redis 的hash数据类型
    php命令
    intellij idea
    生产者消费者问题
    JAVA sleep和wait 异同
    JAVA线程通信
    java线程同步--lock锁(JDK 5 新增)
  • 原文地址:https://www.cnblogs.com/kbhome/p/12822239.html
Copyright © 2020-2023  润新知