《Python安全實(shí)踐-PythonHacking》課件-第6章_第1頁(yè)
《Python安全實(shí)踐-PythonHacking》課件-第6章_第2頁(yè)
《Python安全實(shí)踐-PythonHacking》課件-第6章_第3頁(yè)
《Python安全實(shí)踐-PythonHacking》課件-第6章_第4頁(yè)
《Python安全實(shí)踐-PythonHacking》課件-第6章_第5頁(yè)
已閱讀5頁(yè),還剩132頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第六章PythonWeb滲透測(cè)試6.1Web滲透測(cè)試基礎(chǔ)6.2Web信息收集6.3口令憑證攻擊6.4本地文件包含(LFI)6.5跨站腳本攻擊(XSS)6.6SQL注入攻擊

6.1

Web滲透測(cè)試基礎(chǔ)

6.1.1滲透測(cè)試分類在利用滲透測(cè)試方法對(duì)Web應(yīng)用程序進(jìn)行安全測(cè)評(píng)的過程中,測(cè)試人員根據(jù)對(duì)測(cè)試系統(tǒng)掌握的情況不同,可采取兩種不同的滲透方法,分別是白盒測(cè)試和黑盒測(cè)試。

1.白盒測(cè)試

白盒測(cè)試是指測(cè)試人員利用前期委托方所提供的與測(cè)試系統(tǒng)相關(guān)的所有信息資產(chǎn)材料進(jìn)行的測(cè)試行為。測(cè)試人員可以獲得被測(cè)試系統(tǒng)的詳細(xì)信息,如網(wǎng)絡(luò)地址段、使用的網(wǎng)絡(luò)協(xié)議、拓?fù)鋱D、應(yīng)用列表甚至源代碼。白盒測(cè)試更多地被應(yīng)用于審核內(nèi)部信息管理機(jī)制,測(cè)試人員可以利用掌握的資料進(jìn)行內(nèi)部探查,甚至與企業(yè)的員工進(jìn)行交互。對(duì)于發(fā)現(xiàn)現(xiàn)有管理機(jī)制漏洞以及檢驗(yàn)社交工程攻擊可能性來說,白盒測(cè)試具有非凡的意義。

2.黑盒測(cè)試

當(dāng)測(cè)試人員對(duì)測(cè)試系統(tǒng)大部分信息不了解時(shí),測(cè)試人員會(huì)采用黑盒測(cè)試方法。黑盒測(cè)試意味著測(cè)試人員在對(duì)目標(biāo)系統(tǒng)一無所知的狀態(tài)下進(jìn)行測(cè)試工作,目標(biāo)系統(tǒng)對(duì)測(cè)試人員來說就像一個(gè)“黑盒子”。除了知道目標(biāo)的基本范圍之外,所有的信息都依賴測(cè)試人員自行發(fā)掘。而目標(biāo)系統(tǒng)往往會(huì)開啟監(jiān)控機(jī)制對(duì)滲透過程進(jìn)行記錄,以供測(cè)試結(jié)束后分析。也就是說,雖然黑盒測(cè)試的范圍比較自由和寬泛,但是仍需要遵循一定的規(guī)則和限制。黑盒測(cè)試能夠很好地模擬真實(shí)攻擊者的行為方式,讓用戶了解自己系統(tǒng)面對(duì)外來攻擊者的真實(shí)安全情況。

滲透測(cè)試過程中,根據(jù)被測(cè)試的目標(biāo)的不同又可將滲透測(cè)試分為:

(1)操作系統(tǒng)滲透測(cè)試:對(duì)Windows、Linux、Solaris、IBMAIX等不同的操作系統(tǒng)本身進(jìn)行滲透測(cè)試。

(2)數(shù)據(jù)庫(kù)系統(tǒng)滲透測(cè)試:對(duì)Oracle、Sybase、DB2、Access、MySQL等數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)進(jìn)行滲透測(cè)試。

(3)應(yīng)用系統(tǒng)滲透測(cè)試:對(duì)組成的Web應(yīng)用的各種應(yīng)用程序,如JSP、ASP、PHP、CGI等進(jìn)行滲透測(cè)試。

(4)網(wǎng)絡(luò)設(shè)備滲透測(cè)試:對(duì)防火墻、IDS等網(wǎng)絡(luò)安全設(shè)備進(jìn)行滲透測(cè)試。

6.1.2滲透測(cè)試的步驟

Web滲透測(cè)試并不是一個(gè)隨意攻擊的過程,往往是有一定的攻擊目標(biāo),通常要經(jīng)歷以下5個(gè)步驟:

(1)信息收集。信息收集分析是所有網(wǎng)絡(luò)攻擊入侵的前提。Web攻擊發(fā)生前,攻擊者必定對(duì)攻擊目標(biāo)進(jìn)行細(xì)致的信息獲取工作,通過對(duì)網(wǎng)絡(luò)信息的收集和分析,制定相對(duì)應(yīng)的滲透測(cè)試計(jì)劃。信息收集的方法主要包括DNS域名服務(wù)、Whois服務(wù)、Nslookup、Ping、Tracert等信息查詢。

(2)掃描。信息收集完成后,就可以對(duì)網(wǎng)絡(luò)目標(biāo)進(jìn)行有針對(duì)性的掃描,掃描結(jié)果將影響針對(duì)目標(biāo)的滲透方法和手段。一般通過端口掃描就可以確定一個(gè)系統(tǒng)的基本信息,比如通過對(duì)目標(biāo)地址的TCP/UDP端口掃描,可以確定其所開放的服務(wù)數(shù)量和類型。

(3)

Web攻擊。在信息收集和掃描結(jié)束后,對(duì)得到的信息進(jìn)行分析后就可以確定攻擊的方式。常見的Web應(yīng)用的攻擊方式有SQL注入、跨站腳本攻擊、文件包含漏洞、客戶端請(qǐng)求偽造等。

