引言
读过上篇的朋友应该知道,我们使用了and和or的变种以及特性成功的绕过了WAF,并且有了两种姿势可以用来探测SQL注入点,但是有朋友会发现,上篇的内容都是建立在”有回显“的前提下的,那么这一章节主要讲的就是利用时间函数,延时注入来探测无回显的SQL注入点~
需要准备的环境
1. sql-labs靶场
2. 安全狗WAF
3. 思考的思维(嘿嘿)
为什么写?
因为写,想写,写的详细,让大家都能徒手绕waf。见一个绕一个!哈哈
时间注入这个地方的知识点其实非常非常的多,所以这个章节就主要的让大家学会如何构造新的时间注入函数,理解迪卡尔积和锁这两者是如何替代时间注入的。掰开心、掏出心、心连心,将我理解的东西细致的,掰开的,全部的,让各位师傅学会,让各位师傅成为绕waf的大手子。
但关于锁的部分,在本章节只是略微的提起,因为这个东西特别难讲,所以会单独开一章节时间锁的绕过~
系列大饼
我打算从绕SQL注入点为开始,绕时间注入,绕注入数据库,绕注入数据库实际数据一一的写过去,让所有人都能学会绕WAF(嘿嘿,不一定实现),因为之前写过一篇绕IF过滤的,感觉其实并不好,看完以后有人反馈学不到啥,所以我以后的文章都会实战结合~
你能获得什么
1.得到sleep()函数的绕waf的变体
2.得到关于如何构造时间函数的思路
3.学会了笛卡尔积的基本原理
4.学会了锁的基本原理
5.每个payload绝对真实可用,每个payload都配合截图存在,不用担心是烂文垃圾文~
6.至少获取五个绕WAF的payload语句
7.每个涉及的函数掰开揉碎的讲解
正式开始
知识点一:SLEEP()函数
sleep函数大家都很熟悉了,那么直接讲它的基础触发逻辑
SLEEP(N) 的触发取决于查询实际返回的行数:
当查询结果包含 M 行时,SLEEP(N) 会对每行数据执行一次,总延迟时间为 M*N 秒。
若查询无结果(如 WHERE 条件不满足),则 SLEEP(N) 不会触发,总执行时间接近 0 秒。
什么意思呢?给大家看一个例子:
首先看看emails表中有什么数据,一共八行数据
然后我们想查询id=1的数据
SELECT * FROM `emails` WHERE id=1
这个不难理解吧,那加上sleep函数
为什么返回了一秒?因为有一行数据,符合条件,也就是触发取决于查询实际返回的行数。
那么我们查询id为0的情况呢?
没有匹配,所以没有花费时间。
那么直接SELECT sleep(1) FROM `emails` 呢?
就会超时,因为表中有多少行就会触发多少次延迟,最终导致响应超时~(当然这里只是这么理解,具体原因如果说8秒就超时响应肯定是不严谨的,有兴趣可以深究其机制~)
那么这个有什么用呢?
有的有的,还记得上一章的逻辑OR SLEEP(5)的逻辑吗?
有的有的,还记得上一章的逻辑OR SLEEP(5)的逻辑吗?
SELECT * FROM users WHERE id = '1' AND SLEEP(5); 触发了一次5秒
SELECT * FROM users WHERE id = '1' OR SLEEP(5); 有多少行触发了多少次5秒
这两个逻辑是有差别的。
OR SLEEP(5); --> 有多少行触发了多少次sleep(1) --> 是因为使用OR,会对表中的每一行进行检查,从而导致了检查一行,执行一次延迟
SELECT sleep(1) FROM `emails` --> 有多少行触发了多少次sleep(1) --> 则是因为了满足了查询条件从而造成的多次延时
逻辑概念不要混淆了~
大致理解了sleep函数,我们就可以进行,注释符号绕过
注释符号
相信大家最常见的注释符号绕过的姿势是这两种:
/**/ --> 代替空格
/*!50530 SELECT * FROM users */--> /*! SELECT * FROM users */--> 可执行注释
这里其实就有一个点值得注意了:如果你使用第一种方式,你在MYSQL后台是复现不出来的,例如:
会忽略掉这个空格。至于原因,我也不清楚~,大家注意点就好。
然后我们来讲解一下注释~
类型 |
语法 |
特点 |
适用场景 |
单行注释 |
(--) |
-- 注释内容 |
需空格或控制符 行尾简短说明 |
单行注释 |
(#) |
#注释内容 |
无需空格 快速注释或调试 |
多行注释 |
/* */ |
注释内容 |
跨行、不可嵌套 复杂逻辑解释 |
可执行注释 |
/*!版本号 ... */ |
版本条件执行 |
版本兼容性控制 |
一共有四种类型,什么叫单行注释:
可能有人对这个东西没有一个概念,我举个好玩的例子
发现报错的点了嘛?1111,没有2222?
诶,我移动过去以后,为什么又只有21111,这21111为什么没有被注释掉?%0a是一个换行符。
我们拆分一下这个场景
看到了嘛?%0a就代替了这个换行~,好玩吧,现在理解单行注释是什么了吧~
多行注释当然没有这个烦恼啦~
其他的注释就是顾名思义啦,也就不多说。
而我们要学习绕waf用的其实就只有两个机制:
1. /* 和 */ 之间的绝大多数字符(包括特殊符号、字母、数字、空格、换行符等)均会被 MySQL 解析器忽略。
2. MySQL 的解析器对非关键字符(如无效注释符号)具备 容错性,会自动跳过不影响语法结构的冗余符号
第一个机制什么意思?那就可有意思了~
深刻不深刻,好不好理解~
你想在/*xxx*/的xxx种fuzz什么字符就fuzz什么字符,随便fuzz随便写~(当然可能有些字符不行)
例如:
诶两个/*/*没问题,那么三个呢?/*/*/*
为什么?记得注释是什么开启,什么结束嘛?/*开启,*/结束
分析这个报错语句/*/*/是不是完成了一次注释闭合,剩下的就是:*dasdlk--))($%@kanxc123zc><*/and 1=2
少了什么?少了一个/
所以:/*/*//*dasdlk--))($%@kanxc123zc><*/and 1=2
正常执行。好玩吧
第二个机制会自动跳过不影响语法结构的冗余符号
什么意思?很简单的啦~,例如:
可以这样
还可以这样,简单吧
对非关键字符(如无效注释符号)具备 容错性,这个又怎么理解
不能这样:
也不能这样
简单来说,就是不能在函数的连续关键词里,进行操作,所有的添加位置都不能影响函数关键字的连续性。
其实这个机制,很好理解,例如:
理解了吧?只要换行,不打断关键函数的连续性,就可以正常的执行语法,而注释也是一样的~
那么我们的第一个绕waf的payload其实就诞生啦
首先使用普通的payload:
被拦截了惨!!!随便搞一个注释:
还是拦截了,惨!!!!!!
那么随便搞注释的基础上随便混淆呢?
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)