您好,登錄后才能下訂單哦!
如何通過代碼審計(jì)找出網(wǎng)站中的XSS漏洞,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
筆者此前錄制了一套XSS的視頻教程,在漏洞案例一節(jié)中講解手工挖掘、工具挖掘、代碼審計(jì)三部分內(nèi)容,準(zhǔn)備將內(nèi)容用文章的形式再次寫一此,前兩篇已經(jīng)寫完,內(nèi)容有一些關(guān)聯(lián)性,其中手工XSS挖掘篇地址為快速找出網(wǎng)站中可能存在的XSS漏洞實(shí)踐。
這里主要記錄通過代碼審計(jì)的方式進(jìn)行XSS漏洞挖掘,分為了找出關(guān)鍵位置,正向?qū)徲?jì),反向?qū)徲?jì)三個部分,審計(jì)的系統(tǒng)為permeate滲透測試系統(tǒng)
,測試系統(tǒng)的搭建可以參考筆者的第一篇文章。
1.找出關(guān)鍵位置
2.正向?qū)徲?jì)
3.反向?qū)徲?jì)
打蛇打七寸,說明在關(guān)鍵位置做事效率會更高,代碼審計(jì)找出漏洞也是同理,因此筆者需要找出XSS關(guān)鍵的位置;對于目前的大多數(shù)Web應(yīng)用來說,MVC模式是非常主流的一種形式,因此筆者這里將找到對應(yīng)的控制器和模板,在這一節(jié)當(dāng)中主要講解找出位置的思路。
找出控制器的方式通常是通過主入口文件與URL地址兩塊去分析,現(xiàn)在筆者打開首頁,發(fā)現(xiàn)URL地址為:
http://permeate.songboy.net/home/index.php
當(dāng)點(diǎn)擊板塊后,URL地址變成了如下地址:
http://permeate.songboy.net/home/index.php?m=tiezi&a=index&bk=6
從URL地址中可以看到不管首頁還是板塊頁面,都經(jīng)過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; } } //如果沒有找到對應(yīng)的控制器,直接調(diào)用模板文件 $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
聯(lián)想起來其控制器文件為tiezi.php
,將其打開一看:
<?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); }
果然發(fā)現(xiàn)了index方法。
得到控制器之后,筆者還需要找到模板存放的位置,通常模板與控制器是息息相關(guān),因此可以控制其中找到蛛絲馬跡,比如上面的代碼當(dāng)中,最后一行代碼為displayTpl
函數(shù),從字面意思上可以理解為顯示模板,因此筆者通過PHPStorm的跳轉(zhuǎn)功能直接跳過去查看該函數(shù)的具體流程,找到代碼如下所示:
/** * 加載模板文件 * @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; }
在上面代碼當(dāng)中可以看出模板存放于home/tpl
目錄下,通過文件夾打開查看,如下圖所示:
通過上面的操作流程已經(jīng)基本確定控制器與模板的位置,但為了防止意外,還是準(zhǔn)確驗(yàn)證一下,在控制器中輸出一個字符串1111111,在模板中輸出字符串222222222,如果按照筆者之前所預(yù)想的,那么這兩組字符串都會被輸出。
在控制器中加入的測試代碼如下:
public function index() { echo '11111111111';
在模板文件中加入的測試代碼如下:
222222222222222 <?php $get = $_GET; ?> <section class="section">
現(xiàn)在會到瀏覽器,在當(dāng)前頁面單擊鼠標(biāo)右鍵,選中查看源代碼,如下圖所示:
在源代碼當(dāng)中,搜索字符串11111
,果然搜索到字符串,如下圖所示:
在找到關(guān)鍵位置之后,筆者便可以針對性的去進(jìn)行代碼審計(jì),XSS的代碼審計(jì)主要有兩種方式,正向代碼審計(jì),反向代碼審計(jì);正向代碼審計(jì)的意思是從參數(shù)的接收到參數(shù)最后的使用這個流程進(jìn)行檢查,而反向?qū)徲?jì)則是相反從變量使用的位置上推到參數(shù)接收。
首先通過正向方式來進(jìn)行代碼審計(jì),正向代碼審計(jì)是從接收參數(shù)進(jìn)行排查,因此找到控制器當(dāng)中,通過編輯器的搜索功能,筆者在控制器文件當(dāng)中搜索了關(guān)鍵字 $_GET 找到了tiezi.php
控制器中的index
方法,代碼如下所示:
public function index() { $id = $_GET['bk']; $bk = &$id; //開始分頁大小 $page_size = 15; //獲取當(dāng)前頁碼 $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); }
從上面代碼當(dāng)中可以看出參數(shù)bk
并沒有進(jìn)行任何過濾,便直接放到了模板當(dāng)中,這便留下安全隱患,如果在模板當(dāng)中也沒用進(jìn)行安全過濾,那么就存在著反射型XSS漏洞,打開模板文件并搜索關(guān)鍵詞bk
,代碼如下所示:
<div class="post-list-controller"><div ><a class="btn btn-primary" href="fatie.php?bk=<?php echo $bk ?>">發(fā)帖</a></div>
可以看出,模板中確實(shí)沒有進(jìn)行安全過濾。
http://permeate.songboy.net/home/index.php?m=tiezi&a=index&bk=6%22%3E%3Cscript%3Ealert(123)%3C/script%3E
如下圖所示:
反向?qū)徲?jì)則從模板中找出使用了那些變量,并反推變量的來源,以及是否進(jìn)行了安全過濾。
通過PHPStrom編輯器的正則表達(dá)式功能匹配變量,正則表達(dá)式如下:
echo \$([a-z]*)
這個正則表達(dá)式是匹配輸出變量,比如匹配字符echo $zhangsan
,用PHPStorm匹配到的結(jié)果如下圖所示:
雙擊鼠標(biāo)左鍵打開對應(yīng)代碼文件/home/search.php
,代碼如下所示:
在代碼中可以看出變量直接放在模板當(dāng)中,如果在控制器當(dāng)中也沒有轉(zhuǎn)義此變量的來源,那么很有可能會存在XSS問題。
追蹤變量$keyword
,找到變量來源:
<?php include "public/header.php"; include "../core/common.php"; $keywords = $_REQUEST['keywords']; if (!empty($keywords)) { $where = " where title like '%$keywords%' ";
從上面的代碼當(dāng)中可以看出變量$keywords
并沒有進(jìn)行任何過濾,因此可以篤定此處也存在這XSS漏洞問題。
從代碼的位置發(fā)現(xiàn)與前面的唯一入口不同,此代碼文件并不是類文件,因此嘗試直接訪問,構(gòu)造出URL地址如下:
http://permeate.songboy.net/home/search.php?keywords=%E6%B5%8B%E8%AF%95%3Cscript%3Ealert(123)%3C/script%3E
通過火狐瀏覽器訪問此URL地址之后,出現(xiàn)結(jié)果如下圖所示:
在提示框當(dāng)中果然彈出了123
的提示。
關(guān)于如何通過代碼審計(jì)找出網(wǎng)站中的XSS漏洞問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。