zoukankan      html  css  js  c++  java
  • PostgreSql那点事(文件读取写入、命令执行的办法)

    PostgreSql那点事(文件读取写入、命令执行的办法)

    今天无意发现了个PostgreSQL环境,线上学习了下,一般的数据注射(读写数据库)差异不大,不做讨论,个人比较关心PostgreSQL的文件读取和命令执行方面。

    1,文件读取/写入
    PostgreSQL 8.1 以后提供了一组现成的文件操作函数 pg_logdir_ls()、pg_ls_dir()、pg_file_rename()、pg_file_write()、 pg_read_file()、pg_length_file(),用这些就可以胡作非为了?你错了。。。
    可以用这个函数直接读取/etc/passwd?实际情况下测试并未成功,因为pg_xxx这个adminpack将权限限制在了./postgresql/data下面。
    a)比如列目录

    p1

    b)读取权限允许的文件
    p2.png
    还有个写文件函数测试并未成功,而且只能像data下写也是满足不了需求的。
    c)比较可行的文件读取方案

    p3.png
    p4.png

    利用注射修改偏移值很快就可以遍历出来了,但是还是有点寒碜,直接读出全部数据

    p7.png
    d)写入文件

    p5.png
    读一下看看是否存在
    p6.png
    Bingo~

    2,命令执行
    这里大概有三种方式
    a)利用 libc 中的 system() 函数
    很多文章会让我们添加一个到libc库的自定义功能函数

    但是返回错误
    Error : ERROR:  incompatible library “/lib64/libc.so.6”: missing magic block
    HINT:  Extension libraries are required to use the PG_MODULE_MAGIC macro.

    这是因为当PostgreSQL加载外部动态库的时候,会检查MAGIC DATA,如果没有这个函数(Pg_magic_func),PostgreSQL认为这个动态库不是PostgreSQL可以使用的动态库。具体逻辑请 看 src/backend/utils/fmgr/dfmgr.c 中定义的 internal_load_library 函数源代码。
    这样一来就等同于建立了一个“白名单”,系统自带的库默认我不再允许动态加载,所以此路不通(也许低版本走的通,但我手里这个不行)。
    给一个 Pg_magic_func 代码样例:

    b)利用Perl/Python脚本语言功能
    在zone上看过一帖,http://zone.wooyun.org/content/1591,很纳闷为什么这样定义函数就可以执行系统命令,plperlu又是啥,经过资料的挖掘,发现是PostgreSQL自带的一种程序语言支持。
    具体可见这里(http://www.postgresql.org/docs/8.3/static/xplang.html)。
    大概意思就是PostgreSQL允许用除了SQL和C的其他语言来编写函数,但这个很悲剧啊,我的环境没有安装PostgreSQL的Python和Perl支持,待我弄个环境在来实现下过程。

    c)利用C语言自定义函数
    Perl、Python都能在PostgreSQL自定义了更不用说C了。这个在sqlmap的udf目录下有现成的,而且还是根据版本加了Pg_magic_func函数的,可以加载。。。牛鞭!

    将sqlmap的so文件转为16进制的代码,

    老他么长的一段,怎么还原成二进制的so库文件呢?这里感谢 @瞌睡龙 提供的Tips,这里用到了PostgreSQL的pg_largeobject“大对象数据”,官方原文:pg_largeobject 表保存那些标记着”大对象”的数据。 一个大对象是使用其创建时分配的 OID 标识的。 每个大对象都分解成足够小的小段或者”页面”以便以行的形式存储在 pg_largeobject 里。 每页的数据定义为LOBLKSIZE(目前是BLCKSZ/4,或者通常是 2K 字节)。

    a)查看PostgreSQL目录

    b)查询oid

    oid为当前对象大数据的标识符,我们要利用这个存储UDF文件内容。
    c)oid与上面保持一致

    等于变相清空”页面”,不要干扰库的生成
    d)把16进制的so文件塞进去

    e)利用PostgreSQL自带函数将大型对象导出到文件

    f)建立UDF

    g)调用这个UDF

    p8.jpg

    也许服务器没装PostgreSQL的Perl、Python支持,但是C库是通用的。

    相关文章《Postgresql注入语法指南》《postgresql读写文件和破解密码

    参考:
    [1]PostgreSQL SQL Injection Cheat Sheet
    http://pentestmonkey.net/cheat-sheet/sql-injection/postgres-sql-injection-cheat-sheet
    [2]OWASP Backend Security Project Testing PostgreSQL
    https://www.owasp.org/index.php/OWASP_Backend_Security_Project_Testing_PostgreSQL
    [3]PostGreSQL注入学习(续篇)
    http://www.hackol.com/news/201007270731289820885.shtml
    [4]PostgreSQL Adminpack
    http://www.postgresql.org/docs/8.4/static/adminpack.html
    [5]PostgreSQL 外部动态连接库魔法块的使用
    http://my.oschina.net/quanzl/blog/136907
    [6]Chapter 37. Procedural Languages
    http://www.postgresql.org/docs/8.3/static/xplang.html
    [7]postgresql “初级”注入大法
    http://zone.wooyun.org/content/1591
    [8]pg_largeobject
    http://www.php100.com/manual/PostgreSQL8/catalog-pg-largeobject.html

    link:http://zone.wooyun.org/content/4971

  • 相关阅读:
    又玩起了“数独”
    WebService应用:音乐站图片上传
    大家都来DIY自己的Blog啦
    CSS导圆角,不过这个代码没有怎么看懂,与一般的HTML是不同
    网站PR值
    CommunityServer2.0何去何从?
    网络最经典命令行
    炎热八月,小心"落雪"
    Topology activation failed. Each partition must have at least one index component from the previous topology in the new topology, in the same host.
    SharePoint 2013服务器场设计的一些链接
  • 原文地址:https://www.cnblogs.com/pshell/p/7791694.html
Copyright © 2011-2022 走看看