日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
PHP代碼審計(jì)得這樣由淺入深地學(xué)

 以Emlog 6.0 beta版本為引,一篇關(guān)于PHP語(yǔ)言CMS的代碼審計(jì)文章,詳細(xì)記錄代碼審計(jì)的完整過程,學(xué)習(xí)代碼審計(jì),不妨從這邊文章入手,認(rèn)真閱讀完,相信一定可以有所收獲!

序言

文章基本上完整記錄了筆者針對(duì)Emlog CMS審計(jì)過程,或許顯得繁瑣,但代碼審計(jì)的過程就是這樣,發(fā)現(xiàn)可能項(xiàng),然后精心構(gòu)造去驗(yàn)證,這過程中我們會(huì)遇到很多次碰壁,堅(jiān)持測(cè)試,思維活躍一些,基本都會(huì)有所收獲,誠(chéng)摯希望后來者能夠耐心閱讀下去,當(dāng)然最好也能夠有所啟發(fā)。

大家需要注意的一點(diǎn)是,代碼審計(jì)是為了學(xué)習(xí)并在SDL中避免發(fā)生類似的錯(cuò)誤,同時(shí)也是幫助開源系統(tǒng)修復(fù)相關(guān)問題,并不是去為了獲得什么0day~

0x00 Emlog 6.0 beta

EMLOG 6.0

官網(wǎng)地址:https://www.emlog.net/

Emlog 6.0 beta下載地址:

https://www.emlog.net/download

由于官方限制論壇會(huì)員(注冊(cè)付費(fèi))才可下載,這里提供一個(gè)原版下載地址:https://www.lanzous.com/i1l5gad

文件校驗(yàn):

 
 
 
  1. 文件: C:\Users\stdy\Desktop\emlog_6.0.0.zip 
  2. 大小: 607725 字節(jié) 
  3. 修改時(shí)間: 2018年8月6日, 20:53:50 
  4. MD5: 7844FE6FEAE7AF68052DC878B8811FAC 
  5. SHA1: E06A050D2A0AA879DB9F5CFCAA4703B6AC7B8352 
  6. CRC32: 4963E489 

博主的博客就是基于此套博客系統(tǒng),其實(shí)很多圈內(nèi)大佬都在使用,對(duì)于本款CMS的審計(jì)文章卻并沒有,筆者就來以此CMS作為PHP代碼審計(jì)的封筆之作。

0x01 初步測(cè)試

首先,我們得先安裝!安裝成功后的首頁(yè)界面:

安裝成功

默認(rèn)后臺(tái)登陸地址:./admin/

登陸成功后:

后臺(tái)界面

閑話一句,感覺6.0比5.3.1版本好看太多了~

安裝過后,我們應(yīng)該盡可能全面搜集關(guān)于此CMS的信息,這對(duì)于我們審計(jì)代碼有很大的幫助。

所以,分析得到此CMS的大致結(jié)構(gòu),Emlog是一個(gè) MVC 的設(shè)計(jì)模式,大致的結(jié)構(gòu)如圖:

emlog結(jié)構(gòu)

因此我們主要會(huì)分析 admin 和 include 文件夾下的文件。

數(shù)據(jù)庫(kù)表:

DATABASE

在根目錄的init.php 文件中

報(bào)錯(cuò)等級(jí)

報(bào)錯(cuò)等級(jí)指定為7:

 
 
 
  1. //禁用錯(cuò)誤報(bào)告 
  2. error_reporting(0); 
  3.  
  4. //報(bào)告運(yùn)行時(shí)錯(cuò)誤 
  5. error_reporting(E_ERROR | E_WARNING | E_PARSE); 
  6.  
  7. //報(bào)告所有錯(cuò)誤 
  8. error_reporting(E_ALL); 
  9.  
  10. error_reporting(7); 
  11. /* 
  12. 設(shè)置php錯(cuò)誤檢測(cè)級(jí)別 
  13. E_ERROR - 致命性運(yùn)行時(shí)錯(cuò) (1) 
  14. E_WARNING - 運(yùn)行時(shí)警告(非致命性錯(cuò))(2) 
  15. E_PARSE - 編譯時(shí)解析錯(cuò)誤 (4) 
  16. 1+2+4 = 7 
  17. */ 
  18. ?> 

