Kali Linux Web渗透:DVWA SQL注入漏洞“手工注入”第4篇(40)

前面三篇文章都是在讲发现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 user(),null

0 union select user(),null

 

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

0 union select table_name,table_schema from information_schema.tables

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注入漏洞。

    A+
发布日期:2019年11月20日 14:34:56  所属分类:Kali Linux 新手教程
最后更新时间:2019-11-20 20:45:57
评分: (1 票;平均数5.00 ;最高评分 5 ;用户总数1;总得分 5;百分比100.00)
头像
SEO顾问 单站最低999元 整站全方位优化
SEO顾问 单站最低999元 整站全方位优化
  • ¥ 999元
  • 市场价:4999元
免费SSL证书 HTTPS申请 安装 配置 支持通配符*
免费SSL证书 HTTPS申请 安装 配置 支持通配符*
  • ¥ 1999.9元
  • 市场价:20000元
花牛苹果 甘肃天水 李宏恩家自种 1斤 包邮
花牛苹果 甘肃天水 李宏恩家自种 1斤 包邮
  • ¥ 6.8元
  • 市场价:8.8元
wordpress站群服务 泛解析二级域名 二级目录
wordpress站群服务 泛解析二级域名 二级目录
  • ¥ 1999.9元
  • 市场价:8999元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: