首页 > 编程语言 >PHP项目&变量覆盖&反序列化&未授权访问&身份验证

PHP项目&变量覆盖&反序列化&未授权访问&身份验证

时间:2024-02-11 11:02:04浏览次数:25  
标签:文件 php 函数 身份验证 module 漏洞 PHP include 序列化

CNVD拿1day-验证&未授权-xhcms&Bosscms

此种漏洞由于没有什么关键函数,所以需要通过功能点去进行测试。

Bosscms未授权访问

CNVD官网上搜索Bosscms未授权访问漏洞。

根据描述,影响的是1.0版本。看到发送时间为21年12月29好,收录时间为22年1月18号。再去官网看版本更新的时间点,V1.0版本和V1.1版本都是21年12月29号之前推出的,都存在未授权访问漏洞,而V1.2版本的更新日志中提到了修复已知漏洞,发布时间为22年1月11号,所以根据这两个版本代码之间的区别来判断哪里存在未授权访问漏洞。


通过Beyond Compare软件打开两个版本的源代码,比较之后发现在/system/basic/class/admin.class.php文件中存在区别。

V1.2版本的在登录功能加了一个判断和一个die语句,说明在V1.0版本的admin.class.php文件中存在未授权访问。但在admin文件中没找到什么功能,那么下一步就可以查找有没有哪些文件继承了admin.class.php文件,只要继承了,也会存在未授权访问漏洞。找到一个backup.class.php文件,存在文件删除功能。

抓包看下删除的逻辑。

点击查看代码
POST /admin/?mold=safe&part=backup&func=delete&id=20240204150801xj3p65.sql HTTP/1.1
Host: 127.0.0.1:8089
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------205646219912454451722833187453
Content-Length: 240
Origin: http://127.0.0.1:8089
Connection: close
Referer: http://127.0.0.1:8089/admin/?mold=safe&part=backup&func=table&lang=1
Cookie: PHPSESSID=dork7e7l4fjdnuhboikp8qh2i2
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: iframe
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1

-----------------------------205646219912454451722833187453
Content-Disposition: form-data; name="url"

http://127.0.0.1:8089/admin/?mold=safe&part=backup&func=table&lang=1
-----------------------------205646219912454451722833187453--

id就是删除的文件名。故在根目录新建一个1.txt文件,看能否删除。

给id传参../../../1.txt,url随便传参什么,删除成功。

xhcms验证逻辑缺陷

cnvd官网上搜索相关漏洞。

进入后台界面,根据url找到对应的文件。


r=index,需要到files目录下找index.php文件。

包含两个文件,有一个文件根据名字就知道是检查登录的,看一下该文件。

只需要满足cookie中的user字段有值即可,故很好绕过。先退出登录,直接访问http://127.0.0.1:8085/admin/?r=index,cookie传参user=1。

成功登录。

CNVD拿1day-变量覆盖引发文件包含-MetInfo

根据官网搜索Metinfo存在文件包含漏洞。

文件包含漏洞涉及到的关键函数有以下四个:require、require_once、include、include_once。随便翻看了下源代码,发现代码中使用的都是require_once函数。如果有文件包含漏洞,则肯定有变量,搜索"require_once $"。

一个一个查看,看看哪里能用。发现这几个代码都很相似。

img/index.php中还包含了两个文件,一个是include/module.php,另一个是$module。因为$module不知道是哪里来的,所以先看看include/module.php。

$module是从include/module.php文件中定义的,如果想要实现任意文件包含,我们就得控制$module。再往上看,发现include/module.php包含了include/common.inc.php,看一下include/common.inc.php源码。

存在变量覆盖漏洞。

点击查看代码
$_request=_COOKIE、_POST、_GET
$$_request=$_COOKIE、$_POST、$_GET
$_key就是三种传参方式的传参名
$_value就是三种传参方式的传参值
所以可以通过该代码实现变量覆盖。

先来理一下利用链。
img/index.php($fmodule=5) -> include/common.inc.php(变量覆盖漏洞,将module赋值为我们想要包含的文件) -> include/module.php(如果$fmodule!=7则会对$module重新赋值,所以必须要让$fmodule=7才可以)
在根目录下新建一个1.txt文件,目标就是包含该文件执行phpinfo函数。触发地址:img/index.php?fmodule=7&module=../1.txt。

CNVD拿1day-反序列化引发读取-phpMyAdmin

根据官网搜索phpMyAdmin存在unserialize远程代码执行漏洞。

打开源代码搜索unserialize关键字,只有两处。

两处代码如下。


明显第一处更好触发,故选择第一处触发。反序列化漏洞中unserialize函数在执行的时候会自动执行__wakeup魔术方法,搜索哪里有__wakeup函数。在libraries/Config.class.php文件中找到一处比较好的。

看看load函数和getSource函数是什么作用。


可以看到load函数有eval命令执行函数,getSource函数是返回$source。看看$source在哪里定义的。

发现这几个方法都是在PMA_Config类中的,所以可以利用反序列化漏洞让$source为我们想要读取的文件。