0x02 使用漏洞掃描器

可能有朋友就會(huì)說你為什么要使用“漏掃”吶?不是代碼審計(jì)嗎?

這里要糾正一下這個(gè)觀點(diǎn),漏掃其實(shí)就是一個(gè)自動(dòng)化黑盒測(cè)試,在本地環(huán)境下,我們不會(huì)影響任何的業(yè)務(wù)。

通過漏掃出的漏洞能夠方便我們快速定位漏洞位置,這樣是一種高效的方式,這也是在團(tuán)隊(duì)里的成員通過漏掃Get了百度的幾個(gè)高危漏洞給筆者的啟示。

這里使用了一款重型掃描器 AWVS ,得到的報(bào)告如下:

結(jié)果

不過在本地掃描時(shí),使用的是 XAMPP windows10 PHP5.6的環(huán)境,所以導(dǎo)致漏洞報(bào)告中很多誤報(bào),漏掃主要掃描出了幾個(gè)XSS漏洞和CSRF漏洞

所以我們首先驗(yàn)證這兩類的漏洞

0x03 文章編輯器儲(chǔ)存性XSS

在后臺(tái)的編輯器處,編輯文章./admin/admin_log.php

編輯器XSS

成功發(fā)布后,來到首頁(yè)

emlogXSS

進(jìn)入文章頁(yè)后

文章頁(yè)XSS

都彈窗了,這里大家可能要說沒法兒利用,但是emlog設(shè)計(jì)了 會(huì)員/作者 功能,在emlog中的某些模版中可以前臺(tái)注冊(cè)會(huì)員,會(huì)員登錄后可以編輯發(fā)表文章,評(píng)論等等功能。Emlog官方還提供了文章投稿插件,都是調(diào)用了官方默認(rèn)的Kindeditor編輯器,這個(gè)編輯器自帶HTML編輯模式,就算不帶這個(gè)模式,攻擊者也可以抓包修改達(dá)到攻擊目的。

為什么前臺(tái)沒過濾吶?為了文章有支持HTML代碼輸出,所以對(duì)于kindeditor的保存輸出內(nèi)容并沒有轉(zhuǎn)義。

emlog會(huì)員/投稿

修復(fù)建議:參考其他CMS做好文章內(nèi)容關(guān)鍵詞的檢測(cè),并做好過濾或者轉(zhuǎn)義

0x04 Uploadify SWF XSS

Emlog使用了 uploadify.swf 的方式上傳文件,文件路徑 /include/lib/js/uploadify/uploadify.swf

構(gòu)造Payload:http://www.test.com//include/lib/js/uploadify/uploadify.swf?uploadifyID=00%22%29%29;}catch%28e%29{alert%281%29;}//%28%22&movieName=%22])}catch(e){if(!window.x){window.x=1;alert(document.cookie)}}//&.swf

效果,可無視瀏覽器filter:

SWF XSS

0x05 反射型XSS

此處的XSS主要發(fā)生在cookie上,因?yàn)槟承╉?yè)面如 admin/admin_log,admin/sort.php,admin/link.php頁(yè)面需要在表單中添加了hidden屬性的token值,而這個(gè)token值直接從用戶的cookie中取得,導(dǎo)致了一個(gè)反射型XSS

攔截抓包修改cookie中的token值如下:

payload

效果:

COOKIE XSS

其次驗(yàn)證了 CSRF 漏洞,這個(gè)是前臺(tái)的搜索框的CSRF根本沒什么價(jià)值

然后是管理員添加友情鏈接的XSS,經(jīng)過驗(yàn)證并不存在,后臺(tái)函數(shù)會(huì)限制字?jǐn)?shù)

然后就是我們開始進(jìn)行原始的代碼審計(jì)工作了,主要借用了Seay代碼審計(jì)工具和Rips,這種審計(jì)工具主要依靠正則匹配可能導(dǎo)致危險(xiǎn)的php函數(shù)來作為可能存在漏洞的判斷,半自動(dòng)化的方式,在一定程度上緩解了代碼審計(jì)的壓力。

0x06 基本函數(shù)

首先看了一下文件操作相關(guān)的函數(shù),發(fā)現(xiàn)經(jīng)常用到 View::getView 這一方法,