(4)植入后門。攻擊者攻擊成功后,為了方便下一次進(jìn)入并控制目標(biāo)主機(jī),一般會(huì)放置一些后門程序(Webshell)與網(wǎng)站服務(wù)端Web目錄下的正常網(wǎng)頁(yè)文件混在一起,然后使用瀏覽器訪問后門,達(dá)到控制網(wǎng)站服務(wù)端的目的。Webshell一般是以ASP、PHP、JSP或者CGI等網(wǎng)頁(yè)文件形式存在的一種命令執(zhí)行環(huán)境。

(5)消除痕跡。作為一次完整的Web攻擊,需要在攻擊成功后消除攻擊痕跡。比如在系統(tǒng)的審計(jì)日志、Web的訪問記錄、防火墻的監(jiān)控日志等中消除攻擊痕跡。

6.2Web信息收集

6.2.1DNS信息收集

DNS(DomainNameSystem)是將域名和IP地址相互映射的一個(gè)分布式數(shù)據(jù)庫(kù),可以更方便地訪問互聯(lián)網(wǎng)。DNS信息收集將通過DNS服務(wù)端收集關(guān)于目標(biāo)的記錄,這些記錄可以作為滲透的入口點(diǎn)。常見的記錄類型有SOA(授權(quán)記錄)、NS(服務(wù)端名稱)、AAAA(IPv6地址記錄)、A(IPv4地址記錄)、MX(郵箱交換記錄)、CNAME(別名記錄)等。表6-1給出了常見的幾種DNS信息收集方式。

6.2.2旁站查詢

運(yùn)行在同一服務(wù)端上的兩個(gè)不同的網(wǎng)站A和B,A與B互稱為旁站。在對(duì)某個(gè)特定網(wǎng)站進(jìn)行入侵時(shí),由于其安全性較高找不到著手點(diǎn),則可以查看其所在的服務(wù)端上是否還有其他的網(wǎng)站,如果有則可以用這些網(wǎng)站作為突破口。本小節(jié)通過爬取Sameip網(wǎng)站(網(wǎng)址為/)的查詢結(jié)果來實(shí)現(xiàn)旁站查詢的功能。

6.2.3子域名暴力破解

在進(jìn)行信息收集時(shí)經(jīng)常會(huì)收集目標(biāo)網(wǎng)站的子域名,每一條子域名都相當(dāng)于為滲透提供了一個(gè)潛在的入口。相關(guān)的域名收集方法包括通過特定網(wǎng)站(比如netcraft)進(jìn)行查詢,使用網(wǎng)絡(luò)空間搜索引擎(比如Zoomeye)進(jìn)行搜索暴力破解等。本小節(jié)將介紹如何通過暴力破解來收集子域名。

暴力破解是一種比較古老但是有效的攻擊手法,其原理是通過對(duì)特定字典的窮舉來達(dá)到獲得密碼或者類似信息的目的。暴力破解的關(guān)鍵在于有一個(gè)良好的字典和一個(gè)高效的窮舉算法。字典的獲得途徑有很多,比如可以通過網(wǎng)絡(luò)引擎進(jìn)行搜索,或者使用現(xiàn)有工具中的字典。github上也有各種各樣的字典庫(kù)。本小節(jié)不提供特定的字典,讀者可以通過上述途徑去尋找字典,然后完成暴力破解腳本的編寫。

因?yàn)楸拘」?jié)代碼使用了pydns包,所以在編寫代碼前先要將其安裝,代碼如下:

pipinstallpydns

除上述腳本外,以下工具也可以用于子域名信息的收集,如表6-2所示。

6.2.4敏感文件

對(duì)于文件泄露,根據(jù)泄漏信息的敏感程度,它在Web漏洞中可以算是中危甚至高危的漏洞。通常將一些易受攻擊的文件定義為敏感文件。敏感文件中包含很多敏感信息,有的只是導(dǎo)致一些無法被外網(wǎng)連接的內(nèi)網(wǎng)賬戶信息或者數(shù)據(jù)庫(kù)連接信息泄露,但也可能導(dǎo)致公司重要的商業(yè)秘密或程序源代碼被他人竊取,管理員賬戶被控制或者數(shù)據(jù)庫(kù)泄露等,從而造成巨大的損失。在本小節(jié)中,將簡(jiǎn)單介紹以下三種敏感文件。

1.?robots.txt

robots.txt是一個(gè)純文本文件,一般放在網(wǎng)站的根目錄下。網(wǎng)站管理者可以通過它來聲明該網(wǎng)站中不想被robots訪問的部分。當(dāng)一個(gè)搜索蜘蛛(搜索機(jī)器)訪問一個(gè)站點(diǎn)時(shí),它會(huì)首先檢查該站點(diǎn)的根目錄下是否存在robots.txt,若存在,則按照文件中的內(nèi)容確定搜索范圍。一般可以通過http://你的網(wǎng)址/robots.txt的方式來查看一個(gè)網(wǎng)站中的robots.txt。

robots.txt文件中的記錄通常以一行或者多行User-agent開始,后面加上若干的Disallow和Allow,有時(shí)也會(huì)添加其他參數(shù)屬性,用法如表6-3所示。

2.?crossdomain.xml

跨域就是指需要的資源不在自己的域服務(wù)器上,需要訪問其他域服務(wù)器??缬虿呗晕募rossdomain.xml是一個(gè)XML文檔文件,主要是為Web客戶端(如AdobeFlashPlayer等)設(shè)置跨域處理數(shù)據(jù)的權(quán)限。使用該文件時(shí)需將其放置在網(wǎng)站根目錄下,其作用是定義該域名下面的xml文件、json文件、m3u8文件是否允許其他網(wǎng)站的flashplayer來訪問。

crossdomain.xml需嚴(yán)格遵守XML語(yǔ)法,有且僅有一個(gè)根節(jié)點(diǎn)cross-domain-policy,且不包含任何屬性。cross-domain-policy元素是跨域策略文件crossdomain.xml的根元素。它只是一個(gè)策略定義的容器,沒有自己的屬性。在此根節(jié)點(diǎn)下只能包含如下的子節(jié)點(diǎn):

site-control、allow-access-from、allow-access-from-identity、allow-http-request-headers-from。

(1)

