php strlen遇0截斷,聊下php下的截斷問題

0x01 起因

有天在群里說起上傳的%00截斷的一些問題,就想起之前自己在這個問題踩過坑,想起了自己曾經的flag說要寫文章,一直沒寫,現在來填坑了。

0x02 經過

源碼理解1

2

3

4//test.php

include "1.txt\000.jpg";

?>

1

2

3

4//1.txt

echo 'helloworld';

?>

上面的示例代碼在 php版本小于5.3.4 的情況下回輸出 helloworld 。從php的內核執行過程來看,PHP通過 php_execute_script 來執行PHP的腳本,這里選取部分有關代碼,具體可以看這里:

ac601ec48a215f1b25df7d2d08c4e70c.png

在 第10行 我們看到,他調用 zend_execute_scripts 來針對腳本進行解析,而這個函數是在Zend/zend.c里面,截取部分相關代碼如下:

357e0c3358b7a7b2a4938f46952a268e.png

從PHP內核開來實際上是分為兩塊部分,一個是 compile編譯過程 ,另一個是execute執行過程。

第一部分:compile編譯過程

我們可以看到這里的代碼邏輯通過 zend_compile_file 獲取文件的內容,zend_compile_file是一個函數指針,其聲明在/Zend/zend_compile.c中

1ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type TSRMLS_DC);

在引擎初始化的時候,會將 compile_file 函數的地址賦值給 zend_compile_file 。

12d4b251c83cda4c68e269881613c93b.png

1458926186ddef54df38b89d6a266b60.png

簡單總結一下上面部分代碼的邏輯:

zend_compile_file 函數首先調用 open_file_for_scanning 去讀取文件,然后通過 第17行的zendparse 去進行語法和詞法解析。而 zendparse 是通過 lex_scan 去掃描出token并進行語法分析。

第二部分:execute執行過程

zend_execute 也是一個函數指針,其聲明在/Zend/zend_execute.h中。

1ZEND_API extern void (*zend_execute)(zend_op_array *op_array TSRMLS_DC);

在引擎初始化的時候,會將 execute 函數的地址賦值給 zend_execute 。

e65bc7551444fe89dd56da363a7bdd5e.png

0a05af4ac9fd46799be09c77c3d57b0e.png

根據我們的了解,zend_execute 通過 ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER 函數來進行include的實際處理,即包含要包含的文件。

674501f16472425276f7be49aa10423a.png

對比修復代碼找到漏洞觸發點:

0ca57139e42bc3a0aebf91ef26f9ad50.png

摘出部分修復代碼:

e0b3e1b4801265e16bc0cb8a45d630a0.png

我看下存在漏洞的調試運行結果:

cb8da8ca5bc6a484c8eef4403ba1f424.png

修復代碼的 Z_STRVAL_P(inc_filename) 即上圖中的val,即”1.txt”,strlen取得長度為5,而 Z_STRLEN_P(inc_filename) 即上圖中的len即10。這里實際上解析到的文件名是1.txt。

不存在漏洞的調試運行結果:

一旦出現%00截斷,include的文件名經過url轉碼由”1.txt%00.jpg”變為”1.txt\000.jpg”,進入php語法詞法分析器解析后會將這個字符串解析成一個字符串,并使用 zend_scan_escape_string 進行字符串轉碼,如圖,進入 zend_scan_escape_string 的內容為:

db2e6c11541a1fc9c8aae3a237a25488.png

只要比較發現文件名的strlen長度和語法分析出來的長度不一樣,就說明內部存在截斷的字符,因此輸出了打開文件失敗的信息。

利用方式

劃重點 PHP版本低于5.3.4

%00截斷有這么2種利用狀況

在burpsuite的16進制編輯工具將”shell.php .jpg”(帶空格的)中間的空格由20改成00

在1中,url中的%00(形如%xx),web server會把它當作十六進制處理,然后將該十六進制數據hex(00)“翻譯”成統一的ascii碼值“NUL(null)”,實現了截斷。

在2中,burpsuite用burp自帶的十六進制編輯工具將”shell.php .jpg”(中間有空格)中的空格由20改成00,如果burp中有二進制編輯工具。

延伸一下

其實關于截斷相關問題,還有個很有趣的函數, iconv() 函數:

