我想写一个查询,它应该会产生以下细节:
主机, 港口, 用户名, 密码。
答案 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;