SQL注入绕waf姿势:AND和OR被过滤了怎么办?

引言

嘿嘿,没有,单纯就想教会所有人绕WAF

需要准备的环境

1. sql-labs靶场

2. 安全狗WAF

3. 思考的思维(嘿嘿)

为什么写?

首先我们常说的八种符号:

and 、 &&、or 、 ||、xor 、 |、not 、 !

他们的关系是这样的:

and = &&、or = ||、xor = |、not = !

我不知道有多少人看过这个关系式子,但说实话,我在找绕waf的文章的时候,10篇文章有8篇文章都提到了这些。但却没有提到具体应该怎么用,愁啊 。因为也误导了我挺久,直到我真正下定决心开始绕WAF的现在,才弄明白一些东西。

以这八个常见的测试SQL点为题,给它一一的抽丝剥茧!!!

总而言之,言而总之,今天我们要将其掰开一个程度,进入一个深度,而不是只停留在公式化的关系上。

系列大饼

我打算从绕SQL注入点为开始,绕时间注入,绕注入数据库,绕注入数据库实际数据,一一的写过去,让所有人都能学会绕WAF(嘿嘿,不一定实现),因为之前写过一篇绕IF过滤的,感觉其实并不好,看完以后有人反馈学不到啥,所以我以后的文章都会实战结合~

你能获得什么

1.得到一个AND和OR的绕WAF的payload

2.得到一个NOT绕WAF的payload

3.学会绕WAF的思维

正式开始

先了解一些基础吧~

AND

要求两侧条件均为真才会返回结果
OR只需一侧条件为真即返回结果
XOR要求两侧条件一真一假才返回真
对 id 和 SLEEP(5) 的二进制值进行按位或运
! 反转右侧条件的结果。
NOT反转右侧条件的结果

当然这上面不重要,重要的看下面

知识点一:ANDOR和&&和||

场景:

SELECT * FROM WHERE id="$id" Limit 1,1

一个简单的SQL语句,时间注入探测SQL注入点:

1' or sleep(5)-- -

1' and sleep(5)-- -

区别在什么地方?

1743582976_67ecf7002beb6bc6f5ed3.png!small?1743582900473

1743582989_67ecf70da694014e3553b.png!small?1743582914158

你知道是为什么吗?

具体的解释可以图文解释可以参考:

SQL注入绕WAF姿势:当if被过滤了怎么办? - FreeBuf网络安全行业门户中的知识点四:IFNULL(a, b)语法

​**OR的本质**:相当于“无条件全选”,因 True 覆盖了所有可能性。

​**AND 的严格性**:必须所有条件同时满足,True 的存在仅作为冗余条件,不影响核心逻辑。

简单来说就是AND他只会检查id=1的这一行,OR他会检查这张表的所有行,检查一次执行一次sleep(5),这个表如果有10行,那么OR延时的就是10次,10*sleep(5),最终导致连接超时。


ANDOR还需要注意第二点是什么呢?那就是,除了返回10,还会返回一个null

AND --> 当所有操作数均为非零值且不为 NULL 时返回 1;任一操作数为 0 时返回 0;其他情况返回 NULL

OR --> 当任一操作数为非零值时返回 1;所有操作数为 0 时返回 0;若存在 NULL 且其他操作数非零则返回 1,否则返回 NULL


看解释就复杂了许多,其实并不是什么很难懂的东西

AND NULL 会使得整个条件的逻辑结果变为“未知”(即 UNKNOWN)

而 SQL 的 WHERE 子句仅接受“真”条件,因此会排除该行数据。

1743583082_67ecf76aad8c313a366fa.png!small?1743583007116

1743583087_67ecf76f12eddab09b6fe.png!small?1743583011518

主播主播,结果上没有区别呀?

嘿嘿,那我们开启安全狗的WAF试试。

1743583097_67ecf7793d62bd89cf462.png!small?1743583021602

1743583101_67ecf77d825256d759bcf.png!small?1743583026082

诶,这里是不是绕WAF了,是不是绕过了?对的,没错,这就是绕了安全狗的WAF成功探测到SQL注入点。

但这不是重点嗷,重点是我们可以明确两个概念:

ANDOR返回的不仅仅是10,还可能会返回null

null0不是一样的,null代表的是空

​示例查询 1:SELECT * FROM users WHERE id="1" AND 0

逻辑结果:0 导致条件恒假 → 无数据返回。

​示例查询 2:SELECT * FROM users WHERE id="1" AND NULL

逻辑结果:NULL 使条件变为“未知” → SQL 默认排除“未知” → 无数据返回。


可能有新手师傅不太理解

返回10,为什么很多人会称之为真和假、TrueFalse

这里就再提一次,引用一下我写的文章中的内容

SQL注入绕WAF姿势:当if被过滤了怎么办? - FreeBuf网络安全行业门户

1743583217_67ecf7f13ccc2038c63e5.png!small?1743583143361

所以正确的说法是,10相当于truefalse,是为了让别人更好的理解,并不是ANDOR真的会返回truefalse。

|| 和 && 也是同理。
1743583268_67ecf8246ef87d82c994b.png!small?17435831927371743583317_67ecf85510a69c9e23809.png!small?1743583241461

那么AND=&&, OR=|| 真的成立吗?不成立,他们是有区别的!优先级上的不同。但因为不是主要需要讨论的问题,所以这里就只是提一嘴~


知识点二:XOR 和 | 

| 是位运算符,对 id 和 SLEEP(5) 的二进制值进行按位或运

XOR| 在网络上,也常常被大家看到吧,关系是一个等于的符号XOR = |

但我们抽丝剥茧看看是不是一回事。

首先是XOR,两侧条件一真一假才返回真是我们大部分知道的,但如果两侧的条件同时为真呢?回返回假吗?

试试就知道了:

1743583478_67ecf8f62c34136b030a8.png!small?1743583402493

id=1存在为true0会被隐性的转换为false,那么一真一假,会返回真。那么就会查询id=1的字段

当然XOR返回的其实也是10,并不是truefalse

再理一遍逻辑:id='1'XOR 0 ,在表达式中,id=1是存在这行数据的,所以会返回1

# SQL注入 # waf绕过 # sql注入各种姿势 # sql注入之waf绕过 # sql注入原理
已在FreeBuf发表 0 篇文章
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
原始链接: https://www.freebuf.com/vuls/426424.html
侵权请联系站方: [email protected]

相关推荐

换一批