在了解 iconv() 函數漏洞之前,可能需要一點前置知識

在php中,所有的字符都是二進制的串,PHP本身并不認識任何編碼,只是根據編碼來顯示內容。PHP中的chr() 函數從指定的 ASCII 值返回字符。ASCII 值可被指定為十進制值、八進制值或十六進制值。八進制值被定義為帶前置 0,而十六進制值被定義為帶前置 0x。

而在php5.4之前, iconv() 函數在轉換編碼的時候,遇到不合法的字符串的時候會將其截斷。

1

2

3

4

5

6

7<?php

for($k=0;$k<=255;$k++)

{

$a='shell.php'.chr($k)."1.jpg";

echo 'k:'.$k.' '.'$a:'.$a.' '.'iconv("UTF-8","gbk",$a):'.iconv("UTF-8","gbk",$a)."\n";

}

?>

通過fuzz發現,其中 iconv(“UTF-8”,”gbk”,$a) 或是 iconv(“UTF-8”,”gb2313”,$a) 都會在chr(128)到chr(255)之間截斷,使結果為shell.php

31d52adc37319daae2e604ece3eac955.png

在php5.4.0版本的時候就不存在這個問題了。

495a8662891d4bd26ab7b8843f73f2d8.png

實際例子

關于我們剛剛說的 iconv() 截斷的問題,其實sitestar pro就是個典型例子,我們看個例子:

漏洞觸發點在 module/mod_tool.php 中的 img_create() 函數,截取部分代碼如下:

3ba0b6909f4f9079c53aa4c721d509cd.png

這部分中有段代碼吸引了我的注意力

1

2

3

4if(!preg_match('/\.('.PIC_ALLOW_EXT.')$/i', $file_info["name"])) {

Notice::set('mod_marquee/msg', __('File type error!'));

Content::redirect(Html::uriquery('mod_marquee', 'upload_img'));

}

跟進一下這個 PIC_ALLOW_EXT 參數,發現其在數據庫中寫死了,只允許 gif|jpg|png|bmp 這類文件。即如果文件名最后不是 gif|jpg|png|bmp ,則提示文件類型錯誤。

017dcd393e0cb270e28216d3a9b34c67.png

所以這部分的正則表達式的功能應該是針對文件后綴名進行檢查。

繼續跟進這部分代碼,有一串代碼如下:

1

2

3

4if (!$this->_savelinkimg($file_info)) {

Notice::set('mod_marquee/msg', __('Link image upload failed!'));

Content::redirect(Html::uriquery('mod_marquee', 'upload_img'));

}

這部分代碼應該是進行文件保存的功能,這個有個核心函數 _savelinkimg ,跟進這個函數。

aa5f1013b85e1b1761ddc78bab754107.png

第二行問題出現了

1$struct_file['name'] = iconv("UTF-8", "gb2312", $struct_file['name']);

在 iconv 轉碼的過程中, utf->gb2312 (其他部分編碼之間轉換同樣存在這個問題)會導致字符串被截斷,如:$filename="shell.php(hex).jpg; (hex為0x80-0x99),經過 iconv 轉碼后會變成 $filename="shell.php" ;

4cc2145b0df9dfa15af09d9dc9e24f26.png

0x03 結果

總結一下截斷大概可以在以下情況適用

include(require)

file_get_contents

file_exists

所有url中參數可以用%00控制

0x04 參考文獻

潛伏在PHP Manual背后的特性及漏洞(看雪峰會議題)

wooyun-2014-048293

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

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

相關文章

test.php.bak,記一次phpmyadmin 4.8.1 遠程文件包含漏洞(BUUCTF web)

題目很簡單&#xff0c;一個滑稽打開源碼&#xff0c;發現存在source.php文件于是訪問文件&#xff0c;發現出現一串php源碼提示存在hint.php&#xff0c;于是訪問發現一句話flag not here, and flag in ffffllllaaaagggg再回過頭來觀察source.php明顯是一道代碼審計的問題&…

php中files和FILRS,php獲取文件內容最后一行示例

php獲取文件內容最后一行示例復制代碼 代碼如下:$rs README.md;$fp fopen($rs, r);fseek($fp,-1,SEEK_END);$s ;while(($c fgetc($fp)) ! false){if($c "\n" && $s) break;$s $c . $s;fseek($fp, -2, SEEK_CUR);}fclose($fp);echo $s;exit;時間&#x…

