实战解析看我是如何在XSS漏洞实战中做到“擒贼先擒王”!

Posted 开源聚合网络空间安全研究院

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实战解析看我是如何在XSS漏洞实战中做到“擒贼先擒王”!相关的知识,希望对你有一定的参考价值。

网安教育

培养网络安全人才

技术交流、学习咨询

【实战解析】看我是如何在XSS漏洞实战中做到“擒贼先擒王”!
一、背景



本文主要记录通过代码审计的方式进行XSS漏洞挖掘,分为了找出关键位置,正向审计,反向审计三个部分,审计的系统为permeate渗透测试系统,测试系统的搭建可以参考笔者的第一篇文章。


二、操作概要

1.找出关键位置

2.正向审计

3.反向审计

三、找出关键位置


打蛇打七寸,说明在关键位置做事效率会更高,代码审计找出漏洞也是同理,因此笔者需要找出XSS关键的位置;对于目前的大多数Web应用来说,MVC模式是非常主流的一种形式,因此笔者这里将找到对应的控制器和模板,在这一节当中主要讲解找出位置的思路。


1
找出控制器



1http://permeate.songboy.net/home/index.php



1http://permeate.songboy.net/home/index.php?m=tiezi&a=index&bk=6


1<?php
2require_once "../core/common.php";
3include "./public/header.php";
4includeAction("$model","$action");
5include "./public/footer.php";
6


再次打开../core/common.php文件,代码如下所示:


 1function includeAction($model, $action)
2
{
3    //判断控制器是否存在
4    $filePath = "./action/$model.php";
5    if (is_readable($filePath)) {
6        require_once $filePath;
7        $class = new $model;
8        if (is_callable(array($class, $action))) {
9           $class->$action();
10            return true;
11        }
12    }
13
14    //如果没有找到对应的控制器,直接调用模板文件
15    $tplFilePath = "./tpl/$model/$action.php";
16    if (is_readable($tplFilePath)) {
17        require_once $tplFilePath;
18        return true;
19    }
20
21    echo '控制器或模板文件' . $filePath . '不存在!';
22    die;
23}


从代码中可以看出,其控制器文件存放在home/action/下,此时笔者打开此文件夹,可以看到几个php文件,如下图所示:


【实战解析】看我是如何在XSS漏洞实战中做到“擒贼先擒王”!


1http://permeate.songboy.net/home/index.php?m=tiezi&a=index&bk=6

联想起来其控制器文件为tiezi.php,将其打开一看:

 1<?php
