superzed 发表于 2017-9-4 21:40:56

sql注入原理(POST)

0x00:sql注入原理
    SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,
        而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行
        攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数
        据,致使非法数据侵入系统。
      根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。
        前者由不安全的数据库配置或数据库平台的漏洞所致;
        后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。
        基于此,SQL注入的产生原因通常表现在以下几方面:
        ①不当的类型处理;
        ②不安全的数据库配置;
        ③不合理的查询集处理;
        ④不当的错误处理;
        ⑤转义字符处理不合适;
        ⑥多个提交处理不当。
       
0x01:sql注入形成的过程
    随着我国从互联网时代,到现在的物联网时代,计算机行业飞速发展,这方面的
人才需求也逐年增多,由于程序员水平层次不齐,没有安全意识,以及快速迭代导致
了,代码质量不高,给攻击者提供了便利,导致这样那样的安全事件层出不穷。
   先介绍一种架构B/S如下图所示:
      image.png
以Java为例简单的实现以下:
      表现层
       <form action="/superzedlv/login" method="post">
         用户名:<input name="name" size="20" type="text"><br><br>
         密码:<inputname="pass"size="20"type="password"><br><br>
         <input type="submit" value="登录">
      </form>
   应用层
      //从前端获取表单中的数据
      String name1=req.getParameter("name");
      //拼接sql语句
      String sql="select * from user where user='"+name1+"'";
   数据层
       执行sql语句查询数据
       select * from user where user=name;
0x02:利用漏洞
       首先我们确认漏洞,以上述为例我们传入的name拼接的时候变成了
       select * from user where user=‘name’;
       可以看到我们传入的数据被当做一个条件的值
       那么如果我们传入的条件是admin’ and 1=1 #那么会发生什么呢
       select * from user where user=‘admin’ and 1=1 #’
       #直接将后面的内容注释掉不执行
       结果是返回正确的,如果and后面的条件为假时返回错误
       那么说明我们后面的条件语句是执行的,也就意味着我们可以通过
       浏览器直接执行我们想要执行的sql语句(访问数据层),不需要任何权限。
       同样我们也可以通过这样admin' and 1='1语句绕过‘’
       select * from user where user=‘admin’ and 1=‘1’
       其实我们的目的就是构造可以执行的sql语句,获取信息
       下面我们就可以通过sql 语句获取其他信息了
       我们可以想一下我还有一个管理员表admin,存放着管理员信息
       那么我们就可以构造语句
       select * from user where user=‘name’ union select * from admin;
       直接查询管理员信息。
0x03:安全防护
       1)使用占位符
       2)对sql语句进行过滤
       3)不使用sql拼接的方式构造sql语句
       4)对参数类型进行限制
原文地址:http://www.superzedlv.cn/?id=5
未经允许,禁止转载
页: [1]
查看完整版本: sql注入原理(POST)