在include/lib/view.php 文件中,源碼如下:

 
 
 
  1. /** 
  2.  * 視圖控制 
  3.  * @copyright (c) Emlog All Rights Reserved 
  4.  */ 
  5.  
  6. class View { 
  7.  public static function getView($template, $ext = '.php') { 
  8.   if (!is_dir(TEMPLATE_PATH)) { 
  9.    emMsg('當(dāng)前使用的模板已被刪除或損壞,請(qǐng)登錄后臺(tái)更換其他模板。', BLOG_URL . 'admin/template.php'); 
  10.   } 
  11.   return TEMPLATE_PATH . $template . $ext; 
  12.  } 
  13.  
  14.  public static function output() { 
  15.   $content = ob_get_clean(); 
  16.         ob_start(); 
  17.   echo $content; 
  18.   ob_end_flush(); 
  19.   exit; 
  20.  } 

同時(shí)作為權(quán)限控制的 LoginAuth::checkToken(),在 \include\lib\loginauth.php下約209行開始

 
 
 
  1. /** 
  2. * 生成token,防御CSRF攻擊 
  3. */ 
  4. public static function genToken() { 
  5.  $token_cookie_name = 'EM_TOKENCOOKIE_' . md5(substr(AUTH_KEY, 16, 32) . UID); 
  6.  if (isset($_COOKIE[$token_cookie_name])) { 
  7.   return $_COOKIE[$token_cookie_name]; 
  8.  } else { 
  9.   $token = md5(getRandStr(16)); 
  10.   setcookie($token_cookie_name, $token, 0, '/'); 
  11.   return $token; 
  12.  } 
  13.  
  14. /** 
  15. * 檢查token,防御CSRF攻擊 
  16. */ 
  17. public static function checkToken(){ 
  18.  $token = isset($_REQUEST['token']) ? addslashes($_REQUEST['token']) : ''; 
  19.  if ($token != self::genToken()) { 
  20.   emMsg('權(quán)限不足,token error'); 
  21.  } 

驗(yàn)證了Rips掃描出的文件包含問題(第一次使用Rips),發(fā)現(xiàn)無法復(fù)現(xiàn),因?yàn)镽ips掃描的時(shí)候是以文件形式,并沒有參照程序的嚴(yán)格邏輯,導(dǎo)致的誤報(bào)!

來到 \admin\admin_log.php 文件,從第78行開始:

 
 
 
  1. //操作文章 
  2. if ($action == 'operate_log') { 
  3.     $operate = isset($_REQUEST['operate']) ? $_REQUEST['operate'] : ''; 
  4.     $pid = isset($_POST['pid']) ? $_POST['pid'] : ''; 
  5.     $logs = isset($_POST['blog']) ? array_map('intval', $_POST['blog']) : array(); 
  6.     $sort = isset($_POST['sort']) ? intval($_POST['sort']) : ''; 
  7.     $author = isset($_POST['author']) ? intval($_POST['author']) : ''; 
  8.     $gid = isset($_GET['gid']) ? intval($_GET['gid']) : ''; 
  9.  
  10.     LoginAuth::checkToken(); 
  11.  
  12.     if ($operate == '') { 
  13.         emDirect("./admin_log.php?pid=$pid&error_b=1"); 
  14.     } 
  15.     if (empty($logs) && empty($gid)) { 
  16.         emDirect("./admin_log.php?pid=$pid&error_a=1"); 
  17.     } 
  18.  
  19.     switch ($operate) { 
  20.         case 'del': 
  21.             foreach ($logs as $val) 
  22.             { 
  23.                 doAction('before_del_log', $val); 
  24.                 $Log_Model->deleteLog($val); 
  25.                 doAction('del_log', $val); 
  26.             } 
  27.             $CACHE->updateCache(); 
  28.             if ($pid == 'draft') 
  29.             { 
  30.                 emDirect("./admin_log.php?pid=draft&active_del=1"); 
  31.             } else{ 
  32.                 emDirect("./admin_log.php?active_del=1"); 
  33.             } 
  34.             break; 
  35.         case 'top': 
  36.             foreach ($logs as $val) 
  37.             { 
  38.                 $Log_Model->updateLog(array('top'=>'y'), $val); 
  39.             } 
  40.             emDirect("./admin_log.php?active_up=1"); 
  41.             break; 
  42.         case 'sortop': 
  43.             foreach ($logs as $val) 
  44.             { 
  45.                 $Log_Model->updateLog(array('sortop'=>'y'), $val); 
  46.             } 
  47.             emDirect("./admin_log.php?active_up=1"); 
  48.             break; 
  49.         case 'notop': 
  50.             foreach ($logs as $val) 
  51.             { 
  52.                 $Log_Model->updateLog(array('top'=>'n', 'sortop'=>'n'), $val); 
  53.             } 
  54.             emDirect("./admin_log.php?active_down=1"); 
  55.             break; 
  56.         case 'hide': 
  57.             foreach ($logs as $val) 
  58.             { 
  59.                 $Log_Model->hideSwitch($val, 'y'); 
  60.             } 
  61.             $CACHE->updateCache(); 
  62.             emDirect("./admin_log.php?active_hide=1"); 
  63.             break; 
  64.  
  65.         ...//中間的代碼要驗(yàn)證管理身份,故省略 
  66.  
  67.         case 'uncheck': 
  68.             if (ROLE != ROLE_ADMIN) 
  69.             { 
  70.                 emMsg('權(quán)限不足!','./'); 
  71.             } 
  72.             $Log_Model->checkSwitch($gid, 'n'); 
  73.             $CACHE->updateCache(); 
  74.             emDirect("./admin_log.php?active_unck=1"); 
  75.             break; 
  76.     } 

那么我們嘗試越權(quán)刪除文章http://www.test.com/admin/admin_log.php?action=operate_log&operate=del&blog=29&token=994132a26661c8c244a91063c4701a7e 失敗了提示權(quán)限不足,來到\include\model\log_model.php 發(fā)現(xiàn)

 
 
 
  1. /** 
  2.  * 刪除文章 
  3.  * 
  4.  * @param int $blogId 
  5.  */ 
  6. function deleteLog($blogId) { 
  7.  $author = ROLE == ROLE_ADMIN ? '' : 'and author=' . UID; 
  8.  $this->db->query("DELETE FROM " . DB_PREFIX . "blog where gid=$blogId $author");  //這里和上一句限制了作者只能刪除自己的文章 
  9.  if ($this->db->affected_rows() < 1) { 
  10.   emMsg('權(quán)限不足!', './'); 
  11.  } 
  12.  // 評(píng)論 
  13.  $this->db->query("DELETE FROM " . DB_PREFIX . "comment where gid=$blogId"); 
  14.  // 標(biāo)簽 
  15.  $this->db->query("UPDATE " . DB_PREFIX . "tag SET gid= REPLACE(gid,',$blogId,',',') WHERE gid LIKE '%" . $blogId . "%' "); 
  16.  $this->db->query("DELETE FROM " . DB_PREFIX . "tag WHERE gid=',' "); 
  17.  // 附件 
  18.  $query = $this->db->query("select filepath from " . DB_PREFIX . "attachment where blogid=$blogId "); 
  19.  while ($attach = $this->db->fetch_array($query)) { 
  20.   if (file_exists($attach['filepath'])) { 
  21.    $fpath = str_replace('thum-', '', $attach['filepath']); 
  22.    if ($fpath != $attach['filepath']) { 
  23.     @unlink($fpath); 
  24.    } 
  25.    @unlink($attach['filepath']); 
  26.   } 
  27.  } 
  28.  $this->db->query("DELETE FROM " . DB_PREFIX . "attachment where blogid=$blogId"); 

這個(gè)越權(quán)漏洞不存在,同時(shí)看了下面的函數(shù)判斷也是做了類似的處理

到這里其實(shí)我們對(duì)于整個(gè) CMS 的架構(gòu)已經(jīng)較為熟悉了,基本能根據(jù)對(duì)應(yīng)函數(shù)功能,直接手動(dòng)找到對(duì)應(yīng)的函數(shù)位置。

令人傷心的是,通過 Rips 代碼審計(jì)工具得到的結(jié)果,一個(gè)都沒復(fù)現(xiàn)成功...

0x07 Seay輔助審計(jì)

相信很多人都知道法師的這款工具,主要還是因?yàn)橹形?,用著方便,但是完全依靠正則的方式去匹配函數(shù),只能發(fā)現(xiàn)那些函數(shù)直接的控制漏洞,邏輯漏洞有時(shí)候可以根據(jù)逆推可以發(fā)現(xiàn),但這種情況很少。

使用這款工具掃描出來共120個(gè)可能的情況(根據(jù)經(jīng)驗(yàn)98%以上都是沒法復(fù)現(xiàn)的),然后一個(gè)個(gè)排查,有的例如SQL語(yǔ)句反單引號(hào)這樣的,很容易就可以判斷給忽略,就不需要考慮。

在 /admin/store.php 看到這樣一串代碼:

store.php

這里我的思考是,如果在emlog官網(wǎng)有URL跳轉(zhuǎn)鏈接的話,那么就可以構(gòu)造下載遠(yuǎn)程任意的文件到網(wǎng)站,但是測(cè)試了官網(wǎng)沒有跳轉(zhuǎn)鏈接,那么我們嘗試下載別的插件(鏈接跳轉(zhuǎn)等),或者有黑客精心構(gòu)造了一個(gè)插件或者模版,然后再利用,這也算是一個(gè)可行的方案。

此處需要管理員權(quán)限,作為代碼審計(jì)的一個(gè)參考思路,不是要發(fā)現(xiàn)什么0day,而是希望大家能夠在代碼審計(jì)方面有所收獲。

(1). SQL注入

對(duì)于SQL注入,Seay工具一直都沒準(zhǔn)過,這里筆者推薦方式,使用全局搜索 $_GET[ 或 $_PSOT[,然后看看是否代入了SQL查詢,然后一一驗(yàn)證。

然后我發(fā)現(xiàn)了這樣一個(gè)沒有過濾IP參數(shù)

IP參數(shù)

然后到 admin/comment.php 中查看

comment.php

再看 delCommentByIp($ip) 函數(shù)

IP參數(shù)sql

由此我們可以確定了SQL注入的存在

驗(yàn)證如下:

SQL注入

(2).一個(gè)CSRF+任意文件刪除

$_GET[]型分析完以后,就尋找$_POST[]的,然后在admin/data.php文件中找到了如下代碼

data.php

這里我們發(fā)現(xiàn),并沒有驗(yàn)證toknen,那么可以構(gòu)造csrf頁(yè)面,這里筆者就不演示了,直接BURP驗(yàn)證一下任意文件刪除吧,關(guān)于CSRF,只要沒有調(diào)用上面基礎(chǔ)函數(shù)部分說到的 LoginAuth::checkToken() 方法的,都存在CSRF

CSRF+任意刪除

這里就成功刪除了文件

(3).TAG SQL注入

在POST參數(shù)中發(fā)現(xiàn)此處并沒有過濾,同時(shí)在 deleteTag() 函數(shù)中,代入了SQL查詢,因此又是一個(gè)SQL注入

tag sql

來看deleteTag()函數(shù):

deletetag

又調(diào)用了getBlogIdsFromTagId()函數(shù),同樣沒有過濾

getBlogIdsFromTagId

因此使用抓包驗(yàn)證一下:

驗(yàn)證

但是其他語(yǔ)句利用時(shí)候并沒有回顯,筆者不知道什么原因,沒仔細(xì)探究,但是可以采用時(shí)間盲注的方式。

至此,利用工具的半自動(dòng)化審計(jì)已經(jīng)結(jié)束,下面準(zhǔn)備手工測(cè)試

0x08 手工測(cè)試

手工測(cè)試也不是單純的翻文件,應(yīng)當(dāng)以灰盒測(cè)試為主導(dǎo),從邏輯、權(quán)限、敏感信息等方面入手

(1).后臺(tái)登陸存在暴力破解風(fēng)險(xiǎn)

在這里,我之前提到過的驗(yàn)證碼未及時(shí)銷毀的歷史問題還存在,此處不再詳細(xì)敘述,請(qǐng)參考https://blog.csdn.net/dyboy2017/article/details/78433748

(2).報(bào)錯(cuò)信息導(dǎo)致物理路徑泄漏

大家不要以為這是小事情,當(dāng)sql注入存在的時(shí)候,我們有機(jī)會(huì)是可以直接寫shell文件,安全無小事

一個(gè)低權(quán)限的方式,在游客的條件下測(cè)試一下

物理路徑

payload:http://www.test.com/admin/attachment.php?action[]=

原因是:addslashes() expects parameter 1

(3).Cookie可計(jì)算

在include/lib/loginauth.php中134行開始

 
 
 
  1. /** 
  2.  * 寫用于登錄驗(yàn)證cookie 
  3.  * 
  4.  * @param int $user_id User ID 
  5.  * @param bool $remember Whether to remember the user or not 
  6.  */ 
  7. public static function setAuthCookie($user_login, $ispersis = false) { 
  8.  if ($ispersis) { 
  9.   $expiration  = time() + 3600 * 24 * 30 * 12; 
  10.  } else { 
  11.   $expiration = null; 
  12.  } 
  13.  $auth_cookie_name = AUTH_COOKIE_NAME; 
  14.  $auth_cookie = self::generateAuthCookie($user_login, $expiration); 
  15.  setcookie($auth_cookie_name, $auth_cookie, $expiration,'/'); 
  16.  
  17. /** 
  18.  * 生成登錄驗(yàn)證cookie 
  19.  * 
  20.  * @param int $user_id user login 
  21.  * @param int $expiration Cookie expiration in seconds 
  22.  * @return string Authentication cookie contents 
  23.  */ 
  24. private static function generateAuthCookie($user_login, $expiration) { 
  25.  $key = self::emHash($user_login . '|' . $expiration); 
  26.  $hash = hash_hmac('md5', $user_login . '|' . $expiration, $key); 
  27.  $cookie = $user_login . '|' . $expiration . '|' . $hash; 
  28.  return $cookie; 

可以看到此處的cookie都可以直接計(jì)算得到,只需要知道根目錄下config.php中的

 
 
 
  1. //auth key 
  2. define('AUTH_KEY','dx1&CH^En86GZnxd9CLO7GwC0Q5eYHKM450f598bbd148b6a62f7d263623e31c3'); 
  3. //cookie name 
  4. define('AUTH_COOKIE_NAME','EM_AUTHCOOKIE_VzfVniPWDqd1LM3BFocnrcjpAGH4lUbz'); 

即可。

(4).側(cè)邊欄存儲(chǔ)性XSS

為了同樣是為了支持HTML代碼的輸出,沒有轉(zhuǎn)義對(duì)應(yīng)的腳本代碼標(biāo)簽,導(dǎo)致了存儲(chǔ)性的XSS存在

側(cè)邊欄XSS

0x09 Getshell

(1).SQL注入拿到shell

如上所講有SQL注入的存在,同時(shí)可以獲取到物理路徑,那么就可以直接寫Shell

(2).后臺(tái)插件上傳zip

因?yàn)楹笈_(tái)可以直接上傳本地zip文件,這里我們?nèi)ス倬W(wǎng)下載一個(gè)插件,同時(shí)把我們的shell文件(比如dyboy.php)加入zip,上傳安裝這個(gè)插件就可以了,然后shell地址為:http://www.test.com/content/plugins/插件名/dyboy.php

(3).后臺(tái)模版上傳zip

和插件同樣的原理,這里的shell地址為:http://www.test.com/content/templates/模版名/dyboy.php

(4).備份文件拿shell

后臺(tái)的數(shù)據(jù)功能處,先備份一個(gè),然后下載到本地,加入SELECT " " into outfile 'D:\\Server\\htdocs\\safe\\dyboy.php';

然后導(dǎo)入備份恢復(fù)本地?cái)?shù)據(jù)即可

這樣就在網(wǎng)站個(gè)目錄生成了一個(gè)dyboy.php的shell

0x0A 總結(jié)

EMLOG是一個(gè)非常小巧輕快的博客系統(tǒng),運(yùn)行占用資源非常低,所以非常適合博主用作博客用途,其實(shí)只要不開啟會(huì)員功能,沒有弱口令就沒有什么大的威脅。以此文章作為PHP代碼審計(jì)拋磚引玉,文章所述方法同樣適用于其他的CMS代碼審計(jì)和分析。


標(biāo)題名稱:PHP代碼審計(jì)得這樣由淺入深地學(xué)
URL鏈接:http://m.5511xx.com/article/cosjcds.html