最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

CTFweb類型(二十八)xml、dtd及blind xxe基礎(chǔ)講解

2020-04-26 17:41 作者:安全牛課堂  | 我要投稿

接下來的話就開始講xxe的相關(guān)內(nèi)容,我們先來了解一下xxe的一個基本概念。

全稱是 xml的外部實體注入漏洞,會很明顯的感覺到,和xml有非常密切的關(guān)系的。所以一開始會先講xml的一些相關(guān)基礎(chǔ)知識,然后再講到一些具體的案例。xxe漏洞,它是發(fā)生在一個應(yīng)用程序去解析xml輸入的時候,沒有禁止外部實體的加載。所以它的關(guān)鍵點其實是在一個外部實體的作用在這里,或者說很多情況下都是一個外部實體允許加載,導(dǎo)致的問題產(chǎn)生。它可以去加載外惡意的外部文件,到造成一個文件讀取,命令執(zhí)行,內(nèi)網(wǎng)端口、掃描攻擊內(nèi)網(wǎng)站,發(fā)起DOS攻擊等危害。

這種文件讀取,其實可以被理解成是xxe的一個常規(guī)操作,但像命令執(zhí)行的話,它的條件比較苛刻,是在特定條件下,比如說存在某些特定的擴展插件之類的,那么他有可能去執(zhí)行內(nèi)網(wǎng)端口、掃描攻擊內(nèi)網(wǎng)站,內(nèi)外網(wǎng)網(wǎng)站發(fā)起DOS攻擊,這些也是基本上來說存在xxe就可以去觸發(fā)的。觸發(fā)點是有幾個條件,第1個能夠上傳xml文件,對內(nèi)容沒有過濾,導(dǎo)致可以生成a的xml文件,總結(jié)起來就是說能夠去在對方服務(wù)器中去生成一個帶有惡意代碼的xml文件。同時他們也會去解釋。就解析有惡意代碼的x版文件,那么就會產(chǎn)生漏洞。所以說的話,它的前提條件是必然存在一個你能夠傳的,然后又能夠解析的這么一個地方。


XML基礎(chǔ)知識

因為可能很多一開始打ctf都沒接觸過,而且相對來說它xxe的這種題目比較不是特別多,包括我接觸的也不是很多。所以這塊講的可能就沒有那么好。但是我覺得這塊內(nèi)容的話,就是說即使你不會真的遇到了,也不妨你去做題,因為像這種知識你臨時去查歷史去學(xué)是完全來得及的。這塊的話可能偏向研發(fā)一點,可以簡單的了解一下。

它是一種可擴展標(biāo)記語言。語法簡單知道一下,因為很多時候利用配套的。它是被用于去傳輸和存儲數(shù)據(jù)的,參考w3c上的說法,把數(shù)據(jù)從html中分離開來,然后簡化數(shù)據(jù)的一個傳輸和存儲的一個過程。

我們這里可以先看一下后面的簡單的一個樣式,看到在一開始的結(jié)構(gòu),是去聲明一個版本號。

然后下面的話就是它的一些內(nèi)容了。然后像這種假設(shè)我這里定一個note,這個note里面它到底有哪些內(nèi)容的話,比如to、from、heading、body這種的話其實可以隨便定義,比如說現(xiàn)在我想少一個想多一個,其實都沒有關(guān)系,所以說它是沒有預(yù)定義標(biāo)簽的。

但是你會發(fā)現(xiàn)他說語法規(guī)則中提到就是說必須有一個根元素,根元素 note,其實這個就可以理解為是根元素。然后元素都必須有一個關(guān)閉標(biāo)簽,所以你會看到這邊它有點像html。前面一個標(biāo)簽了,后面有個閉合標(biāo)簽,這是標(biāo)準(zhǔn)的一個語法。然后標(biāo)簽的大小就敏感,也就是說前后是一致的。像這邊你是to,你不能這個是大寫的to這是不允許的,它會報錯的。然后元素必須被正確的嵌套,以及元素值,屬性值必須加引導(dǎo)。如果說這個note的地方,我們其實可以看到,如果你定義了,是必須要對它做一個賦值的。


那么可以來看一下,我們就訪問一下。

你會看我是通過瀏覽器直接去訪問這xml文件,瀏覽器的話,它其實也自帶解析解釋器的。那么它會顯示出來。如果說我這邊改成一個大寫的T,保存一下。我這邊在刷新的時候,它會報錯的,是非配對的標(biāo)簽。

所以說其實有時候配合瀏覽器,也能幫助你去查一些語法上的錯誤。比如說我這里去定義一個 data,這樣子是可以的,就相當(dāng)于我多了一個data的屬性,那么他這個地方是要對他做,就不能這樣去定義了,不賦值。

比如說這樣子,這樣就可以了。但是你要注意到的就是說,我這個地方要是沒有引號是不允許的。

講到語法中的一個點就是說,我們看到這個標(biāo)簽之中,隨便輸什么內(nèi)容,它這邊都會打印出來。只有兩個符號會有歧義,比如說寫小于號的時候,就會報格式錯了。

