筆者此前錄製了一套XSS的視頻教程,在漏洞案例一節中講解手工挖掘、工具挖掘、代碼審計三部份內容,準備將內容用文章的形式再次寫一此,前兩篇已經寫完,內容有一些關聯性,其中手工XSS挖掘篇地址爲快速找出網站中可能存在的XSS漏洞實踐(一)https://segmentfault.com/a/1190000016095198
php
本文主要記錄經過代碼審計的方式進行XSS漏洞挖掘,分爲了找出關鍵位置,正向審計,反向審計三個部分,審計的系統爲permeate滲透測試系統
,測試系統的搭建能夠參考筆者的第一篇文章。正則表達式
打蛇打七寸,說明在關鍵位置作事效率會更高,代碼審計找出漏洞也是同理,所以筆者須要找出XSS關鍵的位置;對於目前的大多數Web應用來講,MVC模式是很是主流的一種形式,所以筆者這裏將找到對應的控制器和模板,在這一節當中主要講解找出位置的思路segmentfault
找出控制器的方式一般是經過主入口文件與URL地址兩塊去分析,如今筆者打開首頁,發現URL地址爲瀏覽器
http://permeate.songboy.net/home/index.php
當點擊板塊後,URL地址變成了以下地址安全
http://permeate.songboy.net/home/index.php?m=tiezi&a=index&bk=6
從URL地址中能夠看到無論首頁仍是板塊頁面,都通過URL地址home/index.php
,所以筆者接下來即可以經過打開home/index.php
文件來查看控制器所存放的位置,打開後代碼以下所示微信
<?php require_once "../core/common.php"; include "./public/header.php"; includeAction("$model","$action"); include "./public/footer.php";
再次打開../core/common.php
文件,代碼以下所示編輯器
function includeAction($model, $action) { //判斷控制器是否存在 $filePath = "./action/$model.php"; if (is_readable($filePath)) { require_once $filePath; $class = new $model; if (is_callable(array($class, $action))) { $class->$action(); return true; } } //若是沒有找到對應的控制器,直接調用模板文件 $tplFilePath = "./tpl/$model/$action.php"; if (is_readable($tplFilePath)) { require_once $tplFilePath; return true; } echo '控制器或模板文件' . $filePath . '不存在!'; die; }
從代碼中能夠看出,其控制器文件存放在home/action/
下,此時筆者打開此文件夾,能夠看到幾個php文件,以下圖所示函數
回想剛纔筆者所看到的URL地址以下工具
http://permeate.songboy.net/home/index.php?m=tiezi&a=index&bk=6
聯想起來其控制器文件爲tiezi.php
,將其打開一看post
<?php class tiezi { function __construct() { } public function index() { ..... $data['count'] = $count; $data['page_size'] = $page_size; $data['page_count'] = $page_count; $data['page_num'] = $page_num; displayTpl('tiezi/index', $data); }
果真發現了index方法
獲得控制器以後,筆者還須要找到模板存放的位置,一般模板與控制器是息息相關,所以能夠控制其中找到蛛絲馬跡,好比上面的代碼當中,最後一行代碼爲displayTpl
函數,從字面意思上能夠理解爲顯示模板,所以筆者經過PHPStorm的跳轉功能直接跳過去查看該函數的具體流程,找到代碼以下所示
/** * 加載模板文件 * @param $tplPath */ function displayTpl($tplPath, $data = []) { $filePath = "./tpl/$tplPath.php"; if (!is_readable($filePath)) { echo '模板文件' . $filePath . '不存在!'; die; } foreach ($data as $key => $val) { $$key = $val; } require_once $filePath; }
在上面代碼當中能夠看出模板存放於home/tpl
目錄下,經過文件夾打開查看,以下圖所示
經過上面的操做流程已經基本肯定控制器與模板的位置,但爲了防止意外,仍是準確驗證一下,在控制器中輸出一個字符串1111111,在模板中輸出字符串222222222,若是按照筆者以前所預想的,那麼這兩組字符串都會被輸出,參考代碼以下
在控制器中加入的測試代碼以下
public function index() { echo '11111111111';
在模板文件中加入的測試代碼以下
222222222222222 <?php $get = $_GET; ?> <section class="section">
如今會到瀏覽器,在當前頁面單擊鼠標右鍵,選中查看源代碼,以下圖所示
在源代碼當中,搜索字符串11111
,果真搜索到字符串,以下圖所示
在找到關鍵位置以後,筆者即可以針對性的去進行代碼審計,XSS的代碼審計主要有兩種方式,正向代碼審計,反向代碼審計;正向代碼審計的意思是從參數的接收到參數最後的使用這個流程進行檢查,而反向審計則是相反從變量使用的位置上推到參數接收
首先經過正向方式來進行代碼審計,正向代碼審計是從接收參數進行排查,所以找到控制器當中,經過編輯器的搜索功能,筆者在控制器文件當中搜索了關鍵字 $_GET 找到了tiezi.php
控制器中的index
方法,代碼以下所示
public function index() { $id = $_GET['bk']; $bk = &$id; //開始分頁大小 $page_size = 15; //獲取當前頁碼 $page_num = empty($_GET['page']) ? 1 : $_GET['page']; //中間代碼.................省略 $data['bk'] = $bk; $data['count'] = $count; $data['page_size'] = $page_size; $data['page_count'] = $page_count; $data['page_num'] = $page_num; displayTpl('tiezi/index', $data); }
從上面代碼當中能夠看出參數bk
並無進行任何過濾,便直接放到了模板當中,這便留下安全隱患,若是在模板當中也沒用進行安全過濾,那麼就存在着反射型XSS漏洞,打開模板文件並搜索關鍵詞bk
,代碼以下所示
<div class="post-list-controller"> <div style="float: right"> <a class="btn btn-primary" href="fatie.php?bk=<?php echo $bk ?>">發帖</a> </div>
能夠看出,模板中確實沒有進行安全過濾
http://permeate.songboy.net/home/index.php?m=tiezi&a=index&bk=6%22%3E%3Cscript%3Ealert(123)%3C/script%3E
以下圖所示
反向審計則從模板中找出使用了那些變量,並反推變量的來源,以及是否進行了安全過濾
經過PHPStrom編輯器的正則表達式功能匹配變量,正則表達式以下
echo \$([a-z]*)
這個正則表達式是匹配輸出變量,好比匹配字符echo $zhangsan
,用PHPStorm匹配到的結果以下圖所示
雙擊鼠標左鍵打開對應代碼文件/home/search.php
,代碼以下所示
在代碼中能夠看出變量直接放在模板當中,若是在控制器當中也沒有轉義此變量的來源,那麼頗有可能會存在XSS問題。
追蹤變量$keyword
,找到變量來源
<?php include "public/header.php"; include "../core/common.php"; $keywords = $_REQUEST['keywords']; if (!empty($keywords)) { $where = " where title like '%$keywords%' ";
從上面的代碼當中能夠看出變量$keywords
並無進行任何過濾,所以能夠篤定此處也存在這XSS漏洞問題
從代碼的位置發現與前面的惟一入口不一樣,此代碼文件並非類文件,所以嘗試直接訪問,構造出URL地址以下
http://permeate.songboy.net/home/search.php?keywords=%E6%B5%8B%E8%AF%95%3Cscript%3Ealert(123)%3C/script%3E
經過火狐瀏覽器訪問此URL地址以後,出現結果以下圖所示
在提示框當中果真彈出了123
的提示
若是對筆者的Web安全文章較爲感興趣,能夠關注筆者更多文章內容,新書《PHP Web安全開發實戰》,現已在各大網點銷售,封面以下圖所示
做者:湯青松
微信:songboy8888
日期:2018-10-09
個人博客即將同步至騰訊雲+社區,邀請你們一同入駐:https://cloud.tencent.com/dev...