点击查看代码
利用链:
scripts/setup.php(unserialize函数)   ->    libraries/Config.class.php(PMA_Config类中的__wakeup函数)   ->   libraries/Config.class.php(PMA_Config类中的load函数会调用eval函数,执行file_get_contents函数读取getSource函数返回的值)   ->    libraries/Config.class.php(PMA_Config类中的getSource函数会返回当前类的source变量。

在D盘下新建一个1.txt文件,目标就是利用反序列化漏洞读取1.txt中的内容。

生成payload。

点击查看代码
<?php
class PMA_Config{
    var $source = '';
    function __construct(){
        $this->source="d:/1.txt";
    }
}
$a = new PMA_Config();
echo serialize($a);            # O:10:"PMA_Config":1:{s:6:"source";s:8:"d:/1.txt";}


?>

再返回看scripts/setup.php中的unserialize函数如何才能触发。

第一个要满足以POST方式向configuration传我们生成的payload即可;第二个要满足以POST方式向action传值,值不能为clear。触发地址:scripts/setup.php。

成功读取到。

标签:文件,php,函数,身份验证,module,漏洞,PHP,include,序列化
From: https://www.cnblogs.com/sbhglqy/p/18013232

相关文章

  • PHP
    PHPPHP(全称:PHP:HypertextPreprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言。PHP脚本在服务器上执行。PHP文件PHP文件可包含HTML、CSS、JavaScript代码和PHP代码PHP代码在服务器上执行,结果以纯HTML形式返回给浏览器PHP文件的默认文件扩展名是.phpPHP功能PHP......
  • 3种策略巧妙化解PHP Trait成员属性冲突
    说明PHP语言本身可以用insteadof和as关键字解决多个trait同名成员方法冲突的问题,但是貌似没有直接解决同名成员属性冲突的方案。虽然属性名冲突极少发生,但是不代表不会发生。如果是自定义trait可以复制旧trait文件到新trait,改新文件的成员属性名,引用新trait。直接更改原trai......
  • [Blazor WebAssembly] 学习随笔——身份验证
    最近在折腾微信相关的开发,包括公众号、企业微信内部应用、企业微信第三方开发。基于Razor方式写了:企业微信内部应用的类库企业微信第三方应用的类库公众号的类库一个统一管理公众号、企业微信内部应用和第三方应用有关授权、Token之类的应用。然后准备写一个开源的简单的酒......
  • php,用touch 修改文件时间
     touch($path,$fc_time,$fc_time);echo"\n$path已经被建立,并且重置了修改时间和访问时间\n";echo"\n如果是windows系统,将会执行以下命令重置该文件的建立时间\n";if(PHP_OS==='WINNT'){$path=str_replace('/','\\......
  • Apache配置不同目录绑定不同版本的PHP
    Apache配置不同目录绑定不同版本的PHPhttps://aka.ms/vs/17/release/vc_redist.x64.exehttps://www.apachelounge.com/download/VS17/binaries/httpd-2.4.58-310124-win64-VS17.ziphttps://www.apachelounge.com/download/VS17/modules/mod_fcgid-2.3.10-win64-VS17.zipDefine......
  • Ubuntu安装PHP8.2 编译安装 oci8 pdo_oci扩展
    PHP8.2是PHP语言的最新版本。新特性包括,只读类,允许布尔值作为独立类型等。从mysqli中删除libmysql的支持等。时至今天,主流的HTTP服务器已不是Apache,我们推荐使用Nginx作为HTTP服务器,Nginx相对于Apache来说简单且性能更好。本教程将向您展示如何在Ubuntu20.04安装PHP8.2并将其......
  • Version 1.23.0 of PhpSpreadsheet breaks PHP 7.3+ support
    Version1.23.0ofPhpSpreadsheetbreaksPHP7.3+supporthttps://github.com/PHPOffice/PhpSpreadsheet/issues/2779当你升级composerupdate时候,项目跑不通的时候,请检查相关依赖的版本;欢迎关注公-众-号【TaonyDaily】、留言、评论,一起学习。Don’treinventthewh......
  • ThinkPHP 6.0 SQL注入漏洞修复
    公司买的官网被政府网安检测出SQL注入漏洞:隐患描述SQL漏洞证明语句: python3sqlmap.py-u"http://xxxx?keywords=1"-pkeywords--level=5--risk=3--tamper=space2comment.py,between.py--current-db--random-agent--time-sec=10--batch--dbms="MySQL"漏洞回显:权......
  • 靶场搭建----phpstudy2018安装及注意问题
    安装官网下载:https://www.xp.cn/download.html新人推荐2018版本phpstudy介绍系统服务------开机自启非服务模式------开机不自启搭建好环境,此时服务器与客户端同时存在服务器:phpstudy所在的目录客户端:除phpstudy所在目录外的都是客户端调整phpstud......
  • 反序列化漏洞
    反序列化漏洞什么是序列化、反序列化例子引入序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象状态,重新创建该对象。简单的来讲:(含例子easy.php)序列化:把对象转换......