PostgreSQL查询获取当前密码

时间:2018-06-07 17:44:42

标签: postgresql

我想写一个查询,它应该会产生以下细节:

主机, 港口, 用户名, 密码。

3 个答案:

答案 0 :(得分:1)

您可以获取当前连接的服务器地址inet_server_addr()和端口inet_server_port()(但不是服务器侦听的所有地址和端口)。如果您想获得会话用户,可以使用current_user(或session_user)获取当前用户。 (见"9.25. System Information Functions"

密码位于pg_catalog.pg_authid.rolpassword。但普通用户可能没有查询pg_catalog.pg_authid的权限。即使他们这样做,密码很可能是MD5哈希,这是不可逆转的。 (见"50.8. pg_authid

但如果你手头有很多(真的很多!),你可能想尝试用递归CTE对密码哈希进行强力攻击。

所有这些都会导致类似:

WITH RECURSIVE c(c)
AS
(
SELECT chr(s.i) c FROM generate_series(97, 122) s(i)
UNION ALL
SELECT concat(c.c, chr(s.i))
       FROM c
            CROSS JOIN generate_series(97, 122) s(i)
       WHERE length(concat(c.c, chr(s.i))) <= 4
)
SELECT inet_server_addr() "host",
       inet_server_port() "port",
       current_user "username",
       c.c "password"
       FROM pg_catalog.pg_authid pgai
            INNER JOIN c c
                       ON pgai.rolpassword = concat('md5', md5(concat(c.c, current_user)))
                          AND pgai.rolname = current_user;

将生成的单词和使用过的字符的最大长度更改为您要尝试的内容。此示例使用所有小写字母和长度为4的单词。

(但请注意,你应该把它当作一个笑话。考虑如何在SQL中做这样的事情很有趣。但是,对于一个好的密码,使用所有的印刷品并且长度足够,你肯定是不想等待查询结束。;))

答案 1 :(得分:0)

您可以使用

获取登录用户和当前活动的角色
SELECT session_user, current_user;

您可以使用

获取客户端地址和端口
SELECT client_addr, client_port
FROM pg_stat_activity
WHERE pid = pg_backend_pid();

您可以使用

获取服务器端口
SHOW port;

无法使用SQL查找服务器地址。

答案 2 :(得分:0)

您无法显示当前密码。

要显示当前用户,服务器主机和端口使用:

SELECT CURRENT_USER, inet_server_addr( ), inet_server_port() port;