天天看點

通過代碼審計找出網站中的XSS漏洞實戰(三)

一、背景

筆者此前錄制了一套XSS的視訊教程,在漏洞案例一節中講解手工挖掘、工具挖掘、代碼審計三部分内容,準備将内容用文章的形式再次寫一此,前兩篇已經寫完,内容有一些關聯性,其中手工XSS挖掘篇位址為

快速找出網站中可能存在的XSS漏洞實踐(一)

https://segmentfault.com/a/1190000016095198

本文主要記錄通過代碼審計的方式進行XSS漏洞挖掘,分為了找出關鍵位置,正向審計,反向審計三個部分,審計的系統為

permeate滲透測試系統

,測試系統的搭建可以參考筆者的第一篇文章。

二、操作概要

  1. 找出關鍵位置
  2. 正向審計
  3. 反向審計

三、找出關鍵位置

打蛇打七寸,說明在關鍵位置做事效率會更高,代碼審計找出漏洞也是同理,是以筆者需要找出XSS關鍵的位置;對于目前的大多數Web應用來說,MVC模式是非常主流的一種形式,是以筆者這裡将找到對應的控制器和模闆,在這一節當中主要講解找出位置的思路

3.1 找出控制器

找出控制器的方式通常是通過主入口檔案與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

,将其打開一看

<?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方法

3.2 找出模闆

得到控制器之後,筆者還需要找到模闆存放的位置,通常模闆與控制器是息息相關,是以可以控制其中找到蛛絲馬迹,比如上面的代碼當中,最後一行代碼為

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

目錄下,通過檔案夾打開檢視,如下圖所示

3.3 驗證位置

通過上面的操作流程已經基本确定控制器與模闆的位置,但為了防止意外,還是準确驗證一下,在控制器中輸出一個字元串1111111,在模闆中輸出字元串222222222,如果按照筆者之前所預想的,那麼這兩組字元串都會被輸出,參考代碼如下

在控制器中加入的測試代碼如下

public function index()
{
    
    echo '11111111111';           

在模闆檔案中加入的測試代碼如下

222222222222222
<?php
$get = $_GET;
?>
<section class="section">           

現在會到浏覽器,在目前頁面單擊滑鼠右鍵,選中檢視源代碼,如下圖所示

在源代碼當中,搜尋字元串

11111

,果然搜尋到字元串,如下圖所示

四、正向審計

在找到關鍵位置之後,筆者便可以針對性的去進行代碼審計,XSS的代碼審計主要有兩種方式,正向代碼審計,反向代碼審計;正向代碼審計的意思是從參數的接收到參數最後的使用這個流程進行檢查,而反向審計則是相反從變量使用的位置上推到參數接收

4.1 接收參數位置

首先通過正向方式來進行代碼審計,正向代碼審計是從接收參數進行排查,是以找到控制器當中,通過編輯器的搜尋功能,筆者在控制器檔案當中搜尋了關鍵字 $_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);
    }           

4.2 模闆位置是否過濾

從上面代碼當中可以看出參數

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>           

可以看出,模闆中确實沒有進行安全過濾

4.3 漏洞驗證

http://permeate.songboy.net/home/index.php?m=tiezi&a=index&bk=6%22%3E%3Cscript%3Ealert(123)%3C/script%3E           

如下圖所示

五、反向審計

反向審計則從模闆中找出使用了那些變量,并反推變量的來源,以及是否進行了安全過濾

5.1 找出模闆中的變量

通過PHPStrom編輯器的正規表達式功能比對變量,正規表達式如下

echo \$([a-z]*)           

這個正規表達式是比對輸出變量,比如比對字元

echo $zhangsan

,用PHPStorm比對到的結果如下圖所示

輕按兩下滑鼠左鍵打開對應代碼檔案

/home/search.php

在代碼中可以看出變量直接放在模闆當中,如果在控制器當中也沒有轉義此變量的來源,那麼很有可能會存在XSS問題。

5.2 查找變量來源

追蹤變量

$keyword

,找到變量來源

<?php
include "public/header.php";
include "../core/common.php";

$keywords = $_REQUEST['keywords'];
if (!empty($keywords)) {
    $where = " where title like '%$keywords%' ";           

從上面的代碼當中可以看出變量

$keywords

并沒有進行任何過濾,是以可以笃定此處也存在這XSS漏洞問題

5.3 漏洞驗證

從代碼的位置發現與前面的唯一入口不同,此代碼檔案并不是類檔案,是以嘗試直接通路,構造出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安全開發實戰》,現已在各大網點銷售,封面如下圖所示

作者:湯青松

日期:2018-10-09

上一篇: vue事件綁定
下一篇: vue 過濾器