zoukankan      html  css  js  c++  java
  • sql注入

    一.原理

    SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。SQL注入是比较常见的网络攻击方式之一,是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。

    二.过程

    1.判断网站是否存在注入点

    (1)加入单引号 ' 提交

    结果:如果出现错误提示,则该网站可能存在注入漏洞

    (2)数字型判断是否有注入

    语句:and 1=1;and 1=2

    结果:分别返回不同的页面,说明存在注入漏洞

    (3)字符型判断是否有注入

    语句:' and '1'=1; ' and '1=2

    结果:分别返回不同的页面, 说明存在注入漏洞

    分析:加入' and '1'=1返回正确页面,加入' and '1=2返回错误页面,说明有注入漏洞

    2.利用错误消息提取信息

    (1)利用数据类型错误提取数据

    如果试图将一个字符串与非字符串比较,或者将一个字符串转换为另一个不兼容的类型,那么SQL 编辑器将会抛出异常。

    例如:

    SELECT * FROM user WHERE username = 'abc' AND password = 'abc' AND 1 > (SELECT TOP 1 username FROM users)
    

     错误提示:

     这就可以获取到用户的用户名为 root。

    利用此方法可以递归推导出所有的账户信息:

    SELECT * FROM users WHERE username = 'abc' AND password = 'abc' AND 1 > (SELECT TOP 1 username FROM users WHERE not in ('root'))

    通过构造此语句就可以获得下一个 用户名;若把子查询中的 username 换成其他列名,则可以获取其他列的信息。

    3.获取元数据

    SQL Server 提供了大量视图,便于取得元数据。可以先猜测出表的列数,然后用 UNION 来构造 SQL 语句获取其中的数据。

    SELECT *** FROM *** WHERE id = *** UNION SELECT 1, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES  

    一些常用的系统数据库视图:

    4.order by猜测列数

    SELECT * FROM users WHERE id = 1
    SELECT * FROM users WHERE id = 1 ORDER BY 1
    SELECT * FROM users WHERE id = 1 ORDER BY 2 
    SELECT * FROM users WHERE id = 1 ORDER BY 4   --异常,超出范围

    说明只有3列

    5.union 查询

    UNION 关键字将两个或多个查询结果组合为单个结果集,大部分数据库都支持 UNION 查询。但适用 UNION 合并两个结果有如下基本规则:

    • 所有查询中的列数必须相同
    • 数据类型必须兼容

    用 UNION 查询猜测列数
    不仅可以用 ORDER BY 方法来猜测列数,UNION 方法同样可以。

    在之前假设的 user 表中有 5 列,若我们用 UNION 联合查询:

    SELECT * FROM users WHERE id = 1 UNION SELECT 1

    数据库会发出异常:
    在这里插入图片描述
    可以通过递归查询,直到无错误产生,就可以得知 User 表的查询字段数:

    UNION SELECT 1,2
    UNION SELECT 1,2,3

    三.防止sql注入

          但凡有SQL注入漏洞的程序,都是因为程序要接受来自客户端用户输入的变量或URL传递的参数,并且这个变量或参数是组成SQL语句的一部分,对于用户输入的内容或传递的参数,我们应该要时刻保持警惕,这是安全领域里的「外部数据不可信任」的原则,纵观Web安全领域的各种攻击方式,大多数都是因为开发者违反了这个原则而导致的,所以自然能想到的,就是从变量的检测、过滤、验证下手,确保变量是开发者所预想的。

    1.检查变量数据类型和格式

    2.过滤特殊符号

    3.绑定变量,使用预编译语句

  • 相关阅读:
    mongodb复制集配置
    replication set复制集
    CentOS 6.5下源码安装MySQL 5.6
    10个最常见的 HTML5 面试题及答案
    Javascript中document.execCommand()的用法
    javascript 准确的判断类型方法
    getUserMedia API
    javascript
    C++ 面试题
    C++
  • 原文地址:https://www.cnblogs.com/xiuercui/p/13947710.html
Copyright © 2011-2022 走看看