PHP代碼審計學習之命令執行漏洞挖掘及防御


【1】可能存在命令執行漏洞的函數:

00x1:常用的命令執行函數:exec、system、shell_exec、passthru

00x2:常用的函數處理函數:call_user_func、call_user_func_array、file_get_contents.....更多函數處理函數傳遞門:http://www.php.net/manual/zh/book.funchand.php

       函數處理函數的使用:<?php $a = "phpinfo()";call_user_func($_GET['id'],$a); ?>訪問:127.0.0.1/1.php?assert即可看到效果


【2】如何預防命令執行漏洞:

00x1:escapeshellcmd()//該函數過濾的是整條的命令

00x2:escapeshellarg()//用來保證傳入的命令執行函數里面的參數確實是以字符串參數的形式存在的不能被注入!


實例挖掘一個程序的命令執行漏洞。


我隨便搜索了一個命令執行函數(PS:網站程序是老古董了):

隨筆點開了一個文件,在文件的35行處找到命令執行函數system,兩個參數,看看有沒有進行過濾。

從35行很清楚的看到,其使用了一個tex_filter_get_cmd的函數,那么我們找一下這個函數,看下是如何寫的。該文件中沒有找到定義該函數的,那么必然是被包含了,被包含了兩個文件夾,一個是lib.php一個是config.php那么勢必是lib.php了,因為config.php是配置文件。

找到lib.php打開lib.php以后找到這個tex_filter_get_cmd函數,函數內部情況如下所示:

其實也可以很明顯的看到$texexp函數有使用escapeshellarg函數過濾然后賦值給$texexp變量,但是$pathname並沒有任何過濾就直接帶入44行以及47行執行了。由此導致本次的命令執行漏洞。

在42行他判斷了系統是否為windows如果是windows就執行43到44行的代碼。

44行的$executable變量是由40行的賦值而來的,那么我們再來看看tex_filter_get_executale函數。該函數在這個文件當中。其結構如下所示:

 

總體的來說就是調用了16行的exe

那么構造好的EXP就應該是:texed.php?formdata=foo&pathname=foo"+||+ver||+echo+

 

 

防御:

    使用escapeshellcmd($pathname);過濾掉$filename

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM