zoukankan      html  css  js  c++  java
  • CTF伪协议+preg_replace()函数的代码执行

    一道学习中所遇到的ctf

    步骤:

    我们点击题目链接,然后在页面先点击”云平台后台管理中心“

     然后url后面跟了参数page,题目提示了一个文件包含,我们试试index.php

     看到了输出了ok,应该是进行了当前目录下的文件读取,也就造成了文件包含,我们在试试用file读取windows的固定文件

    c:/windows/win.ini

     但是现在我们并不知道路径以及当前目录下的flag文件的文件名,输入index.php不能打开文件内容,但是输出了ok,那么出题者思路应该 是让我们把index.php打开来审计。既然存在了文件包含,可以成功执行file伪协议,那么我们尝试一下php伪协议,有一个用法是读取php文件内容

    payload是:?page=php://filter/read=convert.base64-encode/resource=xxx.php,将xxx.php换成index.php

     成功执行了此协议,此php协议的用法是将index.php文件读取并以base64显示出来,直接拿去base64解码

     解出来还有很多html代码,但是php的就这一段,首先要让请求头里面的x-forwarded-for的值为”127.0.0.1“

    那么我们先用burp抓个包并发送到repeater,

     发现并没有x-forwarded-for服务,那么我们加上”x-forwarded-for: 127.0.0.1“,如果成功则返回:

     ”Welcome My Admin ! Please include me in!“字样

     发现成功回显,那么我们在看看下面的代码,先让if生效,将所需的get参数全部加上,然后看到了preg_replace()函数,就是php中匹配正则表达式的函数,函数里面的参数值分别由三个get参数传参。

    而preg_replace()函数里面的第一个和第二个参数存在一个代码执行漏洞,第一个参数的值是一个正则表达式,只要这个值等于:/(.*)/e,那么第二个参数就可以进行代码执行,且第三个参数可以是任意值。

    这就是preg_replace的"/e"漏洞

    这三个参数可以 通过get请求的参数传参,因此我们对三个get请求参数的值改成这样:?pat=/(.*)/e&rep=phpinfo()&sub=ab

     成功代码执行

    现在我们读目录文件,直接用system()函数

     这就知道了隐藏flag的文件的路径和文件名了,原来整个这么复杂的文件名,猜是肯定猜不到的

    接下来直接利用此题的文件包含漏洞读取文件,可以用file协议加文件的整个路径,也可以page后面直接跟文件名读取,txt文件应该可以直接读出内容,因为刚刚试了page后面跟的文件是对当前目录下的文件读取。

     成功读取出flag!

    本篇贴子只为记录学习而写,总结的思路如果有问题请指明,谢谢各位大佬!


  • 相关阅读:
    linux内核中GNU C和标准C的区别
    linux内核中GNU C和标准C的区别
    Getting start with dbus in systemd (02)
    Getting start with dbus in systemd (01)
    Getting start with dbus in systemd (03)
    物理内存相关的三个数据结构
    数据类型对应字节数(32位,64位 int 占字节数)
    Linux kernel 内存
    共模电感的原理以及使用情况
    [原创]DC-DC输出端加电压会烧毁
  • 原文地址:https://www.cnblogs.com/-chenxs/p/11593878.html
Copyright © 2011-2022 走看看