通过代码审计找出网站中的XSS漏洞实战(三)
一、背景
笔者此前录制了一套XSS的视频教程,在漏洞案例一节中讲解手工挖掘、工具挖掘、代码审计三部分内容,准备将内容用文章的形式再次写一此,前两篇已经写完,内容有一些关联性,其中手工XSS挖掘篇地址为快速找出网站中可能存在的XSS漏洞实践(一)https://segmentfault.com/a/1190000016095198
本文主要记录通过代码审计的方式进行XSS漏洞挖掘,分为了找出关键位置,正向审计,反向审计三个部分,审计的系统为permeate渗透测试系统,测试系统的搭建可以参考笔者的第一篇文章。
二、操作概要
- 找出关键位置
- 正向审计
- 反向审计
三、找出关键位置
打蛇打七寸,说明在关键位置做事效率会更高,代码审计找出漏洞也是同理,因此笔者需要找出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安全开发实战》,现已在各大网点销售,封面如下图所示

作者:汤青松
微信:songboy8888
日期:2018-10-09
通过代码审计找出网站中的XSS漏洞实战(三)的更多相关文章
- 通过Web安全工具Burp suite找出网站中的XSS漏洞实战(二)
一.背景 笔者6月份在慕课网录制视频教程XSS跨站漏洞 加强Web安全,里面需要讲到很多实战案例,在漏洞挖掘案例中分为了手工挖掘.工具挖掘.代码审计三部分内容,手工挖掘篇参考地址为快速找出网站中可能存 ...
- 快速找出网站中可能存在的XSS漏洞实践
笔者写了一些XSS漏洞的挖掘过程记录下来,方便自己也方便他人. 一.背景 在本篇文章当中会一permeate生态测试系统为例,笔者此前写过一篇文章当中笔者已经讲解如何安装permeate渗透测试系统, ...
- 快速找出网站中可能存在的XSS漏洞实践(一)
一.背景 笔者最近在慕课录制了一套XSS跨站漏洞 加强Web安全视频教程,课程当中有讲到XSS的挖掘方式,所以在录制课程之前需要做大量实践案例,最近视频已经录制完成,准备将这些XSS漏洞的挖掘过程记录 ...
- 利用PHP扩展Taint找出网站的潜在安全漏洞实践
一.背景 笔者从接触计算机后就对网络安全一直比较感兴趣,在做PHP开发后对web安全一直比较关注,2016时无意中发现Taint这个扩展,体验之后发现确实好用:不过当时在查询相关资料时候发现关注此扩展 ...
- 阅读OReilly.Web.Scraping.with.Python.2015.6笔记---找出网页中所有的href
阅读OReilly.Web.Scraping.with.Python.2015.6笔记---找出网页中所有的href 1.查找以<a>开头的所有文本,然后判断href是否在<a> ...
- [LeetCode] Find All Numbers Disappeared in an Array 找出数组中所有消失的数字
Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and ot ...
- 剑指Offer 找出字符串中第一个只出现一次的字符
题目描述 找出字符串中第一个只出现一次的字符 如果无此字符 请输出'.' 输入描述: 输入一串字符,由小写字母组成 输出描述: 输出一个字符 输入例子: asdfasdfo 输出例子: o 思路:数组 ...
- 找出字符串中第一个不重复的字符(JavaScript实现)
如题~ 此算法仅供参考,小菜基本不懂高深的算法,只能用最朴实的思想去表达. //找出字符串中第一个不重复的字符 // firstUniqueChar("vdctdvc"); --& ...
- 剑指Offer:找出数组中出现次数超过一半的元素
题目:找出数组中出现次数超过一半的元素 解法:每次删除数组中两个不同的元素,删除后,要查找的那个元素的个数仍然超过删除后的元素总数的一半 #include <stdio.h> int ha ...
随机推荐
- SQL SERVER中生僻字问题存储与查询问题
以下仅记录碰到的几个问题 1.首先字段设置为varchar的时候存储后无法进行正常的显示 显示为? 此状态下匹配查询或者Like模糊查询都没问题 2.将字段设置为nvarchar,在进行插入或者跟新时 ...
- 使用jquery删除链接所在的行
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- <java程序大集合>
1.以下关于开发java程序的描述错误的是(). A.开发java程序的步骤包括:编写源程序,编译,运行 B.编写的java源程序文件使用.java作为扩展名 C:java源文件经编译后,生成后娺为. ...
- 主机cpu突然飙高,如何快速排查问题
[问题发现] 使用zabbix软件监控服务器时发现cpu突然异常,在业务主机上使用top命令查看系统的整体运行情况,使用top命令后发现mysqld占用CPU特别高,初步判断可能是mysqld出现问题 ...
- 2019杭电多校第二场hdu6602 Longest Subarray(线段树)
Longest Subarray 题目传送门 解题思路 本题求一个最大的子区间,满足区间内的数字要么出现次数大于等于k次,要么没出现过.给定区间内的数字范围是1~c. 如果r为右边界,对于一种数字x, ...
- hdoj 4712 Hamming Distance(靠人品过的)
我先解释一下汉明距离 以下来自百度百科 在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的字符不同的个数.换句话说,它就是将 一个字符串变换成另外一个字符串所需要替换的字符个数. 例如: ...
- 从原理层面掌握HandlerMethod、InvocableHandlerMethod、ServletInvocableHandlerMethod的使用【一起学Spring MVC】
每篇一句 想当火影的人没有近道可寻,当上火影的人同样无路可退 前言 HandlerMethod它作为Spring MVC的非公开API,可能绝大多数小伙伴都对它比较陌生,但我相信你对它又不是那么的生疏 ...
- mysql新增一列为主键
mysql新增一列为主键 由于一次疏忽在建表的时候忘记加上主键了, 但是目前来说表里面又有数据了,所以不能删表重建,所以需要新加一列主键 然后我就新加一列,并且为auto_increment,然后设置 ...
- 逆向破解之160个CrackMe —— 001
CrackMe —— 001 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
- Install eclipse ns3 in ubuntu 14.04
1. NS3 install 参考NS3 tutorial即可. 2.eclipse 2.1下载 下载地址:http://www.eclipse.org/downloads/ ...