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

  • 相关阅读:
    【23设计模式】总结
    【JAVA】内部类,内部接口
    【JAVA】接口
    【JAVA】抽象类,抽象方法
    【JAVA】类加载器
    【JAVA】枚举
    【JAVA】序列化
    【JAVA】异常笔记
    汇编笔记_第十一章
    汇编笔记_第十章
  • 原文地址:https://www.cnblogs.com/xuyiqing/p/10363760.html
Copyright © 2011-2022 走看看