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

zy.21

PHP(续)

PHP代码执行漏洞

1.PHP中代码漏洞的概念

代码执行漏洞就是在代码中若存在eval、assert等能将所接收的参数作为代码去执行,并且拼接的内容可被访问者控制,也就是把传入的参数给拼接进去了,造成了额外的代码执行,也就造成了代码执行漏洞。(大概原理:原本正常访问/?method=method1,eval接收到参数,拼接出来的代码是(newTestController())->method1();",正常调用method1。但如果传入的参数是method1();phpinfo,那么拼接出来的代码就是“(new TestController())->method1(); phpinfo();"运行的结果就很有意思了,除了method1被调用了以外ohpinfo也被调用执行了。)

2.PHP代码执行漏洞函数

(1)eval,(assert)

直接把输入的字符串作为PHP代码去执行。eval结尾需要用;号结束,assert不用,现在不用assert了,现在主要用于断言条件是否为真

(2)call_user_func

call_user_func ($_GET ['req'] ) ; // /?req[]=TestController&req[]=method1

这样输入,得到参数为['TestController','method1'],而如果只是单纯地访问/?req=phpinfo,调用的就是phpinfo。

(3)array_walk. array_map. array_filter 

具体用法参考我的另一篇文章array_walk. array_map. array_filter -CSDN博客

array_walk对每个元素执行回调函数,直接改变原数组

array_map可以一次性处理多个数组返回一个新的数组,原数组不变

array_filter过滤数组元素

等效于

PHP反序列化漏洞

1.PHP的类与对象

类像是一个模板,对象是通过这个模板做出来的,属性和方法是模板规定的创建出来的对象所有的性质(这是我大概的理解应该没错吧,具体概念很晦涩就不写了)

2.PHP的序列化与反序列化

存储和与其他程序交换这些类所实例化出来的对象用的两个函数serialize(序列化)和unserialize(反序列化)

把一个对象转换成一段文本(可传输),而转换的这个过程就叫序列化还可以进行包裹,例子

反序列化并将对象放到变脸p中得到age

3.PHP中的反序列化漏洞

在构造一个对象时,如果想要给对象动态设置一些初始

属性,就需要在类的定义中添加一个叫构造方法的方法,在PHP中这个方法叫_construct。同样,在程序结束运行,对象被销毁时也可以定义一个在此时会被调用的方法,叫析构方法。在PHP中这个方法叫_destruct。destruct这个方法在程序运行结束,对象被销毁时被调用,对象被销毁的标志(1)unset()(2)在函数内部有new关键词创建对象

我还学习了其他魔术方法,具体知识内容写到了我的另一篇文章中PHP中的魔术方法-CSDN博客

对魔术方法进一步利用:反序列化出来一个对象,对象中的属性我们可控,那么就只要程序运行结束,对象被销毁,那么我们就可以操控这些函数的调用,让它执行我们想要执行的代码或者命令了

在目标上反序列化出这样一个对象有两种方式:

(1)直接控制unserialize函数的参数值,很少见,但只要能控制,就可以随心所欲反序列化出我们想要的对象

(2)通过文件操作函数来进行反序列化的操作,如file_get_contents、file_exist等函数。倘若它们的参数可控,不仅可以读取到任意文件的内容,同时也可以进一步扩展,达到RCE等目的  例如

unserialize($_GET['a']);                                             echo file_get_contents($_GET['a']);  

关于PHAR压缩文件(由PHP文件构成的压缩文件):可控的对象+可以利用的魔术方法就构成了我们对于反序列化漏洞的利用 ,简单来说,就是可以在这个压缩文件中存储一个对象,当这个压缩文件被PHP读取时,就会反序列化这个对象,那么如果这个对象有析构函数或者是其他的魔术方法定义,则在特定的时机(如程序运行结束时)就会被调用,进行一些删除文件等恶意操作

相关例题强网杯 2019 Upload(代码审计、反序列化、thinkphp5,附代码审计详解)_[强网杯 2019]upload-CSDN博客


http://www.mrgr.cn/news/90117.html

相关文章:

  • 无界构建微前端?NO!NO!NO!多系统融合思路!
  • Python(pymysql包)操作MySQL【增删改查】
  • 上拉触底案例
  • Java/Kotlin双语革命性ORM框架Jimmer(一)——介绍与简单使用
  • [MRCTF2020]Ez_bypass1(md5绕过)
  • 收集的面试资料
  • DeepSeek从入门到精通:全面掌握AI大模型的核心能力
  • GPU — 8 卡 GPU 服务器与 NVLink/NVSwitch 互联技术
  • 攻防世界32 very_easy_sql【SSRF/SQL时间盲注】
  • 【MQ】Spring3 中 RabbitMQ 的使用与常见场景
  • 【MQ】RabbitMQ 高可用延时功能的探究
  • 0 Rust与Qt集成实践指南(CXX-Qt)
  • 使用Redis实现业务信息缓存(缓存详解,缓存更新策略,缓存三大问题)
  • 【学Rust写CAD】5 三维转换矩阵解析及应用示例
  • MySQL数据库 - 阶段性体系总结
  • SQL自学,mysql从入门到精通 --- 第 1 天,系统环境搭建,mysql部署
  • 9.JVM-方法区
  • Java/Kotlin 使用 Chrome 无头浏览器
  • 免费windows pdf编辑工具Epdf
  • 【centos安装mysql数据库】详细版
  • SQL自学,mysql从入门到精通 --- 第 15天,数据导入、导出
  • QT-常见问题
  • 数据结构-find()-判断字符串s1中是否包含字符串s2
  • VirtualBox中Ubuntu 22.04网卡配置以及解决过程中遇到的问题
  • 【C++学习篇】C++11第二期学习
  • Docker 1. 基础使用