欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > 挖洞日记 | 记一次MSSQL注入绕waf过程

挖洞日记 | 记一次MSSQL注入绕waf过程

2025/11/11 14:02:08 来源:https://blog.csdn.net/zgz67611/article/details/148338206  浏览:    关键词:挖洞日记 | 记一次MSSQL注入绕waf过程

 在挖漏洞时,使用 xia sql 插件发现一个注入点,经过测试发现存在 waf 拦截记录一下。

在查询中发现单引号是空白页面,在加一个单引号,显示空数据,但是有回显,初步判断 pname 存在 SQL注入。

 

然后判断列数1'order by 9--无回显,1'order by 8--有回显,所以为 8 列。

像这种有回显、无回显,只能选择盲注,第一反应是时间盲注,那就要看是什么数据库,根据 asp 我们选择 mysql、sqlserver 数据库,不同的数据库,延时语句不一样。

mysql:sleep()

sql server:waitfor delay 0:0:8

但是输入 1'if(length(database())=6,sleep(3),0)-- 报错回显 502,说明存在 waf 拦截,经过测试 waf 拦截了 sleep()这个函数,那就避开 sleep()函数,先测试其他函数benchmark(),也被拦截。

在使用 length()判断数据库名称的长度时,没有 502,返回空白页面,说明 WAF 没有拦截,但是语法错误,怎么会错呢?

想了半天,应该时 SQL server 数据库,不支持 length()、database()函数,使用 len()、db_name()函数测试。

len()函数计算正确和错误,回显数据不一致,说明猜测正确,数据库类型为 SQL server。

那就先测出 db_name()数据库名称的长度。爆破出数据库名称长度为 15 位。

使用 sql server 数据库中的waitfor delay '0:0:8',发现还是被拦截,想到 db_name()和 len()没有被拦截,那就使用 substring()、ascii()函数一个一个计算数据库的字符。

?pName=1%27%20or%20ascii(substring(db_name(),1,1))>100--,使用二分法判断

?pName=1'or ascii(substring(db_name(),1,1))=104--,最后判断出 db_name 第一个字符为 104-----h

一个一个测是不可能的,直接写一个简单脚本跑一下。直接拿到数据库名称。

数据库得到了,接下来就按部就班的测试表的名称,计算第一个表的长度。

1'or%20len((select%20top%201%20name%20from%20sys.tables))%3D10--

第一个表的长度是 18,接下来就按部就班的使用脚本跑就可以。

申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关    

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词