2
3class tiezi
4
{
5    function __construct()
6    
{
7
8    }
9
10    public function index()
11    
{
12        .....
13        $data['count'] = $count;
14        $data['page_size'] = $page_size;
15        $data['page_count'] = $page_count;
16        $data['page_num'] = $page_num;
17        displayTpl('tiezi/index', $data);
18    }
19


果然发现了index方法。


2
找出模板


得到控制器之后,笔者还需要找到模板存放的位置,通常模板与控制器是息息相关,因此可以控制其中找到蛛丝马迹,比如上面的代码当中,最后一行代码为displayTpl函数,从字面意思上可以理解为显示模板,因此笔者通过PHPStorm的跳转功能直接跳过去查看该函数的具体流程,找到代码如下所示:


 1/**
2* 加载模板文件
3@param $tplPath
4 */

5function displayTpl($tplPath, $data = [])
6
{
7    $filePath = "./tpl/$tplPath.php";
8    if (!is_readable($filePath)) {
9        echo '模板文件' . $filePath . '不存在!';
10        die;
11    }
12
13    foreach ($data as $key => $val) {
14        $$key = $val;
15    }
16
17    require_once $filePath;
18
19}


在上面代码当中可以看出模板存放于home/tpl目录下,通过文件夹打开查看,如下图所示:


【实战解析】看我是如何在XSS漏洞实战中做到“擒贼先擒王”!

3
验证位置


通过上面的操作流程已经基本确定控制器与模板的位置,但为了防止意外,还是准确验证一下,在控制器中输出一个字符串1111111,在模板中输出字符串222222222,如果按照笔者之前所预想的,那么这两组字符串都会被输出。


在控制器中加入的测试代码如下:


1public function index()
2
{
3
4    echo '11111111111';


在模板文件中加入的测试代码如下:


1222222222222222
2<?php
3$get = $_GET;
4?>

5<section class="section">


现在会到浏览器,在当前页面单击鼠标右键,选中查看源代码,如下图所示:


【实战解析】看我是如何在XSS漏洞实战中做到“擒贼先擒王”!


在源代码当中,搜索字符串11111,果然搜索到字符串,如下图所示:

【实战解析】看我是如何在XSS漏洞实战中做到“擒贼先擒王”!


四、正向审计


在找到关键位置之后,笔者便可以针对性的去进行代码审计,XSS的代码审计主要有两种方式,正向代码审计,反向代码审计;正向代码审计的意思是从参数的接收到参数最后的使用这个流程进行检查,而反向审计则是相反从变量使用的位置上推到参数接收。


1
接收参数位置


首先通过正向方式来进行代码审计,正向代码审计是从接收参数进行排查,因此找到控制器当中,通过编辑器的搜索功能,笔者在控制器文件当中搜索了关键字 $_GET 找到了tiezi.php控制器中的index方法,代码如下所示:

 1public function index()
2    
{
3        $id = $_GET['bk'];
4        $bk = &$id;
5
6        //开始分页大小
7        $page_size = 15;
8
9        //获取当前页码
10        $page_num = empty($_GET['page']) ? 1 : $_GET['page'];
11
12        //中间代码.................省略
13
14        $data['bk'] = $bk;
15        $data['count'] = $count;
16        $data['page_size'] = $page_size;
17        $data['page_count'] = $page_count;
18        $data['page_num'] = $page_num;
19        displayTpl('tiezi/index', $data);
20    }


2
模板位置是否过滤


从上面代码当中可以看出参数bk并没有进行任何过滤,便直接放到了模板当中,这便留下安全隐患,如果在模板当中也没用进行安全过滤,那么就存在着反射型XSS漏洞,打开模板文件并搜索关键词bk,代码如下所示:


1<div class="post-list-controller">
2    <div style="float: right">
3        <a class="btn btn-primary" href="fatie.php?bk=<?php echo $bk ?>">发帖</a>
4    </div>


可以看出,模板中确实没有进行安全过滤。


3
漏洞验证


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


如下图所示:

【实战解析】看我是如何在XSS漏洞实战中做到“擒贼先擒王”!


五、反向审计


反向审计则从模板中找出使用了那些变量,并反推变量的来源,以及是否进行了安全过滤。


1
找出模板中的变量


通过PHPStrom编辑器的正则表达式功能匹配变量,正则表达式如下:

1echo \$([a-z]*)


这个正则表达式是匹配输出变量,比如匹配字符echo $zhangsan,用PHPStorm匹配到的结果如下图所示:


【实战解析】看我是如何在XSS漏洞实战中做到“擒贼先擒王”!


双击鼠标左键打开对应代码文件/home/search.php,代码如下所示:


【实战解析】看我是如何在XSS漏洞实战中做到“擒贼先擒王”!

在代码中可以看出变量直接放在模板当中,如果在控制器当中也没有转义此变量的来源,那么很有可能会存在XSS问题。


2
 查找变量来源


追踪变量$keyword,找到变量来源:

1<?php
2include "public/header.php";
3include "../core/common.php";
4
5$keywords = $_REQUEST['keywords'];
6if (!empty($keywords)) {
7    $where = " where title like '%$keywords%' ";
8


从上面的代码当中可以看出变量$keywords并没有进行任何过滤,因此可以笃定此处也存在这XSS漏洞问题。


3
漏洞验证



1http://permeate.songboy.net/home/search.php?keywords=%E6%B5%8B%E8%AF%95%3Cscript%3Ealert(123)%3C/script%3E



【实战解析】看我是如何在XSS漏洞实战中做到“擒贼先擒王”!

在提示框当中果然弹出了123的提示。


P.S. 如果对笔者的Web安全文章较为感兴趣,可以关注笔者更多文章内容.

(文:我是daxia)

END
【实战解析】看我是如何在XSS漏洞实战中做到“擒贼先擒王”!


开源聚合网安训练营

开源聚合网络安全金秋蜕变黑客培训技术开始了!学网络安全技术、以攻促防、攻防兼备、升职加薪……有兴趣的可以加入开源聚合网安大家庭,一起学习、一起成长。近期还推出了NSACE网络信息安全高级工程师认证,考证书求职加分、升级加薪,有兴趣的可以入群了解详情,有任何问题都可以咨询客服小姐姐哦

【实战解析】看我是如何在XSS漏洞实战中做到“擒贼先擒王”!


精选文章

基础教程
我们贴心备至
用户答疑
 QQ在线客服
加入社群
QQ+微信等着你

以上是关于实战解析看我是如何在XSS漏洞实战中做到“擒贼先擒王”!的主要内容,如果未能解决你的问题,请参考以下文章

通过代码审计找出网站中的XSS漏洞实战

通过代码审计找出网站中的XSS漏洞实战

XSS漏洞实战教程下载

DOM型XSS实战分析

DVWA 黑客攻防实战反射型 XSS 攻击 Reflected Cross Site Scripting

XSS跨站漏洞 加强Web安全