site-control元素用于定義當(dāng)前域的元策略。元策略是用于指定可接受的域策略文件,且該文件不同于目標(biāo)域根元素(名為crossdomain.xml)中的主策略文件。如果客戶端收到指示使用主策略文件以外的策略文件,則該客戶端必須首先檢查主策略的元策略,以確定請(qǐng)求的策略文件是否獲得許可。

(2)

allow-access-from元素用于授權(quán)發(fā)出請(qǐng)求的域從目標(biāo)域中讀取數(shù)據(jù)。它可以通過使用通配符(*),為多個(gè)域設(shè)置訪問權(quán)限。

(3)?allow-access-from-identity元素根據(jù)加密憑據(jù)授予權(quán)限。

(4)

allow-http-request-headers-from元素用于授權(quán)發(fā)出請(qǐng)求的域中的請(qǐng)求文檔將用戶定義的標(biāo)頭發(fā)送到目標(biāo)域。

圖6-1所示是一個(gè)網(wǎng)站的跨域策略文件。

圖6-1crossdomain.xml示例

3.

WEB-INF/web.xml

WEB-INF是Java的Web應(yīng)用的安全目錄。所謂安全就是客戶端無法訪問,只有服務(wù)端可以訪問的目錄。如果想在頁(yè)面中直接訪問其中的文件,必須通過web.xml文件對(duì)要訪問的文件進(jìn)行相應(yīng)映射才能訪問。WEB-INF主要包含以下文件或目錄:

(1)

/WEB-INF/web.xml:Web應(yīng)用程序配置文件,描述了Servlet和其他的應(yīng)用組件配置及命名規(guī)則。

(2)

/WEB-INF/classes/:包含了站點(diǎn)所有的class文件,包括Servletclass和非Servletclass,但它們不能包含在.jar文件中。

(3)

/WEB-INF/lib/:存放Web應(yīng)用需要的各種Jar文件,放置僅在這個(gè)應(yīng)用中要求使用的Jar文件,如數(shù)據(jù)庫(kù)驅(qū)動(dòng)Jar文件。

(4)

/WEB-INF/src/:源代碼目錄,按照包名結(jié)構(gòu)放置各個(gè)Java文件。

(5)

/WEB-INF/perties:數(shù)據(jù)庫(kù)配置文件。

在Java的Servlet文檔中,提到WEB-INF目錄包含了所有Web應(yīng)用會(huì)用到但是不處于Web路徑中的資源。也就是說,WEB-INF目錄下的內(nèi)容是不屬于公開頁(yè)面的,但是可以通過getResource等API在Servlet的上下文中訪問到這些資源。通常,開發(fā)者會(huì)把許多JSP文件:Jar包、Java的類文件放在該目錄下。一般目錄的內(nèi)容都是可以預(yù)測(cè)的,可以通過web.xml文件推測(cè)應(yīng)用組件相關(guān)類的名字,然后在src目錄下查找代碼,如果沒有源代碼,那么可以直接下載class文件反編譯即可。

6.2.5路徑暴力破解

在Web交互式信息收集過程中經(jīng)常會(huì)對(duì)目標(biāo)網(wǎng)站進(jìn)行路徑暴力破解,這可以使?jié)B透者進(jìn)一步的了解目標(biāo)網(wǎng)站的結(jié)構(gòu)。路徑暴力破解主要技術(shù)包括使用字典進(jìn)行路徑暴力破解和使用爬蟲對(duì)網(wǎng)站路徑進(jìn)行爬取以及兩者的結(jié)合。其中將字典路徑暴力破解與爬蟲相結(jié)合的路徑暴力破解方式效率最高,設(shè)計(jì)的難度較高,需要設(shè)計(jì)爬蟲的爬取策略等。

本小節(jié)中實(shí)現(xiàn)的是使用字典對(duì)路徑進(jìn)行暴力破解的方式,這種方式的效率主要取決于字典的質(zhì)量,有一個(gè)好的字典可以撞到更多的路徑。由于字典的體積一般比較大,因此一般這種暴力破解器都會(huì)開啟多線程。

新建一個(gè)腳本文件命名為dir_brute.py,輸入以下代碼:

接下來完成腳本多線程的目標(biāo)函數(shù)部分,代碼如下:

最后完成腳本的主體部分,代碼如下

以上代碼執(zhí)行結(jié)果如下:

6.2.6指紋識(shí)別

Web服務(wù)端指紋識(shí)別是Web滲透測(cè)試的關(guān)鍵任務(wù),了解當(dāng)前服務(wù)端的版本和類型,可以讓測(cè)試人員確定已知的漏洞以及在測(cè)試中可以使用相應(yīng)的漏洞。

指紋識(shí)別不僅可以對(duì)指紋進(jìn)行收集和分析,還可以將未知的指紋信息同存儲(chǔ)在數(shù)據(jù)庫(kù)中的指紋信息進(jìn)行比較,找出最符合的。

1.

banner獲取

Telnet到80端口來查看HTTP服務(wù)端的響應(yīng)信息(netcat也可以)。如果用Python腳本實(shí)現(xiàn)也很容易。

2.工具獲取

利用掃描工具nmap的掃描腳本可以獲取目標(biāo)IP地址的banner信息,代碼如下:

nmap-sV--script=banner06

banner信息獲取結(jié)果如圖6-2所示。

圖6-2旗標(biāo)信息獲取

6.2.7S2-045漏洞驗(yàn)證

Struts2是一個(gè)基于MVC設(shè)計(jì)模式的Java環(huán)境下的Web應(yīng)用框架,近年來此框架出現(xiàn)許多漏洞,給眾多網(wǎng)站帶來嚴(yán)重的危害。本節(jié)將以SpiderLabs團(tuán)隊(duì)開發(fā)的msfrpcpython模塊為橋梁,結(jié)合metasploit對(duì)批量目標(biāo)網(wǎng)站進(jìn)行驗(yàn)證,判斷主機(jī)是否存在S2-045漏洞。

本小節(jié)中將要實(shí)現(xiàn)代碼的主要功能為讀取指定文件中的IP地址,然后通過metasploit批量測(cè)試目標(biāo)網(wǎng)站是否存在此漏洞。首先需要通過下述命令安裝msfrpc模塊:

root@kali:~#gitclone/SpiderLabs/msfrpc.git

cd/msfrpc/python-msfrpc

root@kali:~/msfrpc/python-msfrpc#pythonsetup.pyinstall

通過下述命令開啟metasploit的msgrpc模塊:

上述命令執(zhí)行完成后,通過以下代碼驗(yàn)證msfrpc模塊是否安裝成功:

上述代碼執(zhí)行結(jié)果表示msfrapc模塊安裝成功。接下來演示如何通過call方法執(zhí)行命令,代碼如下:

了解完上述內(nèi)容后,下面開始編寫S2-045檢測(cè)腳本,新建名為s2-045.py的腳本,輸入以下代碼:

6.3口令憑證攻擊

Web滲透測(cè)試中,經(jīng)常需要評(píng)估系統(tǒng)用戶是否設(shè)置了弱口令。這使密碼暴力破解成為滲透測(cè)試的重要任務(wù)。要想破解密碼,就需要“擁有”別人的密碼,這時(shí)候就體現(xiàn)出字典的重要性了。暴力破解的思路很簡(jiǎn)單,就是一條一條地嘗試字典中的密碼,直到破解成功或者字典嘗試完也沒有成功。以下介紹一個(gè)簡(jiǎn)單的利用字典猜解進(jìn)行暴力破解的Python代碼。

新建名為passwd_brute.py的腳本,輸入以下代碼:

6.4本地文件包含(LFI)

6.4.1基本概念文件包含漏洞允許攻擊者使用目標(biāo)網(wǎng)站頁(yè)面內(nèi)位于網(wǎng)站本地或遠(yuǎn)程服務(wù)端的文件,當(dāng)其僅允許包含本地文件時(shí),稱為本地文件包含漏洞即LFI。這種漏洞的出現(xiàn),是由于網(wǎng)站開發(fā)者使用動(dòng)態(tài)文件包含機(jī)制且沒有對(duì)用戶輸入進(jìn)行有效過濾導(dǎo)致的。通常,以文件名作為參數(shù)的PHP代碼最有可能存在LFI漏洞,如圖6-3所示。圖6-3正常包含

攻擊者可以將參數(shù)“guestbook.php”修改為本地文件來確認(rèn)網(wǎng)站是否存在本地文件包含漏洞,如圖6-4所示,當(dāng)攻擊者將參數(shù)改為“/etc/passwd”后,網(wǎng)頁(yè)成功地載入了Web服務(wù)端的本地口令字文件,為此可驗(yàn)證本服務(wù)端存在LFI漏洞。

圖6-4包含本地文件

導(dǎo)致文件包含漏洞的因素有很多種,下面以PHP腳本代碼為例,結(jié)合代碼進(jìn)行詳細(xì)介紹。

如圖6-5所示,PHP文件經(jīng)常使用include(

)來包含其他文件,這樣可以提高特定頁(yè)面的復(fù)用率從而降低代碼量。但其帶來方便的同時(shí)也帶來了危害,倘若用戶可以修改此函數(shù)所包含的文件,則就產(chǎn)生了文件包含漏洞。與include()函數(shù)類似的還有require()函數(shù),兩者的區(qū)別之處是前者遇到錯(cuò)誤只會(huì)產(chǎn)生錯(cuò)誤日志,后者則會(huì)中斷程序。這兩個(gè)函數(shù)帶有“_once”后綴后,在進(jìn)行文件包含時(shí)會(huì)檢測(cè)文件中的內(nèi)容是否被重復(fù)包含。

圖6-5文件包含函數(shù)

除了需要注意上述這一類函數(shù)外,也需要注意具有文件讀取功能的相關(guān)函數(shù)。例如,file_get_contents()會(huì)將指定文件內(nèi)容以字符串格式讀出,file(

)函數(shù)則將文件讀取為數(shù)組,readfile()函數(shù)則會(huì)讀取文件并寫入到輸出緩存中,如圖6-6所示。

圖6-6文件讀取函數(shù)

導(dǎo)致文件包含漏洞的函數(shù)如表6-4所示。

由于本地文件包含漏洞,也可以包含服務(wù)端本地文件,故可以造成諸如配置文件、網(wǎng)站源代碼等重要信息泄露的危害,若進(jìn)一步地結(jié)合日志污染等技術(shù)甚至可以實(shí)現(xiàn)系統(tǒng)命令執(zhí)行。

6.4.2漏洞識(shí)別

針對(duì)PHP腳本下產(chǎn)生的LFI漏洞最簡(jiǎn)單的識(shí)別方式如圖6-3及圖6-4所示,即通過將參數(shù)改成本地文件后,利用頁(yè)面的響應(yīng)來判斷漏洞是否存在。圖6-3及圖6-4所示例子其源代碼為

上述代碼對(duì)所有輸入的文件名都會(huì)加上?.html后綴,從而防止了文件包含漏洞的產(chǎn)生。但是這種預(yù)防措施是可以通過截?cái)鄟砝@過的。下面介紹兩種截?cái)喾绞剑?/p>

(1)

%00截?cái)?,是指在參?shù)文件名后面添加%00進(jìn)行截?cái)?,比如guestbook.php%00。%00經(jīng)過解析后還可以變成\000,從而對(duì)文件后面的字符串進(jìn)行截?cái)唷?/p>

(2)長(zhǎng)度截?cái)?,是指利?或/,或兩者的組合來實(shí)現(xiàn)對(duì)字符串的截?cái)唷_@是因?yàn)閃indows下文件名最長(zhǎng)為256個(gè)字符,Linux下的為4096個(gè)字符。

以上兩種方式僅在低版本及沒有使用magic_quote_gpc時(shí)有效。在進(jìn)行漏洞識(shí)別時(shí)向參數(shù)中填入的路徑為相對(duì)路徑,但其不一定在當(dāng)前目錄下,所以需要枚舉../,比如../etc/passwd??梢酝ㄟ^如下代碼實(shí)現(xiàn):

上述代碼針對(duì)Linux系統(tǒng)上的服務(wù)端,讀者可以修改position1中的文件名來驗(yàn)證是否可以包含其他文件;相應(yīng)地也需要修改position

