初识SQL注入之漏洞原理及如何发现

一、SQL注入的概念

  • SQL注入原理:

    所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

  • 漏洞产生条件:

    1. 提交的内容和web程序之间具有变量传递,且传递的变量值可控
    2. 变量带入数据库进行查询

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?php

    $id=$_GET['x'];//接受get传递的参数名x的值并赋值给变量id

    $conn=mysql_connect('127.0.0.1','root','root');//连接数据库并赋值连接请求给变量conn
    mysql_select_db("xiaodi",$conn);//选择连接请求conn下的数据库xiaodi
    $sql="select * from news where id = $id";//接受的变量id组合sql语句
    $result=mysql_query($sql);//执行sql命令并返回结果给变量result
    while($row = mysql_fetch_array($result)){//将结果进行显示
    echo "用户ID:".$row['Id']."<br >";
    echo "文章标题:".$row['title']."<br >";
    echo "文章内容:".$row['content']."<br >";
    }
    mysql_close($conn);//关闭数据库连接
    echo "当前执行的sql语句:".$sql;//输出sql命令

    ?>
  • 漏洞应用范围:

    获取数据库里的数据,操作数据库

  • 漏洞发现与挖掘

    发现是在没有没有源码的情况下,利用手工探针或者扫描工具进行寻找注入点

    而挖掘是在有源码的情况下通过代码审计的方式挖掘漏洞

    挖掘出来的漏洞在网站上不一定有,而在网站上找到的漏洞在源码中一定有

  • 漏洞利用需知

二、SQL注入点的发现

1)关于网站

  • 分目录站点

    www.xxx.com

    www.xxx.com/bbs/

    www.xxx.com/OA/

  • 分端口站点

    112.223.111.20

    112.223.111.20:8080

    112.223.111.20:8000

  • 二级域名站点

    www.xxx.com

    admin.xxx.com

    bbs.xxx.com

分站点越多,找到SQL注入点的机会也就越大,不要局限于眼前的一个站点,要主动搜集分站点的信息。

2)手工探针

针对上述示例代码,正常的访问语句应该类似为:

127.0.0.1/test/sqlin.php?x=1

我们采用流传已久的127.0.0.1/test/sqlin.php?x=1 and 1=1127.0.0.1/test/sqlin.php?x=1 and 1=2进行测试,它们分别对应的SQL语句为:

select * from news where id=1 and 1=1 真 and 真 = 真,页面显示正常

select * from news where id=1 and 1=2 真 and 假= 假,页面显示不正常

页面对我们构造的语句产生了区别反应,说明其确实像我们期望的那样将我们额外输入的内容带入到了SQL语句中进行查询,这时就可以认为存在SQL注入漏洞

那么就一定要是and 1=1 和 and 1=2吗,其实不然,上面解释的很清楚,只要页面对我们的正常输入和额外内容输入产生了区别对待,一个显示正常,一个显示不正常,额外输入的内容对返回结果产生了影响即可。因此我们的额外内容可以随便输入什么,比如127.0.0.1/test/sqlin.php?x=1 asdfg

显示正常的页面:

显示不正常的页面:

3)工具扫描

例如awvs、appscan、w3af等

三、SQL注入攻击方式及思路?

  • 数据库类型:注入是去操作数据库的,而不同数据库具有不同的属性和功能,因此注入的思路和方式会随着数据库类型的不同而不同
  • 参数提交方式:不管参数以何种方式提交,只要哪里出现参数,我们就在哪里写注入语句,比如在地址栏或者在抓取到的数据包中。
  • 参数数据类型:由于接收的变量具有数据类型,比如int或者string类型,string类型就需要主动闭合引号,避免我们的注入语句全部被当做字符串处理
文章作者: TechOtaku
文章链接: http://techotaku.me/2018/04/25/初识SQL注入之漏洞原理及如何发现/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 徒然の博客