php 實現貪吃蛇游戲,C++實現簡單貪吃蛇游戲

我大概在一個多月前把自己上學期寫的c代碼的貪吃蛇游戲push到csdn上&#xff0c;并且說c風格的貪吃蛇寫起來有些麻煩(貪吃蛇游戲的c語言實現)&#xff0c;準備用面向對象的c再寫一遍。現在我們專業恰好剛教完了c&#xff0c;學校也布置了一道簡單的貪吃蛇的編程題目&#xff0c…

java中的斜杠和反斜杠,老生常談java路徑中的反斜杠和斜杠的區別

JAVA中的斜杠有正斜杠與反斜杠之分&#xff0c;正斜杠&#xff0c;一般就叫做斜杠&#xff0c;符號為“/”&#xff1b;反斜杠的符號為“\”。斜杠(/)在JAVA中沒有什么特別的意義&#xff0c;就是代表一個字符‘/;反斜杠(\)則不然&#xff0c;它和緊跟著它的那個字符構成轉義字…

小程序 php cookie,微信小程序使用Cookie

微信小程序使用Cookie微信小程序不支持Cookie,因此,需要借助小程序的數據緩存來實現Cookie.環境: mpvue fly.js登錄成功后,在處理登錄驗證的method里,加入以下內容保存Cookie:wx.setStorageSync("sessionid",response.headers["set-cookie"][0])我對fly.j…

php對象好用嗎,在數據庫中使用對象的好處_php

我們都知道如何從mysql獲取我們需要的行(記錄)&#xff0c;讀取數據&#xff0c;然后存取一些改動。很明顯也很直接&#xff0c;在這個過程背后也沒有什么拐彎抹角的。然而對于我們使用面對對象的程序設計(OOP)來管理我們數據庫中的數據時&#xff0c;這個過程就需要大大改進一…

linux apache php顯示源碼,linux 源碼安裝apache PHP 問題

sudo ./configure --prefix/var/php --with-apxs2/usr/local/apache2/bin/apxsLoadModule php5_module modules/libphp5.soDirectoryIndex index.html index.html.var .phpa-bash-3.2$ pwd/usr/local/apache2/htdocs-bash-3.2$ cat info.phpphpinfo();?>打開info.ph…

mysql臨時表的的理解,如何理解存儲過程中已存在的mysql臨時表?

它在創建表時具有IF NOT EXISTS(13.1.17. CREATE TABLE Syntax)選項,在這種情況下可以使用.例&#xff1a;DELIMITER $$CREATE PROCEDURE temp_sp1()BEGINCREATE TEMPORARY TABLE IF NOT EXISTS temp_table (col2 int(11) DEFAULT NULL,col3 int(11) DEFAULT NULL);INSERT INTO…

python 發郵件 抄送,Python調用outlook發送郵件,發送給多人、抄送給多人并帶上附件...

我的報告目錄具體解釋在代碼中有詳細注釋import win32com.client as win32import datetime, osaddressee test01qq.com;test02jd.com#收件人郵箱列表cc test02163.com;test03alibaba.com#抄送人郵件列表mail_path os.path.join(rC:\Users\songlihui\PycharmProjects\test001…

php阻止輸入sql,在PHP中全面阻止SQL注入式攻擊之三

一、 建立一個安全抽象層我們并不建議你手工地把前面介紹的技術應用于每一個用戶輸入的實例中&#xff0c;而是強烈推薦你為此創建一個抽象層。一個簡單的抽象是把你的校驗方案加入到一個函數中&#xff0c;并且針對用戶輸入的每一項調用這個函數。當然&#xff0c;我們還可以創…

Oracle12081,【Oracle介質】Oracle 12C Linux x86-64 最新OPatch patch 6880880 12.2.0.1.7

天萃荷凈Linux x86-64 補丁程序6880880: OPatch patch of version 12.2.0.1.7 for Oracle software releases 12.1.0.x (installer) and 12.2.0.x (AUG 2016)上次更新時間 2016-8-26 上午1:48 (8 天前)產品 Oracle Global Lifecycle Management OPatc…