2中的特征字段。除了使用掃描器來驗(yàn)證是否存在文件包含漏洞外,讀者還可以根據(jù)字典來獲取可以被包含的其他文件。

6.4.3利用方式

本地文件包含漏洞最基本的用法是通過包含本地存在的用戶名文件、配置文件等來獲取敏感信息。除此之外還可以通過文件包含漏洞來getshell,所用方式大概分為三類:包含日志及環(huán)境文件、PHP

wrapper和phpinfo。前兩種方式較為簡(jiǎn)單,本節(jié)中介紹第三種方式即phpinfo。

當(dāng)PHP設(shè)置file_uploads=on時(shí),PHP將會(huì)接受上傳到任何PHP頁(yè)面的文件,并且這些文件會(huì)存儲(chǔ)為臨時(shí)文件直到頁(yè)面請(qǐng)求處理完畢,故可以將webshell寫入文件中并上傳,通過包含臨時(shí)文件來獲得shell。

要對(duì)文件進(jìn)行包含,首先要知道被包含文件的路徑及名稱。由于phpinfo頁(yè)面的_FILES變量存儲(chǔ)有上傳文件的臨時(shí)路徑及文件名,因此可以在文件上傳后訪問此頁(yè)面獲取文件名。下述過程驗(yàn)證可以通過phpinfo頁(yè)面獲取文件名:

(1)新建文本文件,命名為test.txt:

<?phpecho'test'?>

(2)新建test.py腳本,輸入以下代碼:

(3)打開result.html進(jìn)行查看,_FILES變量包含臨時(shí)文件名,如圖6-7所示。

圖6-7

PHP變量

通過上述過程可以獲取到所上傳文件的臨時(shí)路徑,在此之后便可以對(duì)文件進(jìn)行包含并getshell。不過首先需要解決的問題是在獲取文件臨時(shí)路徑到文件包含結(jié)束中間的這段時(shí)間里,phpinfo頁(yè)面會(huì)處理完請(qǐng)求并刪除臨時(shí)文件從而導(dǎo)致包含失敗。在PHP中,為了提高數(shù)據(jù)傳輸效率而使用了緩存機(jī)制,默認(rèn)設(shè)置為4KB,當(dāng)文件長(zhǎng)度大于4KB時(shí),PHP將會(huì)使用分塊傳輸編碼來將信息分塊傳輸給請(qǐng)求者。為此,僅需要增加phpinfo頁(yè)面的大小即可增加頁(yè)面的處理時(shí)間。觀察result.html頁(yè)面信息可以發(fā)現(xiàn),_FILES變量下方有保存請(qǐng)求頭部信息的變量,那么可以修改這些值以增加其長(zhǎng)度,從而增加頁(yè)面大小,延長(zhǎng)處理時(shí)間。同時(shí),使用多線程可以提高成功概率與效率。

6.5跨站腳本攻擊(XSS)

跨站腳本攻擊(Cross-SiteScripting,簡(jiǎn)稱XSS),是指惡意攻擊者利用網(wǎng)站沒有對(duì)用戶提交數(shù)據(jù)進(jìn)行轉(zhuǎn)義處理或者過濾不足的缺點(diǎn),進(jìn)而添加一些惡意代碼,嵌入到Web頁(yè)面中去,使別的用戶訪問上述頁(yè)面時(shí)都會(huì)執(zhí)行相應(yīng)的嵌入代碼,從而盜取客戶端的cookie或者其他網(wǎng)站用于識(shí)別客戶端身份的敏感信息。獲取到合法用戶的信息后,攻擊者甚至可以假冒合法用戶與網(wǎng)站進(jìn)行交互。

XSS分為兩類:持久型和非持久型。持久型XSS就是會(huì)把攻擊者的數(shù)據(jù)存儲(chǔ)在服務(wù)器端,攻擊行為將伴隨著攻擊數(shù)據(jù)一直存在。而非持久型XSS是一次性的,僅對(duì)當(dāng)次訪問的頁(yè)面產(chǎn)生影響。XSS又可以分為三種:反射型XSS、存儲(chǔ)型XSS和DOMXSS。其中反射型XSS是使用最多也是最常見的。

下面用一個(gè)簡(jiǎn)單的實(shí)例來介紹一下XSS。首先編寫一個(gè)簡(jiǎn)單的index.php文件,其功能是將輸入框的值傳遞給輸出框。該文件運(yùn)行后界面如圖6-8所示。

圖6-8簡(jiǎn)單的XSS例子

在輸入框中試著輸入<script>alert('xss')</script>進(jìn)行測(cè)試,得到界面如圖6-9所示。

6-9簡(jiǎn)單的XSS測(cè)試界面

在圖6-9所示界面上并沒有彈出窗口,說明<script>alert('xss')</script>并沒有被當(dāng)做javascript代碼來執(zhí)行。如果想要輸入框的內(nèi)容被執(zhí)行該怎么做呢?我們來看看界面源代碼:

可以發(fā)現(xiàn),輸入的內(nèi)容被當(dāng)做value的值顯示出來了,那么試著在剛才的輸入內(nèi)容前加?“>,使input閉合起來,這時(shí)界面內(nèi)容如圖6-10所示。

圖6-10中有窗口順利彈出,說明插入的代碼被javascript執(zhí)行了。同樣的道理,還可以通過input里的其他屬性來實(shí)現(xiàn),比如onclick、Onmousemove等。這個(gè)例子就是一個(gè)典型的反射型XSS。

圖6-10簡(jiǎn)單的XSS測(cè)試界面

6.5.1存儲(chǔ)型XSS漏洞檢測(cè)

存儲(chǔ)型XSS就是當(dāng)攻擊者向頁(yè)面插入惡意代碼時(shí),該惡意代碼會(huì)被存儲(chǔ)到數(shù)據(jù)庫(kù)中,當(dāng)其他用戶訪問數(shù)據(jù)時(shí),數(shù)據(jù)又是從數(shù)據(jù)庫(kù)中取得,從而觸發(fā)XSS攻擊。