因為他在小于號和 n的服務(wù)的情況下,就會產(chǎn)生的歧義,會認為小于號就是一個標(biāo)簽開始的一個位置,所以他就會報錯。

那么這種時候怎么辦?實體引用,我們就可以把小于號換成這種實體的符號。

1、實體引用

接下來講的比較重要的一個內(nèi)容就是DTD文檔類型定義。

可以理解成就可以字面理解,文檔類型定義,其實它就相當(dāng)于去定義一個文檔的類型,它的作用是去定義一個xml文檔的合法結(jié)構(gòu)模塊,這個文檔類型定義的時候就相當(dāng)于提前定義好的,那么其實我有時候也可以理解成是這樣的一個情況。從某種程度上說,有時候我感覺他也有點類似于序列化的那種一種情形。但是它這個結(jié)構(gòu)定義的話,它可以直接寫在xml文件中,也可以去外部引用這個結(jié)構(gòu)。


我們可以來看一下,這個的話它就是一個內(nèi)部聲明的狀況。


2、內(nèi)部聲明

第1行,還是一個version,第2行DOCTYPE,此文檔是note類型的一個文檔。這個時候去定義文章結(jié)構(gòu)。接下來element就是元素的意思,它定義的就是 note里面,它有4個元素,里面有這個定義元素類型to from head in body。意思是被解釋的字符數(shù)據(jù),可以理解它是會被一些解釋的一個文本?;旧夏憧梢源笾率沁@樣一個類型結(jié)構(gòu)。這個結(jié)構(gòu)我們現(xiàn)在只寫在 xml文檔里面的,下面的話對于那些填充數(shù)據(jù)結(jié)構(gòu)是對應(yīng)的,順序也是對應(yīng)的。

這種從外部引入的時候就有可能帶來一個危害,就拿文件包含來說,如果文件包含只包含本地文件,那么利用上來說你可能還是要正常流程去審計去發(fā)現(xiàn)漏洞,但是一旦它允許外部遠程報案的時候,那么它影響就會變得非常容易去實現(xiàn)了。

這地方也是一樣,一旦允許外部載入文件的時候,那么就有可能帶來一個大的危害。這就是一個外部聲明。

然后再往下的時候講到一個關(guān)于聲明的問題了。DTD文檔中定義了 mail,然后他接下來是定義mail中的一個內(nèi)部實體的聲明,就假如說我這邊去定一個hacker,然后就實體,實體名稱,實體值。相當(dāng)于我這邊去定義的值,這邊能夠去調(diào)用這個值。這邊輸出的值其實就是這里面的字,那么再繼續(xù)往下,繼續(xù)往下的時候,你會發(fā)現(xiàn)它可以外部這個實體也是可以去外部引入的。實體化部門的時候,我這個地方其實就已經(jīng)開始嘗試去利用了。他這個地方就是說它是個實體名稱,然后system去調(diào)做一個遠程的調(diào)用。然后同樣這個地方是在XML文檔中去引用的。

這個路徑其實在講SSRF的時候,通過file協(xié)議,它其實能夠?qū)崿F(xiàn)類似一個文件讀取的操作,既然講到了就是說實體,然后實體名稱,然后后面的值 system這個的話,它其實就相當(dāng)于做配合,file協(xié)議去讀取文件,讀了之后它會賦給hacker這個值。做個引用,相當(dāng)于它就能夠顯示出來。

但是假如我用php去解析它的時候,因為php它支持這種協(xié)議,你會看到這邊就已經(jīng)顯示一個值了。

回過來看一下簡單的代碼,這邊主要是為了顯示XML文件的一個載入過程。就說if file_get contents。文件讀取,那只不過我們現(xiàn)在用了一個PHP input,能夠去接受一個原生的post的數(shù)據(jù),

我這邊能夠傳遞進去,然后傳遞進去之后,它通過 simplexml_load_string,去做一個載入,相當(dāng)于做一個用PHP自帶的 xml解釋器去解析一下,那么它就會觸發(fā)里面的內(nèi)容。然后獲得之后的話,就把它以當(dāng)作key value的形式做一個輸出。要注意到一個點就是說,這個k值來自于哪里?

假如說不會去打印根元素的內(nèi)容,但是會打印根元素中的4個它的子元素的一個那種標(biāo)簽的名稱。所以說這個地方就是不同代碼的情況下,要基于當(dāng)時的邏輯情況去做一個分析的。剛剛這樣就已經(jīng)實現(xiàn)了一個文件讀取,這就是非常簡單的一種XMl文件的一個基本的使用。它使用場景其實大部分來說文件讀取。繼續(xù)往下看,xml不同語言寫的,解釋是有xxe的。

然后xml2是PHP編譯的時候自帶會帶來這個東西的,支持file http ftp。

然后Java、donate,但是所以你會發(fā)現(xiàn)每種協(xié)議它支持的協(xié)議是不一樣的,導(dǎo)致說發(fā)現(xiàn)一個xxe,在不同語言框架下要利用的話,你寫的payload會有一定的區(qū)別,所以這里需要注意到的。