如何使用oracle ebs,Oracle EBS進行集成的實際操作步驟

我們今天主要向大家介紹的是如何使用WebService和Oracle EBS進行集成&#xff0c;以及在使用WebService和Oracle EBS進行集成時&#xff0c;所需要的一些項目的描述&#xff0c;以下的文章就是對相關內容的描述。架構系統從總體上分為兩部分&#xff0c;一部為企業的EBS及接口系…

linux nls_lang oracle,linux操作系統環境變量LANG和NLS_LANG的區別

例如&#xff1a;復制代碼代碼如下:export LANGzh_CN.GB2312export NLS_LANGAMERICAN_AMERICA.ZHS16GBK$export LANGzh_CN.GB2312$date2012年 11月 27日 星期二 16:20:35 CST顯示是中文界面。復制代碼代碼如下:$export NLS_LANGAMERICAN_AMERICA.ZHS16GBK$sqlplus / as sysdbaS…

oracle監聽 3個配置文件,Oracle 11g 監聽 配置修改 說明

這里我們看2個比較常用的操作。1. 停止寫listener log在某些特定的場合可能會有這樣的需求。控制這個功能的參數是LOG_STATUS。 官網對這個參數的說明&#xff1a;To turn listenerlogging on or off.--在OS層面直接使用&#xff1a;lsnrctl SET LOG_STATUS {on | off}--在LSNR…

suse linux如何重置密碼忘記,SUSE?Linux忘記root密碼的處理辦法

GRUB修改法注意&#xff1a;此辦法僅適用SLES8、SLES9&#xff0c;不適用于SLES10&#xff0c;SLES10請用光盤修改法。此辦法不適合用于grub啟動超時時間為0的機器&#xff0c;因為grub超時時間設置為0后&#xff0c;不能編輯grub選項&#xff0c;此類機器必須使用光盤或網絡引…

linux怎么啟動端口服務,Linux 根據端口快速停止服務并啟動的辦法

ll /proc/7167結果為:[rootcentos76 deploy]# ll /proc/7167total 0dr-xr-xr-x 2 root root 0 Jun 25 11:13 attr-rw-r--r-- 1 root root 0 Jun 25 11:13 autogroup-r-------- 1 root root 0 Jun 25 11:13 auxv-r--r--r-- 1 root root 0 Jun 25 11:05 cgroup--w------- 1 root …

linux進程增刪改查,iptables的增刪改查

iptables是自帶的防火墻&#xff0c;功能強大&#xff0c;學習起來需要一段時間&#xff0c;下面是一些習iptables的時候的記錄。如果iptables不熟悉的話可以用apf&#xff0c;是一款基于iptables的防火墻&#xff0c;挺好用的。一,安裝并啟動防火墻[root ~]# /etc/init.d/ipta…

重裝系統 linux啟動windows系統文件在哪里,Win-Lin雙系統重裝Windows找回Linux啟動

第一系統Windows&#xff0c;第二系統Linux&#xff1a;Ubuntu18.10&#xff1b;1. 重新安裝Windows系統后&#xff0c;使用Ubuntu的安裝光盤&#xff0c;或啟動U盤啟動電腦&#xff1b;2. 選擇&#xff1a;Try Ubuntu ;3. 進入Ubuntu界面&#xff0c;打開命令行終端(Ctrl Alt…

linux遠程監控畢業設計,畢業設計論文:基于嵌入式Linux遠程監控系統的設計與實現.doc...

摘 要可編程邏輯控制器(PLC)不僅在工業控制中應用越來越廣泛&#xff0c;而且在其他領域的應用也逐漸擴大&#xff0c;例如&#xff1a;電力、化工、能源、水利等。由于它的功能比較強大、使用安全可靠、維護簡單方便的優點&#xff0c;在很多地方已經取代了繼電器電路的邏輯控…

linux卡死在選擇內核界面,求助:am3352 linux內核啟動時卡在 Starting kernel ...

這是用光盤里的uImage的輸出信息&#xff1a;U-Boot# tftp 0x82000000 bakuImagelink up on port 0, speed 100, full duplexUsing cpsw deviceTFTP from server 192.168.0.231; our IP address is 192.168.0.224Filename bakuImage.Load address: 0x82000000Loading: ########…