zoukankan      html  css  js  c++  java
  • Kali学习笔记42:SQL手工注入(4)

    前三篇文章都是在讲发现SQL注入漏洞

    如何查询得到所有的信息

    那么另一条思路还未尝试过:能否修改数据?

    例如这样:

    '; update users set user='yiqing' where user='admin

    理论上是会成功的,由于DVWA编写BUG,导致无法执行

    实战中,可以这样直接修改数据

    可以修改,那么就可以插入数据:

    '; INSERT INTO users (' user_id',' first_name',' last_name',' user','password','avatar') VALUES ('35','yiqing','xu','xyq','5f4dcc3b5aa765d61d8327deb882cf99','OK'); -- 

    更恶意的人可以删库:

    '; DROP TABLE users; -- 

    由于DVWA的编写问题,这些示例都不能成功

    可以这样说:正式由于程序员水平不够,阴差阳错防止了一部分SQL注入

    到这里其实基本的手工SQL注入就说完了

    实战中,SQL注入考验的是一个人的综合素质

    以及对数据库本身的了解程度

    一个人如果是SQL注入方面的大师,那么他一定是数据库方面的专家

    接下来对DVWA三种SQL注入的源码进行分析:

    低级别:

    <?php    
    
    if(isset($_GET['Submit'])){
        
        // Retrieve data
        
        $id = $_GET['id'];
    
        $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
        $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
    
        $num = mysql_numrows($result);
    
        $i = 0;
    
        while ($i < $num) {
    
            $first = mysql_result($result,$i,"first_name");
            $last = mysql_result($result,$i,"last_name");
            
            echo '<pre>';
            echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
            echo '</pre>';
    
            $i++;
        }
    }
    ?>

    分析:

    没有对输入做任何过滤,直接放入SQL语句

    最后对结果进行输出

    缺陷:

    1.对输入没有任何过滤

    2.如果查询失败,直接返回数据库错误信息,不妥

    中级别:

    <?php
    
    if (isset($_GET['Submit'])) {
    
        // Retrieve data
    
        $id = $_GET['id'];
        $id = mysql_real_escape_string($id);
    
        $getid = "SELECT first_name, last_name FROM users WHERE user_id = $id";
    
        $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
        
        $num = mysql_numrows($result);
    
        $i=0;
    
        while ($i < $num) {
    
            $first = mysql_result($result,$i,"first_name");
            $last = mysql_result($result,$i,"last_name");
            
            echo '<pre>';
            echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
            echo '</pre>';
    
            $i++;
        }
    }
    ?>

    分析:使用函数:

    mysql_real_escape_string()
    

     对输入进行过滤

    这个函数的作用:给非法字符'"/%#等字符前面加上转义符号:

    还有一个地方存在问题:SQL语句没有使用拼接的方式,所以SQL注入不需要单引号进行闭合

    新版本的PHP语言采用其他函数:MySQLi,PDO_MYSQL

    结论:

    1.SQL注入漏洞还是存在,而且会报错,理论上可以避免一部分SQL注入

    2.无意义代码:既然过滤了单双引号,那么为什么要改SQL语句,使得不需要引号就可以注入

    3.依然可以SQL注入,有方法绕过输入过滤

    注入方式:

    其实注入比刚才反而简单了:比如查所有的表

    0 union select table_name,table_schema from information_schema.tables

    高级别:

    <?php    
    
    if (isset($_GET['Submit'])) {
    
        // Retrieve data
    
        $id = $_GET['id'];
        $id = stripslashes($id);
        $id = mysql_real_escape_string($id);
    
        if (is_numeric($id)){
    
            $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
            $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
    
            $num = mysql_numrows($result);
    
            $i=0;
    
            while ($i < $num) {
    
                $first = mysql_result($result,$i,"first_name");
                $last = mysql_result($result,$i,"last_name");
                
                echo '<pre>';
                echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
                echo '</pre>';
    
                $i++;
            }
        }
    }
    ?>

    分析:

    首先函数

    stripslashes()

    去掉字符

    然后再进行中级别的特殊字符转义

    这些都是小问题,之所以高级别,在于下面这个函数:

    is_numeric()

    如果输入不是一个数字,那么什么都不执行

    结论:很安全,几乎不可能找到SQL注入漏洞

    到这里SQL手工注入就完成了

    后边将说一说SQL盲注和SQL自动注入,以及神器SQLMAP

  • 相关阅读:
    e621. Activating a Keystroke When Any Child Component Has Focus
    e587. Filling Basic Shapes
    e591. Drawing Simple Text
    e595. Drawing an Image
    e586. Drawing Simple Shapes
    e636. Listening to All Key Events Before Delivery to Focused Component
    在 PL/SQL 块的哪部分可以对初始变量赋予新值? (选择1项)
    Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)
    你判断下面语句,有什么作用?(单选)
    Oracle数据库表空间与数据文件的关系描述正确的是( )
  • 原文地址:https://www.cnblogs.com/xuyiqing/p/10363760.html
Copyright © 2011-2022 走看看