C11期作业17(07.05)
目录
一、安装fortify并以pikachu靶场为目标进行练习熟练使用fortify
安装fortify
下载
安装
运行
使用fortify分析pikachu源码
点击Advanced Scan按钮,打开pikachu源码(可他处获取)目录
排除无需检测的文件夹。如选中assets目录,点击Exclude按钮
此步骤可默认或根据需要调整
此步骤可只改这里。然后点击Scan按钮
扫描完成后,点击某个漏洞的界面
二、复习php代码审计函数精讲相关内容,重点是SESSION验证绕过、urldecode二次编码绕过、str_replace绕过
SESSION验证绕过
代码示例
绕过方式
urldecode二次编码绕过
代码示例
绕过方式
str_replace绕过
代码示例
绕过方式
三、复习php伪协议
简介
file:// 协议
条件:不受 allow_url_fopen 与 allow_url_include 的影响
作用:是 PHP 使⽤的默认封装协议,⽤于访问本地⽂件系统
用法
php:// 协议
条件
作用:访问各个输⼊/输出流,一般php://filter ⽤于读取源码, php://input ⽤于执⾏php代码
php://input
php://filter
zip:// & bzip2:// & zlib:// 协议
条件:不受 allow_url_fopen 与 allow_url_include 的影响
作⽤: zip:// & bzip2:// & zlib:// 均属于压缩流,可以访问压缩⽂件中的⼦⽂件,更重要的是不需要指定后缀名,可修改为任意后缀: jpg png gif xxx 等等
zip://[压缩⽂件路径]%23[压缩⽂件内的⼦⽂件名] (#编码为%23)
其他协议用法
data:// 协议
条件:allow_url_fopen :on,allow_url_include :on
作⽤:⾃ PHP>=5.2.0 起,可以使⽤ data:// 数据流封装器,以传递相应格式的数据。通常可以⽤来执⾏PHP代码
用法
http:// & https:// 协议
条件:allow_url_fopen :on,allow_url_include :on
作⽤:常规 URL 形式,允许通过 HTTP 1.0 的 GET⽅法,以只读访问⽂件或资源。CTF中通常⽤于远程包含
示例
phar:// 协议
phar:// 协议与 zip:// 类似,同样可以访问zip格式压缩包内容
示例
四、搭建并部署微商城系统并结合课件审计复习文件上传漏洞
环境搭建
获取源码并解压
在phpStudy中配置站点
创建数据库mall并导⼊数据库⽂件(mysql_data_E7VvC.sql)到数据库
修改数据库链接⽂件:/Mao/common.php
访问站点
审计文件上传漏洞
使用fortify扫描代码,有一处文件上传漏洞(api/api.php,302行)
相关代码截图
漏洞分析:验证了文件类型和文件大小,验证文件类型不严格,可被绕过
漏洞利用
一、安装fortify并以pikachu靶场为目标进行练习熟练使用fortify
-
安装fortify
-
下载
链接: https://pan.baidu.com/s/1oStDkLGeWvl1eg0VanCxfw 提取码: 2025
-
安装
- 分别安装(安装完成后,默认路径是C:\Program Files\Fortify)
- 将fortify-common-23.2.0.0023.jar⽂件分别将下⾯路径的⽂件覆盖
- Fortify_Apps_and_Tools_23.2.0\Core\lib
- Fortify_SCA_23.2.0\Core\lib
- 更新规则
- 解压FortifyRules_zh_CH_2023.1.1.0001(离线规则库).zip
- 删除Fortify_SCA_23.2.0\Core\config⽬录下的ExternalMetadata和rules⽂件夹,然后把解压的ExternalMetadata和rules⽂件夹拷⻉到该⽬录下
- 分别安装(安装完成后,默认路径是C:\Program Files\Fortify)
-
运行
- 以管理员身份打开Fortify_Apps_and_Tools_23.1.0\bin 下的auditworkbench.cmd
- 打开后如下图
-
-
使用fortify分析pikachu源码
-
点击Advanced Scan按钮,打开pikachu源码(可他处获取)目录
-
排除无需检测的文件夹。如选中assets目录,点击Exclude按钮
-
此步骤可默认或根据需要调整
-
此步骤可只改这里。然后点击Scan按钮
-
扫描完成后,点击某个漏洞的界面
-
二、复习php代码审计函数精讲相关内容,重点是SESSION验证绕过、urldecode二次编码绕过、str_replace绕过
-
SESSION验证绕过
-
代码示例
session_start(); if(isset($_GET['a']) && $_GET['a'] == $_SESSION['a']){echo "登陆成功"; }
-
绕过方式
- 删除cookie中PHPSESSID,则$_SESSION['a']为空, 让$_GET['a']为空即可
- 请求方式
-
-
urldecode二次编码绕过
-
代码示例
if(strpos($_GET['id'], "magedu") === false && urldecode($_GET["id"]) == "magedu"){echo "绕过了!"; }
-
绕过方式
-
将第⼀个字符m进⾏url⼆次编码,一次编码为:%6d,⼆次编码为%256d
-
首次编码被浏览器解码,二次编码被代码解码
-
请求方式
-
-
-
str_replace绕过
-
代码示例
$ret= str_replace('../','',$_GET['filename']); echo $ret;
-
绕过方式
- str_replace函数只会替换一次,因此可构造内容,替换后内容仍包含过滤字符串
- 请求方式
-
三、复习php伪协议
-
简介
- 在PHP中,伪协议是⼀种特殊的协议,⽤于访问不同的数据源
- 它们并不是真正的⽹络协议,⽽是⼀种封装协议,使得PHP能够以特定的⽅式访问和操作数据
- PHP提供了多种伪协议,每种伪协议都有其特定的⽤途和功能
file:// — 访问本地⽂件系统 http:// — 访问 HTTP(s) ⽹址 ftp:// — 访问 FTP(s) URLs php:// — 访问各个输⼊/输出流(I/O streams) zlib:// — 压缩流 data:// — 数据(RFC 2397) glob:// — 查找匹配的⽂件路径模式 phar:// — PHP 归档 ssh2:// — Secure Shell 2 rar:// — RARd ogg:// — ⾳频流 expect:// — 处理交互式的流
-
file:// 协议
-
条件:不受 allow_url_fopen 与 allow_url_include 的影响
-
作用:是 PHP 使⽤的默认封装协议,⽤于访问本地⽂件系统
-
用法
- 代码示例
<?php include $_GET['file']; ?>
- 读取/执行文件:file://[绝对路径文件/相对路径文件/远程文件]
- 代码示例
-
-
php:// 协议
-
条件
- allow_url_fopen:无影响
- allow_url_include:仅 php://input,php://stdin,php://memory,php://temp需要为on
-
作用:访问各个输⼊/输出流,一般php://filter ⽤于读取源码, php://input ⽤于执⾏php代码
-
php://input
- 代码示例:同file协议
- 执行php代码
-
php://filter
- 参数()
-
可用过滤器列表:PHP: 可用过滤器列表 - Manual
- 代码示例:同file协议
- 读取文件源码
?file=php://filter/read=convert.base64-encode/r esource=./password.txt
- 参数()
-
-
zip:// & bzip2:// & zlib:// 协议
-
条件:不受 allow_url_fopen 与 allow_url_include 的影响
-
作⽤: zip:// & bzip2:// & zlib:// 均属于压缩流,可以访问压缩⽂件中的⼦⽂件,更重
要的是不需要指定后缀名,可修改为任意后缀: jpg png gif xxx 等等 -
zip://[压缩⽂件路径]%23[压缩⽂件内的⼦⽂件名] (#编码为%23)
- 在C盘根目录创建phpinfo.php文件,压缩为phpinfo.zip
<?phpphpinfo(); ?>
- 执行文件
- 在C盘根目录创建phpinfo.php文件,压缩为phpinfo.zip
-
其他协议用法
- compress.bzip2://file.bz2
- compress.zlib://file.gz
-
-
data:// 协议
-
条件:allow_url_fopen :on,allow_url_include :on
-
作⽤:⾃ PHP>=5.2.0 起,可以使⽤ data:// 数据流封装器,以传递相应格式的数据。通常可以⽤来执⾏PHP代码
-
用法
- data://text/plain,
?file=data://text/plain,<?php phpinfo();?>
- data://text/plain;base64,
?file=data://text/plain;base64,PD9waHAgcGhwaW5m bygpOz8%2b
- data://text/plain,
-
-
http:// & https:// 协议
-
条件:allow_url_fopen :on,allow_url_include :on
-
作⽤:常规 URL 形式,允许通过 HTTP 1.0 的 GET⽅法,以只读访问⽂件或资源。CTF中通常⽤于远程包含
-
示例
-
-
phar:// 协议
-
phar:// 协议与 zip:// 类似,同样可以访问zip格式压缩包内容
-
示例
?file=phar://C:/phpinfo.zip/phpinfo.php
-
四、搭建并部署微商城系统并结合课件审计复习文件上传漏洞
-
环境搭建
-
获取源码并解压
通过网盘分享的文件:mall.zip 链接: https://pan.baidu.com/s/1YF3JUYh3fVuYYMLN_Wk4hw 提取码: 2025
-
在phpStudy中配置站点
-
创建数据库mall并导⼊数据库⽂件(mysql_data_E7VvC.sql)到数据库
-
修改数据库链接⽂件:/Mao/common.php
-
访问站点
- 前台:maill.com
- 后台:mall.com/Mao_admin(账号:admin,密码:qymao.cn_q54)
-
-
审计文件上传漏洞
-
使用fortify扫描代码,有一处文件上传漏洞(api/api.php,302行)
-
相关代码截图
-
漏洞分析:验证了文件类型和文件大小,验证文件类型不严格,可被绕过
-
漏洞利用
- 创建文件上传html代码(表单参数值根据代码设置)
<!DOCTYPE html> <html> <head><title>简单文件上传</title> </head> <body><form action="http://mall.com/api/api.php?mod=upload&type=1" method="post" enctype="multipart/form-data"><input type="file" name="file"><button type="submit" name="submit">上传</button></form> </body> </html>
- 创建phpinfo文件,后缀改为gif
- 通过burp抓包,修改文件后缀为php,上传成功
- 访问文件,成功
- 创建文件上传html代码(表单参数值根据代码设置)
-