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

    渗透测试 EXP 639阅读 0评论

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

    前置知识可以参考 这里

    大概意思就是,register_globals 是 PHP 的一个特性,在 4.2.0 版本之前,它是默认启用的。

    当它启用的时候,PHP 会允许变量未初始化就使用(换言之在第一次使用的时候就是初始化的时候),这样就使得变量的来源变得不确定。

    于是就可能直接在 URL 以传参的方式(如 ?key=val)胁持变量初始化,若 PHP 代码没有考虑这种情况,就存在被入侵的风险。


    知道这个知识点后,回到这题。

    开启挑战后进入一个页面,但是找不到任何注入点。虽然说提示是 register_globals ,但是不知道应该挟持哪个变量也是于事无补。

    因此应该先想办法找到页面的 PHP 代码,从而找到可能被挟持的变量。


    注意到题目的另一个提示是(开发者经常留下备份文件):

    It seems that the developper often leaves backup files around...

    虽然不难测试到主页名称是 index.php ,但是要找到它的备份名称也不是容易的事情,只能靠猜。

    最终猜到备份页面名称为 index.php.bak (其实我真的很不喜欢猜文件名。。变成全凭运气解题好无语)

    下载 index.php.bak 后得到页面的 PHP 代码为:

    从代码不难分析到关键点是这段代码,当条件为真时,它会打印真正的密码 $hidden_password :

    而要令条件为真,可以利用 || 后面的的条件 (is_array(_SESSION) && _SESSION["logged"]==1 )

    即我们要通过 register_globals 挟持的变量是 _SESSION["logged"] ,并将其初始化为 1 。

    为此可以构造这样的 payload (测试发现双引号会被过滤,因此直接去掉亦可):

    http://challenge01.root-me.org/web-serveur/ch17/?_SESSION[logged]=1

    挟持变量成功,完成挑战。


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

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

    表情

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

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