然后像這邊的話就相當(dāng)于extension required的,就是說你去加了擴展之后,他能支持的協(xié)議就會更多了。然后你們會看到這expect。如果存在擴展的話,那么就有可能去實現(xiàn)。剛才我們看到的xxe能夠?qū)崿F(xiàn)命令執(zhí)行的一個條件,大部分情況現(xiàn)在來說都是expect在php中一個利用。


3、參數(shù)實體


實體這個概念我們先簡單的來了解一下。參數(shù)實例的話,它是只用一個DTD文檔,DTD和文章內(nèi)部子集中的。xml的規(guī)范中定義中,只有在DTD中才能夠稱引用參數(shù)實體,就是說這種參數(shù)實體它只能夠用在DTD中。理論上的理論是分開來的。參數(shù)實體的引用是以百分號開頭的,并且參數(shù)實體的引用都是在DTD都是理解解析的。替換文本將變成DTD的一部分。所以說這個地方它能夠有一個獲取變量值,然后去替換引用這個概念。

比如說這樣子:

我們是DTD5,你會發(fā)現(xiàn)這個地方能夠顯示出這個值, 發(fā)現(xiàn)它其實就在這個地方,相當(dāng)于是這條實體中的一個內(nèi)容,這個值其實應(yīng)該就是后面實體的一個內(nèi)容。


4、簡單利用

再看一下兩次運用的話應(yīng)該是就DTD7效果。它的內(nèi)容可以看一下。你會看到像我這邊的話定義了兩就是第1個也是一個DTD的,然后這里有個any,帶有任何內(nèi)容元素,就是我們隨便寫那種雜寫東西,然后里面有 argument的,下面就是一些實體,實體中的話要有空格。

開始定義了一個實體,就是參數(shù)實體,我這邊定的system,flag.txt,像我現(xiàn)在目錄一下,這邊有個flag.txt里面就有個flag字符串,然后的話我這邊用file去讀取,那么它肯定是能夠讀取到 flag.txt的,所以說像%evil其實相當(dāng)于 flag.txt中的一個內(nèi)容。第2個實體是能夠去做一個讀取。那么這個的話你會看到它是遠,它是這邊用的是一個.xml文件,它其實就相當(dāng)于遠程去載入一個DTD的文檔。然后我們可以來看一下dtd7_2.xml的內(nèi)容,發(fā)現(xiàn)它其實就是一句,也是一個實體。然后實力的話就是2%,其實就是這樣的一句話,你可以看它的內(nèi)容,實體 send system。你會發(fā)現(xiàn)它這里定義send就作為遠程的去做一個調(diào)用。這system本身來說,它其實應(yīng)該是遠程去載入的東西,那么他要做載入的時候,他肯定能夠發(fā)起一個請求。

比如說我這邊去發(fā)送一個參數(shù),跟上去傳過去的話,那么它就會保存到一個我那文件里面去。

那么像現(xiàn)在理解上來說,我就是拼接上evil,這個evil其實就是flag.txt的內(nèi)容,那會拼接過來,然后如果說這個人觸發(fā)的時候,那么他就會把flag.txt的內(nèi)容傳遞出來,像我在這邊遠程的情況下,我就會接收到。

那么我們再來看一下,引了xxe,作用是system相當(dāng)于卻引入了這個文件。相當(dāng)于xxe之后,這個地方就相當(dāng)于有了這一句實體在。然后接下來是%2的時候相當(dāng)于他就會去有這句話的一個作用,在這邊這句話就會起作用,那么他就會去發(fā)遠程請求,所以說像這個值它是默認情況下,它自然就會去讀回來的。讀回來之后他就會賦給evil,就會賦給這邊。然后在遠程載入這句話之后,然后賦給2%去觸發(fā)他的條件,觸發(fā)他發(fā)起遠程請求,之后獲取值。然后xxe去引入這句話,這句話引進來之后,那么這個evil就會被替換成這個地方的evil。所謂 flag.txt的內(nèi)容,然后在百分號去觸發(fā),請求就會發(fā)出去,然后就會拿到 flag。


這個的話就是一個DTT的XXE的一個盲攻擊的基本的雛形。后面的話我們會看一下一些例子,一些例題之類的,給大家講一下。這一次的話我們就先講到這里。


CTFweb類型(二十八)xml、dtd及blind xxe基礎(chǔ)講解的評論 (共 條)

分享到微博請遵守國家法律
尉犁县| 玉田县| 惠州市| 长武县| 哈尔滨市| 图木舒克市| 玉溪市| 鄂尔多斯市| 德州市| 修武县| 钟山县| 阿巴嘎旗| 江油市| 军事| 金昌市| 仙游县| 厦门市| 普兰店市| 鲁甸县| 兴国县| 都昌县| 通海县| 陕西省| 青田县| 孝义市| 昌江| 德格县| 丰城市| 延吉市| 丹阳市| 望城县| 将乐县| 宜兰市| 全南县| 红安县| 衢州市| 张家川| 五常市| 什邡市| 乌拉特后旗| 临泽县|