目录
---------------------------------------------------------------------------------------------------------------------------------
SQL读取文件漏洞
- SQL注入漏洞通常能让攻击者执行任意SQL语句,如果数据库配置不当或权限过宽,攻击者可以利用
LOAD_FILE()
(MySQL)或xp_fileexist
(SQL Server)等特定的函数来读取服务器上的文件。攻击者通过构造SQL注入语句,获取数据库服务器上敏感的文件,如配置文件(如/etc/passwd
,web.config
等)。
特权
- 读取数据比写入数据更为常见,写入数据严格保留给现代 DBMS 中的特权用户,因为它可能导致系统漏洞,我们将会看到这一点。
- 例如,在 中
MySQL
,DB 用户必须具有FILE
将文件内容加载到表中,然后从该表中转储数据并读取文件的权限。 - 因此,让我们首先收集有关数据库中用户权限的数据,以决定我们是否将文件读取和/或写入后端服务器。
- 例如,在 中
数据库用户
- 首先,我们必须确定我们在数据库中是哪个用户。
- 虽然我们不一定需要数据库管理员 (DBA) 权限才能读取数据,但这在现代 DBMS 中变得越来越必要,因为只有 DBA 才被授予此类权限。
- 这同样适用于其他常见数据库。
- 如果我们确实拥有 DBA 权限,那么我们拥有文件读取权限的可能性就更大。
查询用户权限
- 如果没有
- 那么我们必须检查我们的权限以查看我们可以做什么。
- 为了能够找到我们当前的 DB 用户
- 我们可以使用以下任何查询:
我们的UNION
注入payload如下:
cn' UNION SELECT 1, user(), 3, 4-- -
或者:
cn' UNION SELECT 1, user, 3, 4 from mysql.user-- -
这告诉我们当前的用户,在本例中是root
:
这是非常有希望的,因为 root 用户很可能是 DBA,这赋予我们许多特权。
用户权限
- 现在我们知道了我们的用户,我们可以开始寻找该用户拥有的权限。
- 首先,我们可以使用以下查询测试我们是否具有超级管理员权限:
代码:sql
cn' UNION SELECT 1, super_priv, 3, 4 FROM mysql.user-- -
再次,我们可以将以下有效负载与上述查询一起使用:
代码:sql
cn' UNION SELECT 1, super_priv, 3, 4 FROM mysql.user WHERE user="root"-- -
如果 DBMS 中有许多用户,我们可以添加WHERE user="root"
仅显示当前用户的权限root
:
代码:sql
cn' UNION SELECT 1, super_priv, 3, 4 FROM mysql.user WHERE user="root"-- -