代码审计-TP5框架及无框架变量覆盖反序列化

QQ截图20220406100108.jpg

Metinfo-变量覆盖

QQ截图20220412085631.jpg

点击自动审计,可以结合来fortify进行审计

QQ截图20220412085724.jpg

在这里发现疑似变量覆盖漏洞,对于漏洞的筛选,最好是在程序的配置性文件中,应为很多函数执行时,都会调用配置性文件。

QQ截图20220412085752.jpg

变量覆盖漏洞的函数extract(),parse_str(),import,request,variables(),$$,全局搜索$$时,发现很多选项,优先看配置文件

QQ截图20220412085837.jpg

foreach循环3个元素,然后通过$$_request解析成$_COOKIE,$_POST,$_GET再进行遍历,片段键的第一个字符不是_,然后将键作为变量名,将值赋给该变量,这就提供了变量覆盖漏洞

QQ截图20220412085858.jpg

common一般都是公共文件,所有文件都会引入该文件配合include,如果在include的引入路径中存在变量就可以利用该漏洞修改该变量,然后可以利用网站中的上传漏洞上传木马,然后getshell

QQ截图20220412090439.jpg

比如原先:include $filename;我们将$filename覆盖掉,覆盖为我们上传的包含一句话的JPG图片,让图片以PHP的格式执行 搜索文件包含漏洞的关键函数:include,include_once,require,require_once

QQ截图20220412090655.jpg

比如,这里只有变量,但是没有包含变量覆盖漏洞的文件就不行(但是也不一定,应为说不定module.php包含了common.inc.php,或者它包含的文件包含了common.inc.php等等)

QQ截图20220412090848.jpg

打开module.php文件查看,发现包含了common.inc.php

QQ截图20220412090904.jpg

由于这个CMS网站没有文件上传的地方,就直接在about目录下创建1.txt

QQ截图20220412091238.jpg

经过了module.php

QQ截图20220412092613.jpg

我们的目的是让引入的木马执行,所以尽可能跳过分支判断,这里$fmodule传入7

  • payload:http://127.0.0.1:8789/about/index.php?fmodule=7&module=1.txt

QQ截图20220412093952.jpg

phpmydmin-无框架-反序列化

攻击环境要求:phpMyAdmin版本:早于2.11.9.5的2.11.x和早于3.1.3.1的3.x;

QQ截图20220412094246.jpg

搜索反序列化关键函数:serialize(),unserialize(),__construct,__destruct

QQ截图20220412094318.jpg

$_POST['configuration']存在,并且变量action不等于clear,就调用反序列化函数

QQ截图20220412094350.jpg

php魔术方法,反序列化会触发__wakeup()

  • __wakeup() : 使用unserialize()时触发
  • __sleep() : 使用serialize()时触发
  • __destruct() : 对象被销毁时触发
  • __call() : 在对象上下文中调用不可访问的方法时触发
  • __callStatic() : 在静态上下文中调用不可访问的方法时触发
  • __get() : 用于从不可访问的属性读取数据
  • __set() : 用于将数据写入不可访问的属性
  • __isset() : 在不可访问的属性上调用isset()empty()触发
  • __unset() : 在不可访问的属性上使用unset()时触发
  • __toString() : 把类当作字符串使用时触发
  • __invoke() : 当脚本尝试将对象调用为函数时触发

英文注释是:在加载完session文件后,重新初始化对象,检查配置文件的是否改变,如果必要就重新加载

QQ截图20220412104204.jpg

load方法,根据判断file_get_contents()是否存在来进行代码执行

QQ截图20220412104645.jpg

getsource是返回目前的配置文件

QQ截图20220412104700.jpg

调用反序列函数,会调用创建对象的类中的__wakeup(),进而调用代码执行getsource()(注意,这个getsource是对象的方法,要构造getsource就要在对象的类里面构造)

QQ截图20220412104827.jpg

构造payload调用反序列化,要求configuration和action变量,而这两个变量都是post传参的值

  • Payload:action=test&configuration=O:10:"PMA_Config":1:{s:6:"source",s:11:"d:/test.txt";}

尝试访问(发现没有回显,构造了个容易看见的payload)

QQ截图20220412104940.jpg