• 如果您想对本站表示支持,请随手点击一下广告即可~
  • 本站致力于提供原创、优秀的技术文章~
  • 有任何疑问或建议 均可以在站点右侧栏处 通过各种方式联系站长哦~
  • CTF – RootMe解题报告 [Web-Server : PHP preg_replace()]

    渗透测试 EXP 55阅读 0评论

    挑战入口:Root-Me(https://www.root-me.org/en/Challenges/Web-Server/PHP-preg_replace)
      分类目录:Link to …(http://exp-blog.com/2019/01/02/pid-2597/12/)

    挑战的提示就是利用 PHP 的 preg_replace() 函数读取 flag.php 文件的源码。


    关于 preg_replace() 函数的语法定义,可以参考 这里

    简单来说,这是正则替换函数,语法如下:


    在本题中,用到的只有前 3 个参数 $pattern$replacement$subject ,最后的两个可选参数可无视掉。

    开启挑战页面后,有三个输入框,每个输入框对应的参数如下:

    • search => $pattern
    • replace => $replacement
    • content => $subject

    尝试输入正常的参数,发现页面输出了替换后的字符串,但是会对特殊字符做过滤,说明函数的输出不是利用点。


    其实在正则表达式中是有多种模式的,如:

    • /i 模式:不区分大小写
    • /g 模式:全局匹配
    • /m 模式:多行匹配
    • /e 模式:将替换串中的内容当作代码来执行
    • ……

    其中 /e 模式是 PHP 语言特有的,这也是这题的解题关键。

    关于 preg_replace() 函数漏洞的利用,可以参考 这里

    简而言之,要触发 preg_replace() 漏洞有两个前置条件:

    • 第一个参数 $pattern 需要 /e 模式,使得第二个参数 replacement 在替换前可以作为命令代码执行
    • 第一个参数 $pattern 必能能够匹配到第三个参数 subject (否则 preg_replace() 函数会返回 subject 而不会执行 replacement 命令)

    例如构造这样的参数就不会执行 phpinfo() 命令(因为 /test/e 不匹配 just exp ):

    preg_replace('/test/e', 'phpinfo()', 'just exp');

    而构造这样的参数就可以执行 phpinfo() 命令(因为 /test/e 匹配 just test ):

    preg_replace('/test/e', 'phpinfo()', 'just test');


    那么要读取 flag.php 文件,只需要把 phpinfo() 命令改成 file_get_contents("flag.php") 即可。

    file_get_contents 是 PHP 读取文件内容的函数。

    亦即可以构造 payload 为:

    • search => /test/e
    • replace => file_get_contents("flag.php")
    • content => just test

    成功得到密码,完成挑战。


    转载请注明:EXP 技术分享博客 » CTF – RootMe解题报告 [Web-Server : PHP preg_replace()]

    喜欢 (1) 分享 (0)
    发表我的评论
    取消评论

    表情

    Hi,您需要填写昵称和邮箱!

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址