本小節(jié)中介紹對(duì)于存儲(chǔ)型XSS漏洞的檢測(cè)。存儲(chǔ)型XSS手工檢測(cè)的過程大致為:首先攻擊者向某url1頁(yè)面的表單中輸入payload;然后點(diǎn)擊提交將payload提交到url2中;最終會(huì)跳轉(zhuǎn)到url3中顯示提交的數(shù)據(jù)。其中url1為入口點(diǎn),url3為“文件”是否注入成功的檢測(cè)點(diǎn)。據(jù)此可以設(shè)計(jì)相應(yīng)的腳本,執(zhí)行對(duì)特定網(wǎng)頁(yè)存儲(chǔ)型XSS的檢測(cè),其檢測(cè)過程圖6-11所示。

圖6-11存儲(chǔ)型XSS檢測(cè)過程

需要注意的是,有的網(wǎng)頁(yè)中部分input標(biāo)簽含有hidden屬性,這些標(biāo)簽多用于區(qū)別數(shù)據(jù)源是由人工發(fā)送的還是由腳本自動(dòng)發(fā)送的,所以編寫腳本時(shí)需要注意這些細(xì)節(jié)問題。

接下來,新建腳本并命名為xss.py,輸入以下代碼:

本腳本實(shí)現(xiàn)的功能較為簡(jiǎn)單,還有太多的細(xì)節(jié)沒有考慮,比如有時(shí)url3中確實(shí)存在提交的payload信息,但是已經(jīng)對(duì)其進(jìn)行了轉(zhuǎn)義,這時(shí)漏洞不一定存在,而腳本卻認(rèn)為漏洞存在。

6.5.2基于URL的反射型XSS

反射型XSS一般是基于URL來實(shí)現(xiàn)的。我們可以編寫一個(gè)腳本,將payloads通過URL自動(dòng)插入到頁(yè)面源代碼中。接下來,新建腳本并命名為xss_test.py,輸入以下代碼:

將需要進(jìn)行XSS測(cè)試的頁(yè)面URL作為參數(shù)傳遞,運(yùn)行命令如圖6-12所示。

圖6-12

XSS測(cè)試腳本運(yùn)行命令

上述腳本運(yùn)行結(jié)果如圖6-13所示。

圖6-13運(yùn)行結(jié)果

通過運(yùn)行結(jié)果可以看到,payloads已經(jīng)成功插入到頁(yè)面源代碼中。那么這個(gè)腳本是怎么實(shí)現(xiàn)的呢?其實(shí)很簡(jiǎn)單,我們首先構(gòu)造一個(gè)payloads列表,通過for...in...循環(huán)來逐一提交到URL中,每個(gè)payloads就是以URL后跟的參數(shù)形式發(fā)送的。

6.6SQL注入攻擊

SQL注入是最常見和最具破壞性的Web攻擊方式之一。SQL注入就是通過把SQL命令插入到Web表單遞交或輸入域名、頁(yè)面請(qǐng)求的查詢字符串,最終達(dá)到欺騙服務(wù)端而使其執(zhí)行惡意的SQL命令的目的。

6.6.1識(shí)別SQL注入

判斷一個(gè)網(wǎng)站是否存在SQL注入,需要進(jìn)行大量的推斷測(cè)試,從而判斷出后臺(tái)數(shù)據(jù)庫(kù)進(jìn)行了什么樣的操作。而在一個(gè)Web環(huán)境中,瀏覽器就是Web客戶端,它將數(shù)據(jù)發(fā)送到遠(yuǎn)程服務(wù)端上,服務(wù)端來執(zhí)行相應(yīng)的SQL語(yǔ)句。所以,判定是否存在SQL注入的首要任務(wù)就是識(shí)別服務(wù)端響應(yīng)中的異常并確定是否存在SQL注入漏洞,再確定在服務(wù)端運(yùn)行的SQL查詢類型以及攻擊代碼的注入位置。

1.

SQL注入測(cè)試

在進(jìn)行SQL注入測(cè)試時(shí),一般會(huì)發(fā)送意外數(shù)據(jù)來觸發(fā)異常,通過識(shí)別Web應(yīng)用上的數(shù)據(jù)輸入來確定哪種類型的數(shù)據(jù)會(huì)觸發(fā)異常。在Web應(yīng)用環(huán)境上,客戶端與服務(wù)端之間的響應(yīng)通過HTTP協(xié)議來進(jìn)行約定,而HTTP中和SQL注入有關(guān)的就是GET和POST方法,一般在瀏覽器中可以查詢到HTTP請(qǐng)求頭的相關(guān)數(shù)據(jù),如圖6-14所示。

圖6-14HTTP請(qǐng)求頭數(shù)據(jù)

圖6-14中是一個(gè)普通的GET請(qǐng)求,可以看到請(qǐng)求的URL以及后跟的傳遞參數(shù)值格式。如果想要修改發(fā)送給服務(wù)端的數(shù)據(jù),可以使用一些代理軟件來實(shí)現(xiàn),最常用的有ParosProxy、WebScarab和BurpSuite,它們都可以攔截流量并修改發(fā)送給服務(wù)端的數(shù)據(jù)。

除了修改HTTP數(shù)據(jù)外,還可以通過URL來操縱參數(shù),如圖6-15所示。

圖6-15DVWA漏洞平臺(tái)界面

在圖6-15中,當(dāng)前URL為

http://localhost/DVWA/vulnerabilities/sqli/?id=admin&Submit=Submit#

當(dāng)輸入框中輸入user時(shí),URL變?yōu)?/p>

http://localhost/DVWA/vulnerabilities/sqli/?id=user&Submit=Submit#

說明在該界面中傳遞的參數(shù)為id,可以利用傳遞的參數(shù)來推斷出數(shù)據(jù)庫(kù)的查詢語(yǔ)句可能是以參數(shù)id作為查詢條件。

