美文网首页
2018-05-08 漏洞1SQL注入

2018-05-08 漏洞1SQL注入

作者: labixx | 来源:发表于2018-05-08 15:08 被阅读0次

    SQL注入的三种类型:
    数字型
    分析注入产生的原因:

    访问测试地址:

    http://192.168.3.35/sql/shuzi/index.php?id=1

    输出页面

    image.png

    查看源码文件

    <html>
    
    <head>
    
    <meta charset="utf-8" />
    
    <title>sql注入测试</title>
    
    <style>
    
    body{text-align:center}
    
    </style>
    
    </head>
    
    <body >
    
    <br />
    
    <?php
    
        include "./conn.php";
    
        $id=@$_GET['id'];//id未经过滤
    
        if($id==null){
    
            $id="1";
    
        }
    
        mysql_query('set names utf8');
    
        $sql = "SELECT * FROM sqltest WHERE id=$id";//定义sql语句并组合变量id  
    
        $result = mysql_query($sql,$conn);//执行sql语句并返回给变量result
    
        if(!$result)
    
        {
    
            die('<p>error:'.mysql_error().'</p>');
    
        }
    
        echo "<font size='10' face='Times'>sql注入测试</font></br>";
    
        echo "<table border='2'  align=\"center\">";
    
        echo "<tr><td>id</td>";
    
        echo "<td>标题</td>";
    
        echo "<td>内容</td>";
    
        echo "</tr>";
    `
        //遍历查询结果
    `
         while ($row = mysql_fetch_array($result))
    
        {
    
        if (!$row){
    
            echo "该记录不存在";
    
            exit;
    
        }
    
                echo "<tr>";
    
                echo "<td>".$row[0]."</td>";
    
                echo "<td>".$row[1]."</td>";
    
                echo "<td>".$row[2]."</td>";
    
                echo "</tr>";
    
        }
    
        echo "<td  colspan=\"3\" >sql语句:&nbsp;>".$sql."</td>";
    
        echo "</table>";
    
        ?>
    
    <a href='./admin.php'>点我进入后台</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    
    <a href='http://pmd5.com/'>md5解密可以点我</a>
    
    </body>
    
    </html>
    

    $id=@$_GET['id'];//id未经过滤 接受参数id的值,ID的值没有做任何限制的情况下输出到下面sql语句中并带入数据库进行执行

        if($id==null){
    
            $id="1";
    
        }
    
        mysql_query('set names utf8');
    
        $sql = "SELECT * FROM sqltest WHERE id=$id";//定义sql语句并组合变量id  
    
        $result = mysql_query($sql,$conn);//执行sql语句并返回给变量result
    
    操作相当于直接在数据库执行SQL语句,并输出到页面。
    
    SELECT * FROM sqltest WHERE id=1
    

    利用方法:

    1.判断方法:

    正常访问

    image.png

    1.单引号直接报错

    主要是因为单引号在大部分数据库中作为分隔符,所以当单引号带入数据库内就会导致数据库内sql语句被截断导致数据库错误返回。

    image.png

    2.and 1=1 和 and 1=2 返回数据不同的判断

    (原理:1=1 为true的条件,1=2 为false的条件,and 连接前面查询为真的条件形成 true and true 和 true and false 两种判断。)

    image.png image.png

    Or 也是使用上面的方法进行判断,但当在数字后输入or 1=1为永真条件,所以返回应该是所有的数据,or 1=2 返回的为真条件查询的结果。

    image.png image.png

    3.加减法判断,加减法的判断主要是用于判断sql注入为数字型和字符型。也可以根据参数后的数字和字符进行判断。

    但因为+号在sql语句中有特俗含义所以需要使用url编码%2b 减号则不用。

    image.png image.png

    字符型
    字符型

    源码:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html>
    
    <head>
    
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>sql</title>
    
    </head>
    
    <body bgcolor="">
    
    <font size="3" color="#000000">
    
    <?php
    
      $name=$_GET['username'];
    
      $conn=mysql_connect("127.0.0.1","root","root");
    
      if($conn){
    
        echo "连接数据库成功!";
    
      }
    
      echo "<br>";
    
      mysql_select_db('test',$conn);
    
      $sql="select * from user where username = '$name'";
    
      $result=mysql_query($sql);
    
      while($row = mysql_fetch_array($result))
    
        {
    
           echo "用户ID:".$row['id']."<br >";
    
           echo "用户名:".$row['username']."<br >";
    
           echo "用户密码:".$row['password']."<br >";
    
           echo "用户邮箱:".$row['email']."<br >";
    
        }
    
         mysql_close($conn); //关闭数据库连接
    
       echo "<hr>";
    
       echo "你当前执行的sql语句为:"."<br >";
    
       echo $sql;
    
    ?>
    
    </body>
    
    </html>
    

    数据库:

    -- phpMyAdmin SQL Dump
    
    -- version phpStudy 2014
    
    -- http://www.phpmyadmin.net
    
    --
    
    -- 主机: localhost
    
    -- 生成日期: 2017 年 11 月 01 日 07:19
    
    -- 服务器版本: 5.5.53
    
    -- PHP 版本: 5.4.45
    
    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
    
    SET time_zone = "+00:00";
    
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    
    /*!40101 SET NAMES utf8 */;
    
    --
    
    -- 数据库: `test`
    
    --
    
    -- --------------------------------------------------------
    
    --
    
    -- 表的结构 `user`
    
    --
    
    CREATE TABLE IF NOT EXISTS `user` (
    
      `id` int(3) NOT NULL AUTO_INCREMENT,
    
      `username` varchar(10) COLLATE utf8_unicode_ci NOT NULL,
    
      `password` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
    
      `email` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
    
      PRIMARY KEY (`id`)
    
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ;
    
    --
    
    -- 转存表中的数据 `user`
    
    --
    
    INSERT INTO `user` (`id`, `username`, `password`, `email`) VALUES
    
    (1, 'admin', '3f230640b78d7e71ac5514e57935eb69', 'asaass@qq.com'),
    
    (2, 'admin1', 'e10adc3949ba59abbe56e057f20f883e', '123@123.qq.com'),
    
    (3, 'asaass', 'e10adc3949ba59abbe56e057f20f883e', 'asd123@qq.com'),
    
    (4, 'asaass', 'asaass123', 'asaass@qq.com');
    
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
    

    原理:

    $query="select user from users where username='$_GET['name']'"; 
    

    数据库执行的语句为

    select user from users where username='name'
    

    当开发人员对用户的输入过滤不严,造成了用户可以通过输入SQL语句控制数据库,就会产生SQL注入漏洞。

    基于字符型的SQL注入即存在SQL注入漏洞的URL参数为字符串类型(需要使用单引号表示)

    字符注入区别于数字注入的主要区别在于sql语句的闭合

    注入的实现在于跳出字符串的限制,实现sql语句在执行

    字符型和数字型的区别:

    字符:除数字之外都是字符

    数字:0-9

    两种SQL语句的区别:

    数字型: SELECT 列 FROM 表 WHERE 数字型列=值

    字符型: SELECT 列 FROM 表 WHERE 字符型列=’值’

    注入点的判断:

    返回正确和错误进行判断,1=1返回正常页面,1=2 错误返回错误页面。表示存在

    username=xxx' and 1=1 --'
    
    username=xxx' and 1=2 --'
    

    或者

    uername=xxx' and '1'='1
    
    uername=xxx' and '1'='2
    

    或者

    username=admin' or '1'='1     返回其他查询信息
    
    username=admin' or '1'='2     返回正常页面相等  注:返回数据多少判断是否存在
    
    image.png image.png

    搜索型

    源码:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html>
    
    <head>
    
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>搜索型注入</title>
    
    </head>
    
    <body bgcolor="">
    
    <font size="3" color="#000000">
    
    <?php
    
      $pwd=$_GET['pwd'];
    
      $conn=mysql_connect("127.0.0.1","root","root");
    
      if($conn){
    
        echo "连接数据库成功!";
    
      }
    
      echo "<br>";
    
      mysql_select_db('test',$conn);
    
      $sql="select * from user where password like '%$pwd%' order by password";
    
      $result=mysql_query($sql);
    
      while($row = mysql_fetch_array($result))
    
        {
    
           echo "用户ID:".$row['id']."<br >";
    
           echo "用户名:".$row['username']."<br >";
    
           echo "用户密码:".$row['password']."<br >";
    
           echo "用户邮箱:".$row['email']."<br >";
    
        }
    
         mysql_close($conn); //关闭数据库连接
    
       echo "<hr>";
    
       echo "你当前执行的sql语句为:"."<br >";
    
       echo $sql;
    
    ?>
    
    </body>
    
    </html>
    

    1.原理:

    首先我们看SQL语句:

    select * from user where password like '%asaass123%' order by password
    

    执行的sql语句带入字符因为通过%%通配符匹配模糊查询,想要执行SQL语句需要跳出搜索字符的限制。然后构造后执行SQL语句。

    2.判断搜索型注入的方法:

    1 搜索keywords‘,如果出错的话,有90%的可能性存在漏洞;

    2 搜索 keywords%,如果同样出错的话,就有95%的可能性存在漏洞;

    3 搜索keywords% 'and 1=1 and '%'='(这个语句的功能就相当于普通SQL注入的 and 1=1)看返回的情况

    4 搜索keywords% 'and 1=2 and '%'='(这个语句的功能就相当于普通SQL注入的 and 1=2)看返回的情况

    5 根据两次的返回情况来判断是不是搜索型文本框注入了

    %'and 1=1 and '%'='
    
    %' and 1=1--'
    
    %' and 1=1 and '%'='
    
    image.png

    相关文章

      网友评论

          本文标题:2018-05-08 漏洞1SQL注入

          本文链接:https://www.haomeiwen.com/subject/wzxwrftx.html