DVWA使用教程(SQL injection)(七)

DVWA使用教程(SQL injection)(七)

DVWA是一个用来练习Web渗透的PHP应用。共有十个模块,分别是
1.Brute Force(爆破)
2.Command Injection(命令注入)
3.CSRF(跨站请求伪造)
4.File Inclusion(文件包含)
5.File Uplod(文件上传)
6.Insecure CAPTCHA(不安全的验证码)
7.SQL Inj(SQL注入)
8.SQL B Inj(SQL盲注)
9.XSS-ref(反射型xss)
10.xss-stored(存储型xss)

一、简介
SQL注入漏洞是一种常见的漏洞。利用SQL注入漏洞去查询记录,会造成数据泄露,如果泄露的数据中含有管理员密码,还可能导致拖库发生。

二、功能特点
SQL注入漏洞往往是因为对用户输入过滤不严。SQL注入漏洞多是高危漏洞,会导致严重的后果。验证漏洞时,为了提高效率,经常会先尝试使用sqlmap自动化工具辅助判断,但手工注入比自动化工具可以发现更多的注入点。

三、各防护等级简介
low等级,对SQL注入行为毫无设防。
medium等级,对SQL注入行为防护不足,防护做法欠考虑。
hight等级,对SQL注入行为有一定防护,但有疏忽。
impossible等级,对SQL注入行为正确防护。

四、基础知识补充

整型注入与字符型区别:
当输入的内容为数字时,可能存在整型注入,也可能存在字符型注入。
区别在于,整型不需要单引号来闭合,而字符型需要通过单引号来闭合的。
可以简单的理解为,不需要考虑单引号如何闭合则为整型注入,其他情况均是字符型。

information_schema:信息数据库,保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表名,表列的数据类型与访问权限等。
mysql_real_escape_string():实现转义7种危险字符。SQL 语句字符串中的特殊字符,如输入单引号’则处理时会在其前面加上右斜杠\来进行转义,如果语句错误则输出相应的错误信息。其中受影响的字符如下:\x00  \n  \r  \  '  "  \x1a


记住下面几个词的含义及用法。
几个常出现的单词:
1.information_schema.tables:存储着MySql中的所有表。
2.information_schema.columns:存储着MySql中的所有列。
3.table_schema是数据库的名称。
4.table_name是具体的表名。
5.table_type指的是表的类型。
6.group_concat(0x3e,xxx):连接多个字段成一个字段。
7.union操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。

五、low代码模块剖析
概述:low等级,对SQL注入行为毫无设防。

<?php 
if( isset( $_REQUEST[ 'Submit' ] ) ) { 
    // Get input 
    $id = $_REQUEST[ 'id' ]; 
    // Check database 
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"; 
    $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>' );
    // Get results 
    while( $row = mysqli_fetch_assoc( $result ) ) { 
        // Get values 
        $first = $row["first_name"]; 
        $last  = $row["last_name"]; 
        // Feedback for end user 
        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>"; 
    } 
    mysqli_close($GLOBALS["___mysqli_ston"]); 
} 
?> 

根据代码可以得知:
1.接收到参数输入后,不经过任何的过滤和检查,拼接到查询语句,然后将查询到的所有结果返回。
2.根据代码可知,构造的SQL语句只需保证引号正常闭合,T-SQL语法正确,即可成功查询数据。
3.注入测试语句举例:【1' or 1=1#】【1 and 1=2'union select database(),2#】。
4.完整SQL语句为:
【select first_name,last_name from users where user_id = '1' or 1=1#'】
【select first_name,last_name from users where user_id = '1 and 1=2'union select database(),2# '】
尝试注入:


 

六、medium代码模块剖析
概述:medium等级,对SQL注入行为防护不足,防护做法欠考虑。

<?php
if( isset( $_POST[ 'Submit' ] ) ) {
    // Get input
    $id = $_POST[ 'id' ];
    $id = mysql_real_escape_string( $id );
    // Check database
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
    $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
    // Get results
    //... 
}
?>

根据代码可以得知
1.输入框变下拉框,使用post提交,输入参数存在简单的转义。
2.用户输入部分使用mysql_real_escape_string()函数转义(‘,“,\r,\n,NULL等)
3.转义仅针对7个字符,如果注入语句中不含这些字符则不受影响。且也可用hex编码绕过,实在鸡肋。
4.过滤措施仅对字符型注入有影响,对数字型注入无影响。
5.中级代码相比低级代码,在拼接id到T-SQL语句时,少了单引号!
6.注入测试语句举例:【1 or 1=1】【1 and 1=2 union select database(),2】
7.完整SQL语句为:
【select first_name,last_name from users where user_id = 1 or 1=1】
【select first_name,last_name from users where user_id = 1 and 1=2 union select database(),2】

尝试注入:

 
 
 

七、High代码模块剖析
概述:hight等级,对SQL注入行为有一定防护,但有疏忽。

<?php 
if( isset( $_SESSION [ 'id' ] ) ) { 
    // Get input 
    $id = $_SESSION[ 'id' ]; 
    // Check database 
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;"; 
    $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>Something went wrong.</pre>' ); 
    // Get results 
    while( $row = mysqli_fetch_assoc( $result ) ) { 
        // Get values 
        $first = $row["first_name"]; 
        $last  = $row["last_name"]; 
        // Feedback for end user 
        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>"; 
    } 
    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);         
} 
?>  

根据代码可以得知
1.高级代码相比中级代码,输入参数不存在转义。
2.高级代码相比中级代码,在拼接id到T-SQL语句时,多了单引号。
3.高级代码相比中级代码,SQL语句末尾多了limit,限制只返回第一条记录。(可注释绕过)
4.高级代码的输入页面与结果回显页面是两个页面,本意是想防自动化工具,但仍可用second-order命令绕过限制。
6.注入测试语句举例:【1' or 1=1#】【1' and 1=2 union select database(),2#】
7.完整SQL语句为:
【select first_name,last_name from users where user_id = '1' or 1=1#'】
【select first_name,last_name from users where user_id = '1' and 1=2 union select database(),2#'】

尝试注入:


     

八、Impossible代码模块剖析
概述:impossible等级,对SQL注入行为正确防护。

<?php 
if( isset( $_GET[ 'Submit' ] ) ) { 
    // Check Anti-CSRF token 
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); 
    // Get input 
    $id = $_GET[ 'id' ]; 
    // Was a number entered? 
    if(is_numeric( $id )) { 
        // Check the database 
        $data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' ); 
        $data->bindParam( ':id', $id, PDO::PARAM_INT ); 
        $data->execute(); 
        $row = $data->fetch(); 
        // Make sure only 1 result is returned 
        if( $data->rowCount() == 1 ) { 
            // Get values 
            $first = $row[ 'first_name' ]; 
            $last  = $row[ 'last_name' ]; 
            // Feedback for end user 
            echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>"; 
        } 
    } 
} 
// Generate Anti-CSRF token 
generateSessionToken(); 
?> 

根据代码可以得知
1.相比高级代码,多了token检查。
2.使用get方法获取参数,参数必须为数字。
3.使用PDO方式查询数据,实现命令与数据分离更安全。

九、小结
SQL注入漏洞是最常见的漏洞,主要用自动化工具验证漏洞,当然手动验证也需掌握。主要分6步:1.判类型,2.猜列数,3.确定顺序,4.获当前库,5.获所有表、字段名,6.下载数据。
防范SQL注入漏洞最实用的做法为使用安全的查询方式实现命令与数据分离,java中可用PrepareStatment,c#可用parameter,php可用pdo。


 

发布了96 篇原创文章 · 获赞 172 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/ai_64/article/details/93379581