用户
搜索
  • TA的每日心情
    开心
    2018-10-19 16:14
  • 签到天数: 279 天

    连续签到: 1 天

    [LV.8]以坛为家I

    i春秋作家

    Security Personnel

    Rank: 7Rank: 7Rank: 7

    153

    主题

    1335

    帖子

    2101

    魔法币
    收听
    0
    粉丝
    151
    注册时间
    2015-11-4

    幽默灌水王突出贡献春秋文阁春秋巡逻热心助人奖

    zusheng i春秋作家 Security Personnel 幽默灌水王 突出贡献 春秋文阁 春秋巡逻 热心助人奖 楼主
    发表于 2016-8-8 10:55:30 74421837
    本帖最后由 zusheng 于 2016-8-21 16:16 编辑

    作者:zusheng
    时间:2016年8月3日 12:11:50
    社区:i春秋

    前言
    不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动。在网络中,数据库驱动的Web应用随处可见,由此而存在的SQL注入是影响企业运营且最具破坏性的漏洞之一,这里我想问,我们真的了解SQL注入吗?看完本篇文章希望能让你更加深刻的认识SQL注入。

    目录


    第一节 注入攻击原理及自己编写注入点
    • 1.1、什么是SQL?
    • 1.2、什么是SQL注入?
    • 1.3、SQL注入是怎么样产生的?
    • 1.4、编写注入点

    第二节 寻找及确认SQL注入
    • 2.1、推理测试法
    • 2.2、and大法和or大法
    • 2.3、加法和减法






    正文





    • 第一节 注入攻击原理及自己编写注入点

    1.1、什么是SQL?
    SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统。SQL 语句用于取回和更新数据库中的数据。SQL 可与数据库程序协同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他数据库系统。

    1.2、什么是SQL注入?
    看起来很复杂,其实很简单就能解释,SQL注入就是一种通过操作输入来修改后台SQL语句达到代码执行进行攻击目的的技术。

    1.3、SQL注入是怎么样产生的?

    构造动态字符串是一种编程技术,它允许开发人员在运行过程中动态构造SQL语句。开发人员可以使用动态SQL来创建通用、灵活的应用。动态SQL语句是在执行过程中构造的,它根据不同的条件产生不同的SQL语句。当开发人员在运行过程中需要根据不同的查询标准来决定提取什么字段(如SELECT语句),或者根据不同的条件来选择不同的查询表时,动态构造SQL语句会非常有用。

    在PHP中动态构造SQL语句字符串:
    [PHP] 纯文本查看 复制代码
    $query = "SELECT * FROM users WHERE username = ".$_GET["ichunqiu"];


    看上面代码我们可以控制输入参数ichunqiu,修改所要执行SQL语句,达到攻击的目的。


    1.4、编写注入点
    为了照顾一下新人,这里先介绍一下涉及到的基础知识:
    [SQL] 纯文本查看 复制代码
    SQL SELECT 语法
    SELECT 列名称 FROM 表名称
    符号 * 取代列的名称是选取所有列

    [SQL] 纯文本查看 复制代码
    WHERE 子句
    如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。
    语法
    SELECT 列名称 FROM 表名称 WHERE 列 运算符 值

    下面的运算符可在 WHERE 子句中使用:
    i1.png

    了解了以上基础知识就让我们来自己编写注入点把。
    第一步:我们使用if语句来先判断一下变量是否初始化
    [PHP] 纯文本查看 复制代码
    <?php
    if(isset($_GET["ichunqiu"])){
        
    }
    ?>


    第二步:在if语句里面,我们连接数据库。在PHP中,这个任务通过 mysql_connect() 函数完成。
    [PHP] 纯文本查看 复制代码
    mysql_connect(servername,username,password);
    servername        可选。规定要连接的服务器。默认是 "localhost:3306"。
    username        可选。规定登录所使用的用户名。默认值是拥有服务器进程的用户的名称。
    password        可选。规定登录所用的密码。默认是 ""。


    第三步:连接成功后,我们需要选择一个数据库。
    [PHP] 纯文本查看 复制代码
    mysql_select_db(database,connection)
    database        必需。规定要选择的数据库。
    connection        可选。规定 MySQL 连接。如果未指定,则使用上一个连接。


    第四步:选择完数据库,我们需要执行一条 MySQL 查询。
    [PHP] 纯文本查看 复制代码
    mysql_query(query,connection)
    query        必需。规定要发送的 SQL 查询。注释:查询字符串不应以分号结束。
    connection        可选。规定 SQL 连接标识符。如果未规定,则使用上一个打开的连接。


    第五步:执行完查询,我们再对结果进行处理
    [AppleScript] 纯文本查看 复制代码
    mysql_fetch_array(data,array_type)
    data        可选。规定要使用的数据指针。该数据指针是 mysql_query() 函数产生的结果。
    array_type        
    可选。规定返回哪种结果。可能的值:
    MYSQL_ASSOC - 关联数组
    MYSQL_NUM - 数字数组
    MYSQL_BOTH - 默认。同时产生关联和数字数组


    题外话:我们使用echo将执行的SQL语句输出,方便我们查看后台执行了什么语句。
    [PHP] 纯文本查看 复制代码
    echo $querry


    最终代码如下:
    [PHP] 纯文本查看 复制代码
    if(isset($_GET["id"])){
        $con = mysql_connect("127.0.0.1:3306","root","root");
        if (!$con)
        {
            die('Could not connect: ' . mysql_error());
        }
        mysql_select_db("ichunqiu",$con);
        $querry = "select * from users where id = " . $_GET['id'];
        $sql = mysql_query($querry,$con);
        $result = mysql_fetch_array($sql);
    
        echo "<table class='itable' border='1' cellspacing='0' width='300px' height='150'>";
        echo "<tr>";
        echo "<td>id</td>";
        echo "<td>username</td>";
        echo "</tr>";
    
        echo "<tr>";
        echo "<td>".$result['id']."</td>";
        echo "<td>".$result['username']."</td>";
        echo "</tr>";
        echo "</table>";
        mysql_close($con);
        echo $querry;
    }
    ?>

    MySQL数据库实验环境配置:
    代码层工作已经做好,但是在数据库里面,我们还没有ichunqiu这个数据库啊,接下来我就带大家一步步创建数据库,创建表,创建列,插入数据。
    第一步:创建数据库

    i1.png

    第二步:创建表users和列id,username,password
    i1.png
    i1.png

    第三步:我们插入几条数据
    i1.png

    同样的道理,大家多插几条数据。到此我们整个任务就完成了。

    最终成果如下:
    i1.png

    • 第二节 寻找及确认SQL注入

    2.1、推理测试法
    寻找SQL注入漏洞有一种很简单的方法,就是通过发送特殊的数据来触发异常。


    首先我们需要了解数据是通过什么方式进行输入,这里我总结了三个:
    • GET请求:该请求在URL中发送参数。
    • POST请求:数据被包含在请求体中。
    • 其他注入型数据:HTTP请求的其他内容也可能会触发SQL注入漏洞。

    了解完数据的输入方式,我们接下来再学习数据库错误。这里我们以MySQL为例,其它的请大家自行学习咯。
    我们现在参数后面加个单引号,如下图:
    3.png




    sql语句最终变为
    [SQL] 纯文本查看 复制代码
    select * from users where id = 1' 

    执行失败,所以mysql_query()函数会返回一个布尔值,在下行代码中mysql_fetch_array($sql)将执行失败,并且PHP会显示一条警告信息,告诉我们mysql_fetch_array()的第一个参数必须是个资源,而代码在实际运行中,给出的参数值却是一个布尔值。
    我们修改代码在
    [PHP] 纯文本查看 复制代码
    $sql = mysql_query($querry,$con);下一行加上
    var_dump($sql);

    可以发现:
    3.png
    为了更好的了解MySQL错误,我们在
    [PHP] 纯文本查看 复制代码
    $sql = mysql_query($querry,$con);

    加上
    [PHP] 纯文本查看 复制代码
    if(!$sql)
        {
            die('<p>error:'.mysql_error().'</p>');
        }
    
    这样当应用捕获到数据库错误且SQL查询失败时,就会返回错误信息:(我们在参数中添加单引号返回的错误信息)
    [SQL] 纯文本查看 复制代码
    error:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1

    然后借助这些错误,我们这可以推断应该存在SQL注入。还有其他数据库错误信息,以及MySQL其他错误信息,由于篇幅问题就不一一讲解了。


    2.2、and大法和or大法
    页面不返回任何错误信息,我们就可以借助本方法来推断了,首先我们在参数后面加上 and 1=1和and 1=2看看有什么不同
    i1.gif
    可以发现and 1=1 返回了数据,而and 1=2没有,这是由于1=1是一个为真的条件,前面的结果是true,true and true 所以没有任何问题,第二个 1=2 是个假条件, true and false还是false,所以并没有数据返回。


    好,讲完and,我们自来看看 or ,or就是或者,两个都为假,才会为假。我们先把id改为5,可以发现id=5是没有数据的。


    3.png


    可以发现我们加上or 1=1就成功返回了数据,这是因为1=1为真,不管前面是不是假,数据都会返回,这样就把表里面数据全部返回,我们没看见,是因为代码中并没有迭代输出。这样,我们来修改一下代码。
    [PHP] 纯文本查看 复制代码
    echo "<table class='itable' border='1' cellspacing='0' width='300px' height='150'>";
            echo "<tr>";
            echo "<td>id</td>";
            echo "<td>username</td>";
            echo "</tr>";
            //遍历查询结果
            while ($result = mysql_fetch_array($sql)) {
            echo "<tr>";
            echo "<td>" . $result[0] . "</td>";
            echo "<td>" . $result[1] . "</td>";
            echo "</tr>";
        }

    然后你就可以发现:
    i1.gif
    2.3、加法和减法
    这里我们需要区分一下数字型和字符串型:
    • 数字型:不需要使用单引号来表示
    • 其他类型:使用单引号来表示
    综合上述,我们可以发现我们的例子是数字型的,这样我们就可以使用加法和减法来判断了。


    加法,我们在参数输入1+1,看看返回的数据是不是id等于2的结果,这里注意一下+号在SQL语句是有特效含义的,所以我们要对其进行url编码,最后也就是%2b。
    i1.gif
    减法是同样的道理,不过我们不需要对-号进行url编码了。
    i1.gif

    结束语
    感谢大家的支持吧,在此我也总结一下前面自己的不足,由于篇幅很长,宽度是到位了,但是并没有深入,也不算详细,所以本篇教程分为了三级即初级、中级、高级。六节来写,既要深度也要宽度,当然我也不是技术大牛,如文中有错误请指出,我会加以改正,谢谢。

    系列文章预告及导航

    渗透攻防Web篇-SQL注入攻击中级(状态:已更新)
    • 第三节 利用SQL注入
    • 第四节 SQL盲注利用

    渗透攻防Web篇-SQL注入攻击高级(状态:更新中)
    • 第五节 避开过滤方法总结
    • 第六节 探讨SQL注入防御技巧








    评分

    参与人数 6魔法币 +118 价值分 +15 收起 理由
    Unitary + 3 感谢发布原创作品,i春秋论坛因你更精彩!.
    icq7b64725h + 5
    acecttgd + 5 感谢发布原创作品,i春秋论坛因你更精彩!.
    AK_K + 3
    ZILLION + 2 感谢你的分享,i春秋论坛有你更精彩!.
    坏蛋 + 100 + 15 价值分奖励

    查看全部评分

    本帖被以下淘专辑推荐:

    Hacking the earth.My Blog:https://isbase.cc
    坏蛋 管理员 欢迎大家来春秋群找我玩
    来自 26#
    发表于 2016-8-10 10:38:37
    作者
    帖子链接
    评估分数(0-3分)
    原创性
    标题
    排版
    内容要求
    内容深度
    内容趣味性
    点评
    总分
    奖金
    zusheng
    渗透攻防Web篇-SQL注入攻击初级
    评估分数(0-3分)
    3
    2
    3
    2
    3
    2
    很基础,我想小白会很感谢你的
    15
    150元

    欢迎加入i春秋QQ群大家庭,每人只能任选加入一个群哦!
    投稿请加QQ:780876774。

    i春秋—楚:713729706
    i春秋—魏:687133802
    网安交流群:820783253
    使用道具 举报 回复
    发表于 2018-11-30 16:30:14
    本帖最后由 ___L 于 2018-11-30 17:46 编辑

    php7.0.0以后的mysql连接需要改写代码。这是为php版本高于7.0.0的同学写的。所以还没升级到这个版本的朋友请忽略掉这个回复。
    mysql拓展在php7.0.0以后已经被移除,毕竟楼主是在16年发的帖子,那时候的php大概是5.X所以还可以用。详情可以查看php官方文档(http://php.net/manual/zh/mysql.installation.php)。
    因此安装php7.0.0或更高版本的同学需要改写代码:
    [PHP] 纯文本查看 复制代码
    <?php
    if(isset($_GET["id"])){    
        // 新建数据库连接---主机名---数据库用户---密码----要连接的数据库。
        $con = new mysqli("127.0.0.1", "root", "password", "ichunqiu");
        if (!$con) {
            echo "无法连接至数据库。". mysqli_connect_errno();
            exit;
        }
        $query = "select * from users where id = ".$_GET["id"];
        $sql = $con->query($query);
        if(!$sql)
            echo mysqli_error($con);
        $result = $sql->fetch_assoc();
        echo "<table class='itable' border='1' cellspacing='0' width='300px' height='150'>";
        echo "<tr>";
        echo "<td>id</td>";
        echo "<td>username</td>";
        echo "</tr>";
     
        echo "<tr>";
        echo "<td>".$result['id']."</td>";
        echo "<td>".$result['username']."</td>";
        echo "</tr>";
        echo "</table>";
    
        mysqli_close($con);
    
        echo $query;
    }
    ?>
    

    这里使用的是php的MYSQLi拓展。顺便介绍php启用mysqli拓展的方法:
    • 修改php配置配置(linux是/etc/php/php.ini  ,windows就不知道了没装过= =)。去掉配置文档下面两条配置的注释:
    [Shell] 纯文本查看 复制代码
    extension=pdo_mysql
    extension=mysqli

    • 重启服务器的服务。


    遍历数据库那部分也需要改写代码
    毕竟使用的api都不一样了……改写后大概是这样子:
    [PHP] 纯文本查看 复制代码
    while($r = $sql->fetch_array(MYSQLI_NUM)) 
    	echo "<tr><td>".$r[0]."</td><td>".$r[1]."</td></tr>";
    




    垃圾的个人博客:caihoul.github.io
    使用道具 举报 回复
    发表于 2017-8-31 17:28:37
    主要是利用数据库的联合查询的特性,使用and或or连接符将查询关联,并通过查询的成功和失败判断插入字符是否被带入数据库进行执行,如果执行了我们就判断该点存在SQL注入。
    使用道具 举报 回复
    我今天搞了一个下午都不知道哪里出问题了 那个帮我解决 1.png 2.png 3.png 一下谢谢
    使用道具 举报 回复
    发表于 2017-2-27 09:23:25
    JDIT 发表于 2017-2-27 09:15
    那个  构建数据库是在本机构建吗  需不需要什么软件

    你搭建环境不就OK了,小白你就用phpstudy,傻瓜式构建环境
    Hacking the earth.My Blog:https://isbase.cc
    使用道具 举报 回复
    AV宅男 发表于 2018-9-4 17:49
    我今天搞了一个下午都不知道哪里出问题了 那个帮我解决一下谢谢

    php代码最上面少了一行<?php
    使用道具 举报 回复
    版本信息Apache 2.4.23 - PHP 5.6.25 - MySQL 5.7.14
    PHP 5.6.25 for CLI (Command-Line Interface)
    用or 1=1 的时候只能显示出一条数据
    使用道具 举报 回复
    发表于 2017-2-16 15:58:16
    DDDDDennis 发表于 2016-10-13 20:47
    那个浏览器插件叫啥吖? 那么长的地址栏的那个?

    hackbar
    Hacking the earth.My Blog:https://isbase.cc
    使用道具 举报 回复
    发表于 2017-2-27 09:15:13
    那个  构建数据库是在本机构建吗  需不需要什么软件
    使用道具 举报 回复
    坏蛋 管理员 欢迎大家来春秋群找我玩
    沙发
    发表于 2016-8-8 10:56:06
    光速沙发
    欢迎加入i春秋QQ群大家庭,每人只能任选加入一个群哦!
    投稿请加QQ:780876774。

    i春秋—楚:713729706
    i春秋—魏:687133802
    网安交流群:820783253
    使用道具 举报 回复
    可以的   赞赞赞
    使用道具 举报 回复
    赞一个,小白最喜欢这些文章了
    使用道具 举报 回复
    发表于 2016-8-8 11:04:52
    mark下,下午学习
    使用道具 举报 回复
    发表于 2016-8-8 11:45:04
    赞一个
    使用道具 举报 回复
    发表于 2016-8-8 11:46:38
    使用道具 举报 回复
    发表于 2016-8-8 12:14:33
    使用道具 举报 回复
    虽然是基础,但是也多谢楼主的一番好意
    rm -rf /
    使用道具 举报 回复
    发表于 2016-8-8 13:41:32
    详细  赞
    使用道具 举报 回复
    这么多赞,我要是不赞都不好意思了,,赞赞赞
    如果不曾开始,永远不会抵达
    使用道具 举报 回复
    发表于 2016-8-8 14:31:56
    赞赞赞···········
    使用道具 举报 回复
    发表于 2016-8-8 14:34:05
    本帖最后由 adanac 于 2016-8-8 14:51 编辑

    顶一下
    104751jhhmpus0scshsshc.gif

    评分

    参与人数 1魔法币 +5 收起 理由
    acecttgd + 5

    查看全部评分

    使用道具 举报 回复
    发表于 2016-8-8 15:01:09
    坐等更新
    使用道具 举报 回复
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册