在數(shù)據(jù)庫(kù)中,常見的四種操作是:SELECT(根據(jù)搜索條件從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù))、INSERT(將新數(shù)據(jù)插入到數(shù)據(jù)庫(kù)中)、UPDATE(根據(jù)指定的條件更新數(shù)據(jù)庫(kù)中已有的數(shù)據(jù))和DELETE(根據(jù)指定的條件刪除數(shù)據(jù)庫(kù)中已有的數(shù)據(jù))。當(dāng)客戶執(zhí)行操作時(shí),由于參數(shù)會(huì)傳遞給數(shù)據(jù)庫(kù)進(jìn)行匹配,因此可以根據(jù)界面的顯示反饋來確定數(shù)據(jù)庫(kù)的類型。

在上述例子中,我們運(yùn)用一個(gè)常用的檢測(cè),就是單引號(hào)檢測(cè)。在輸入框內(nèi)輸入一個(gè)單引號(hào)(‘

),這時(shí)的URL變?yōu)?/p>

http://localhost/DVWA/vulnerabilities/sqli/?id=user’&Submit=Submit#

可以看到界面內(nèi)容發(fā)生了錯(cuò)誤回顯,如圖6-16所示。

圖6-16界面錯(cuò)誤回顯

根據(jù)界面錯(cuò)誤信息:“YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear''user'''atline1”,可以判斷出來數(shù)據(jù)庫(kù)返回的是一個(gè)MySQL數(shù)據(jù)庫(kù)錯(cuò)誤,說明該網(wǎng)站存在SQL注入漏洞。

2.確定SQL注入類型

以上討論了如何通過客戶數(shù)據(jù)輸入并分析服務(wù)端響應(yīng)來尋找SQL注入漏洞。下面介紹通過構(gòu)造一條有效的SQL語(yǔ)句來確認(rèn)SQL注入類型。

在構(gòu)造SQL語(yǔ)句前,我們需要清楚數(shù)據(jù)庫(kù)所包含的數(shù)據(jù)類型,一般分為數(shù)字型和字符(串)型。對(duì)于這兩種不同的數(shù)據(jù)類型來說,測(cè)試的SQL語(yǔ)句也是有區(qū)別的。對(duì)于數(shù)字型數(shù)據(jù),數(shù)據(jù)庫(kù)中的查詢語(yǔ)句為

select*fromtablewhereid=3

而對(duì)于字符型數(shù)據(jù),數(shù)據(jù)庫(kù)中的查詢語(yǔ)句為

select*fromtablewhereid='3'

在構(gòu)造SQL語(yǔ)句前,需要根據(jù)參數(shù)來確認(rèn)其數(shù)據(jù)類型,數(shù)字型和字符型的測(cè)試注入?yún)^(qū)別就在于有無單引號(hào),數(shù)字型的不需要單引號(hào),而字符型則是用單引號(hào)來進(jìn)行測(cè)試注入。除了數(shù)字型和字符型,還有一種基于錯(cuò)誤響應(yīng)的SQL注入稱為SQL盲注。SQL盲注又可以細(xì)分為兩類:基于布爾型的SQL盲注、基于時(shí)間的SQL盲注。在接下來的小節(jié)中,將主要介紹字符型SQL注入和基于布爾型的SQL盲注(簡(jiǎn)稱布爾盲注)。

6.6.2字符型SQL注入

基于字符型SQL注入就是輸入的URL參數(shù)為字符串類型,在SQL語(yǔ)句中都采用單引號(hào)括起來。當(dāng)查詢內(nèi)容為字符串時(shí),SQL語(yǔ)句如下:

select*fromtablewhereusername=‘a(chǎn)dmin’

在字符型SQL注入中,可以根據(jù)單括號(hào)的規(guī)則來進(jìn)行注入。在對(duì)網(wǎng)站進(jìn)行注入之前,需要通過一些測(cè)試注入來判斷當(dāng)前界面存在什么類型的注入。在判斷是否為字符型SQL注入時(shí),一般使用以下兩個(gè)語(yǔ)句:

xx'

and'1'=1'

xx'and'1=2'

在Less-1中,界面的URL為http://localhost/sqli-labs/Less-1/index.php?id=1,原始界面如圖6-17所示。

圖6-17Less-1原始界面

用上述第一條語(yǔ)句進(jìn)行測(cè)試,URL變?yōu)閔ttp://localhost/sqli-labs/Less-1/index.p?id=1'and'1'=1--',界面并未發(fā)生變化。若用第二條語(yǔ)句進(jìn)行測(cè)試,則URL變?yōu)閔ttp://localhost/sqli-labs/Less-1/index.php?id=1'and'1=2--',界面上顯示錯(cuò)誤,如圖6-18所示。

圖6-18測(cè)試界面(1)

由于第一個(gè)語(yǔ)句測(cè)試界面正常,第二個(gè)語(yǔ)句測(cè)試界面報(bào)錯(cuò),從而可以推斷出這是一個(gè)字符型SQL注入。根據(jù)界面上錯(cuò)誤回顯,可以得到后臺(tái)SQL查詢語(yǔ)句為

select...from...whereid='1'limit0,1;

在確定了SQL注入的類型后,接下來需要通過orderby來確定字段數(shù),語(yǔ)句為

xx'orderbym%23

通過第m字段的順序進(jìn)行排序,語(yǔ)句中的m是從1開始的,并且可以逐漸增加;%23是#進(jìn)行了URL編碼,以防瀏覽器沒有自動(dòng)編碼。#是注釋符號(hào),也可以用--來代替它,而--后面必須跟一個(gè)空格才能起作用,因此上面語(yǔ)句也可以替換為xx‘

orderbym--+。當(dāng)輸入的m值導(dǎo)致界面發(fā)生錯(cuò)誤時(shí),則說明沒有這個(gè)字段,這時(shí)就可以以此推斷出輸出的字段數(shù)。

在Less-1中,當(dāng)URL中添加orderby3時(shí),URL為http://localhost/sqli-labs/Less-1/index.

php?id=1'orderby3%23,界面如圖6-19所示。

圖6-19測(cè)試界面(2)

在URL中添加orderby4時(shí),URL為http://localhost/sqli-labs/Less-1/index.php?id=1'orderby4%23,界面上顯示錯(cuò)誤如圖6-20所示。

圖6-20測(cè)試界面(3)

至此可以確定字段數(shù)為3。接下來,使用union語(yǔ)句來查詢數(shù)據(jù)庫(kù)的名稱。在URL中加上and1=2來確保出錯(cuò),URL變?yōu)閔ttp://localhost/sqli-labs/Less-1/index.php?id=1'and1=2unionselect1,database(),3and'1'='1,界面如圖6-21所示。

圖6-21測(cè)試界面(4)

從圖6-21可以看出,數(shù)據(jù)庫(kù)的名稱為security。

在查詢數(shù)據(jù)庫(kù)內(nèi)容時(shí),為了得到更多的數(shù)據(jù)庫(kù)信息,需要用到數(shù)據(jù)庫(kù)的連接函數(shù)group__concat(),它可以把查詢出來的多行連接起來。在mysql中,有一個(gè)數(shù)據(jù)庫(kù)information_schema是系統(tǒng)數(shù)據(jù)庫(kù),該數(shù)據(jù)庫(kù)在安裝完mysql就已存在,其中記錄了當(dāng)前數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)名、表信息、列信息和用戶權(quán)限等。在information_schema中有幾個(gè)常用的數(shù)據(jù)庫(kù)表:

(1)?SCHEMATA表:存儲(chǔ)當(dāng)前mysql中所有數(shù)據(jù)庫(kù)的信息。

(2)

TABLES表:存儲(chǔ)關(guān)于數(shù)據(jù)庫(kù)中的表信息,包括表有多少行、創(chuàng)建時(shí)間、最后更新時(shí)間等。

(3)

COLUMNS表:提供表中的列信息,可詳細(xì)表述某張表的所有列以及每個(gè)列的信息。

有了上述信息就可以獲取數(shù)據(jù)庫(kù)security中的表名,URL為http://localhost/sqli-labs/Less-1/index.php?id=-1'unionselect1,group_concat(table_name),3frominformation_schema.tableswheretable_schema='security'--+,界面如圖6-22所示。

圖6-22測(cè)試界面(5)

由圖6-22中的信息可知,數(shù)據(jù)庫(kù)security中共有四張表,分別為email、referers、uagents和users。我們可以繼續(xù)注入得到四張表中的所有字段名。以u(píng)agents表為例。URL為http://localhost/sqli-labs/Less-1/index.php?id=-1'unionselect1,group_concat(column_name),3frominformation_schema.columnswheretable_name='uagents'--+,界面如圖6-23所示。

圖6-23測(cè)試界面(6)

在得到uagents表中的字段名后(以同樣的方法得到其他表中的字段名),因?yàn)閡agents表中字段沒有數(shù)據(jù)項(xiàng),所以可通過users中的字段名得到其數(shù)據(jù)項(xiàng)內(nèi)容。URL為http://localhost/sqli-labs/Less-1/index.php?id=-1'unionselect1,username,passwordfromusers--+,界面如圖6-24所示。

圖6-24測(cè)試界面(7)

6.6.3布爾盲注

SQL盲注是SQL注入的一種。SQL盲注是在SQL注入過程中,SQL語(yǔ)句執(zhí)行后,選擇的數(shù)據(jù)不能回顯到前端界面。此時(shí)需要利用一些方法進(jìn)行判斷或者嘗試,這個(gè)過程稱之為盲注。盲注分為兩類:基于布爾型的SQL盲注、基于時(shí)間的SQL盲注。

本節(jié)著重介紹基于布爾型的SQL盲注,以Less-8為例。布爾型取值只有True和False?;诓紶栃偷腟QL盲注就是進(jìn)行SQL注入之后,根據(jù)頁(yè)面在True和False下不同的頁(yè)面狀態(tài)來推斷數(shù)據(jù)庫(kù)中的相關(guān)信息。

在Less-8中,原始界面URL為http://localhost/sqli-labs/Less-8/index.php,如圖6-25所示。

圖6-25Less-8原始界面

通過輸入以下測(cè)試注入語(yǔ)句進(jìn)行測(cè)試:

http://localhost/sqli-labs/Less-8/index.php?id=1\

http://localhost/sqli-labs/Less-8/index.php?id=1‘

http://localhost/sqli-labs/Less-8/index.php?id=1"

測(cè)試后發(fā)現(xiàn),只有當(dāng)id=1'時(shí),界面無法顯示內(nèi)容;當(dāng)輸入語(yǔ)句符合要求時(shí),界面內(nèi)容不變,界面也沒有任何回顯信息,這是一個(gè)標(biāo)準(zhǔn)的盲注。在我們拿到數(shù)據(jù)庫(kù)名稱之前,需要得到數(shù)據(jù)庫(kù)的長(zhǎng)度,可以通過length(database())來實(shí)現(xiàn)。將URL變?yōu)閔ttp://localhost/sqli-labs/Less-8/index.php?id=1'andlength(database())>1%23,界面如圖6-26所示。

圖6-26Less-8測(cè)試界面

可以發(fā)現(xiàn)界面并無任何變化,于是將URL改為

依次嘗試后發(fā)現(xiàn),當(dāng)length(database())>8時(shí),界面無法顯示內(nèi)容,這說明數(shù)據(jù)庫(kù)的長(zhǎng)度為8。當(dāng)數(shù)據(jù)庫(kù)長(zhǎng)度為8時(shí),要得到數(shù)據(jù)庫(kù)的名稱就得進(jìn)行大量的測(cè)試注入,十分浪費(fèi)時(shí)間,這時(shí)可以通過一段簡(jiǎn)單的Python代碼來實(shí)現(xiàn)基于布爾型的SQL盲注。

接下來,新建腳本并命名為bool_sqli.py,輸入以下代碼:

以上代碼運(yùn)行結(jié)果如圖6-27所示。

圖6-27Less-8測(cè)試運(yùn)行結(jié)果(1)

這樣做我們就得到了當(dāng)前數(shù)據(jù)庫(kù)的名稱為security。

知道數(shù)據(jù)庫(kù)名稱后,接下來就需要知道表的名稱了。在字符型SQL注入中,獲取表名的寫法為

但是在使用之前的測(cè)試注入語(yǔ)句,發(fā)現(xiàn)界面無法顯示,這是因?yàn)楸纠秊镾QL

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論