这里主要是跟着迪总的教程进行手把手复现,做的一些学习笔记,只有自己动手做了一遍才能学到东西。
环境搭建
- 小皮面板设置好
- phpstorm xdebug设置那调成127.0.0.1
- 访问127.0.0.1直接跳转127.0.0.1/install,因为小皮面板设置过了
- 这里报错说没有相应的数据库
- 手动创建数据库,navicat创建xhcms数据库
- 此时源码安装完成
seay找漏洞——XSS漏洞
- echo搜索,优先找非后台的,即非/admin目录的
- 找一个
- 进来全文追踪一下这个$nav变量
- 全局定位到$nav后,再全局追踪$resul
- 找到$resul的是这个mysql_query语句的结果,mysql_query里是$query
- 再追踪这个$query语句是写死的,所以这个echo处没有漏洞
- 再看另一处$echo,受到$pages $info两处变量影响
- 追踪这个$info,它也受$resul影响,所以也是没得漏洞
- 追踪$pages,发现page是从$_GET[('page')]截出来的,还有个addslashes()函数。这个函数它拦截不了xss的payload,这里就有可能存在xss漏洞
- 漏洞复现,/files/contact.php处,直接定位到127.0.0.1/files/contact.php,发现报错了。这是因为代码属于MVC架构,直接通过代码的结构去找它对应的web是不对的
- MVC架构的代码定位它的位置要根据源码的要求来
- 简单对这个index.php代码做个剖析
<?php
//单一入口模式
error_reporting(0); //关闭错误显示
$file=addslashes($_GET['r']); //接收文件名
$action=$file==''?'index':$file; //判断为空或者等于index
include('files/'.$action.'.php'); //载入相应文件
?>
1. error_reporting(0);:这行代码关闭了错误报告。这意味着如果代码中有任何错误,它们都不会显示出来。
2. $file=addslashes($_GET['r']);:这行代码从 URL 的查询字符串中获取 'r' 参数的值,并将其赋值给 $file 变量。addslashes() 函数用于在预定义字符前添加反斜杠,可以防止 SQL 注入。
3. $action=$file==''?'index':$file;:这行代码利用了三元运算符。三元运算符的格式是 条件 ? 值1 : 值2。如果条件为真(即非零或非空),则返回值1,否则返回值2。如果 $file 为空字符串(''),那么 $action 的值将被设置为 'index',否则 $action 的值将被设置为 $file 的值
4. include('files/'.$action.'.php');:这行代码包含了一个 PHP 文件,该文件的路径是 'files/' 目录下,文件名是 $action 变量的值,并且文件扩展名是 '.php'。
- 访问http://127.0.0.1/index.php?r=contact
- 访问http://127.0.0.1/index.php?r=contact&page=1
- 看看页面有无参数,构造关键字访问http://127.0.0.1/index.php?r=contact&page=1aaa
- 源代码搜索确实有1aaa
- 1aaa对应的源码位置
- 构造payload http://127.0.0.1/index.php?r=contact&page=1aaa<script>alert(1)<script>,漏洞存在。因为这里有addslashes()函数在,所以alert("")里面出现"会被转义掉
文件包含漏洞
- 重点看以下的函数:include、 include_once 、require require_once等
- seay搜索include函数
- 文件包含有后缀限制,它会自动加上.php后缀
- 在源码的files目录下有个test.php文件
- 构造payload,去尝试文件包含 127.0.0.1/?r=test
- 将test.php改为test.txt,此时构造payoload http://127.0.0.1/?r=../test.txt,没有任何显示,因为会$action后面会自动跟上.php后缀
- 这里可以通过截断字符绕过,注意windows的截断字符要>256、linux的阶段字符要>4096;payload如下:
http://127.0.0.1/xhcms/?r=test.txt................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
目的是把后面的.php字符截断掉。但是这里对php的版本有要求,php版本必须小于5.3.29。我这里小皮面板没有装好5.2的版本,就换phpstudy来搭建环境了
- 将test.txt放置在网站根目录WWW的上两级目录,构造payload:
http://127.0.0.1/xhcms/?r=../../../test.txt........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
后记
本次做的比较简单,但是还是能学到很多东西的,后面也会分享更多的审计文章。