19-php审计工具&常见php站点搭建、审计

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

  • 安装fortify

    第一步:安装exe文件

    image-20250216162928339

    安装完成

    image-20250216163224110

    第二步:复制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

    第三步:更新规则

    解压FortifyRules_zh_CH_2023.1.1.0001(离线规则库).zip 规则库
    先删除C:\..\Fortify\Fortify_SCA_23.1.0\Core\config目录下的ExternalMetadata和rules文件夹,然后把解压的ExternalMetadata和rules文件夹拷贝到该目录下。

    第四步:运行

    C:\..\Fortify\Fortify_Apps_and_Tools_23.1.0\bin 下的auditworkbench.cmd 即可开启GUI界面,可以通过鼠标右键将该文件的快捷方式发送到桌面;
    也可以在【开始】> 【Fortify_Apps_and_Tools_23.1.0】里点击Audit workench开启
    image-20250216164658162

    安装完成

    image-20250216165221443

  • 扫描pikachu靶场

    image-20250216175453256

2、安装并使用rips、seay工具对pikachu进行审计

  • rips

    • 安装rips:下载rips源码文件https://sourceforge.net/projects/rips-scanner/files/,将文件放入web目录下,创建网站。

      image-20250217085854817

    • 使用:

      subdirs:扫描所有子目录。

      verbosity level:选择扫描结果的详细程度,缺省为1(建议就使用1)。

      vuln type:选择需要扫描的漏洞类型。⽀持命令注入、代码执行、SQL注⼊等⼗余种漏洞类型,缺

      省为全部扫描。

      code style:选择扫描结果的显示风格。

      /regex/:使用正则表达式过滤结果。

    • 扫描pikachu源码对应的路径,生成扫描结果如下:

      image-20250217090817143

  • seay

    • 安装完成后。点击新建项目,打开pikachu源码

      image-20250217093809578

      点击【自动审计】> 【开始】,软件开始运行分析整个项目

      image-20250217094019203

      查看扫描结果

      image-20250217094328078

3、复习php代码审计函数精讲相关内容,重点是SESSION验证绕过、urldecode二次编码绕过、str_replace绕过

  • 变量覆盖extract( )函数

    extract( ) 函数会自动解析所有参数,并按照对应 key=value 的方式进行赋值,因此,当我们输入代码中预定义好的变量名时,变量的值会被覆盖。

  • intval特性绕过

    intval( ) 函数可以获取变量的「整数值」。常用于强制类型转换。

  • 多重加密

    如:拿到token,需要经过base64解码->字符串解压缩->反序列化,如果知道最终结果,那么只需逆过程序列化->字符串压缩->base64加密,便可以解出token值。

  • SQL注入WITH ROLLUP绕过

    SQL注入中的WITH ROLLUP绕过是一种利用分组聚合函数特性绕过查询结果限制的攻击手法。

  • ereg正则%00截断

    ereg正则%00截断是PHP中一种利用空字符截断绕过正则匹配的安全漏洞,常见于旧版本PHP环境(ereg函数在PHP 5.3弃用,7.0移除)

  • sha()函数比较绕过

    sha()函数比较绕过是利用哈希值的类型转换漏洞和魔法哈希(Magic Hash)特性,绕过身份验证的攻击手段。

  • 密码md5比较绕过

    md5比较绕过是利用PHP弱类型在松散比较(==)时的类型转换漏洞,通过构造特定哈希值绕过身份验证的手法。

  • SESSION验证绕过

    <?php
    $flag = "123456"; // 服务器返回的 flag
    session_start();  // 开启 session
    
    // 检查用户是否提交了 password 参数
    if (isset($_GET['password'])) {
        if ($_GET['password'] == $_SESSION['password']) {
            die ('Flag: '.$flag); // 如果匹配,返回 flag
        } else {
            print '<p>Wrong guess.</p>';
        }
    }
    
    // 生成一个随机的 session 密码
    $_SESSION['password'] = mt_rand(1000, 9999);
    

    审计 if ($_GET['password'] == $_SESSION['password']) 这行代码发现,只需要session中的password值和用户传的一样,就可以成功拿到flag。
    又由于session值是依赖Cookie来传递Session ID,如果我们删除 Cookie 的 PHPSESSID,服务器就无法找到对应的 Session 文件,导致 $_SESSION['password'] 为空,这时我们同样传入空的password就能绕过了。因此payload为http://localhost//TEST/seession.php?password=

    image-20250217115858125

  • urldecode二次编码绕过

    <?php
    // 简单的关键字hack过滤
     if(strpos($_GET['id'],"hack") !== false) {
     echo("<p>not allowed!</p>");
     exit();
     }
     $_GET["id"] = urldecode($_GET["id"]);
     if($_GET["id"] == "hack")
     {
     echo "<p>Access granted!</p>";
     echo "<p>flag: This is hack flag!!!} </p>";
     }
    ?>
    

    审计if(strpos($_GET['id'],"hack") !== false)代码发现会对hack关键字进行过滤,想要拿到flag就需要绕过第一次过滤,由于浏览器会进行一次url解码,审计代码$_GET["id"] = urldecode($_GET["id"]);发现也会url解码,自此造成二次编码,可以实现绕过。

    方法:将hack的第一字母h经过两次url编码,第一次:%68,第二次:%25%68,构造payloadhttp://localhost//TEST/urldecode.php?id=%2568ack。当传入参数%25%68ack时,经过第一次解码变为%68ack绕过第一次strpos函数的过滤,第二次解码变为hack,验证成功拿到flag。

    image-20250217130826665

  • str_replace绕过

    经常出现在字符过滤等功能逻辑中,由于仅仅过滤⼀次,因此容易被绕过。如:..././filename > ../filename实现绕过

4、搭建并部署微商城系统并结合课件审计复习sql注入漏洞、文件上传漏洞

  • 环境搭建:

    1. 源码放入web目录下,搭建站点(PHP版本:5.3.29)

    2. 创建数据库mall,右击【mall数据库】> 【输入】选择文件类型,导入对应数据文件到数据库(注意:创建数据库时选择utf8_unicode_ci,以免出现后续导入失败,数据乱码的情况;导入数据文件时,在字符集下拉框选择UTF-8方式导入)

      image-20250217154149790

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

      image-20250217155132065

    4. 实现访问(其中后台IP:mall.com/Mao_admin)

      image-20250217155447160

  • sql注入漏洞

    • api\data.php文件代码中,直接使用户提交的search参数并拼接到了sql语句中,造成sql注入漏洞。

      image-20250218094111049

      同理goods.php文件中的id参数存在sql注入漏洞

      image-20250218094358770

      总结:均是未对用户输入的参数进行过滤处理,直接拿来拼接到sql语句中

  • 文件上传漏洞

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

    image-20250218094917180

5、搭建bluecms并分析sql宽字节注入漏洞原理

  • 搭建bluecms

    环境:BlueCMS v1.6 + Phpstudy pro(php5.3.29)

    • 用小皮创建名为bluecms的站点(源码放入网站根目录下)

      image-20250218105437186

    • 安装:访问http://bluecms/install/,根据导航一步步安装即可,但是最后⼀步会出现空白页面 ,找到install/index.php文件,注释文件下step5中的incude代码,即可解决。

      image-20250218105843417

      安装完成

      image-20250218105938205

  • bluecms宽字节注入漏洞

    1. 代码审计

      首先来到登录界面 admin/login.php包含了如下文件/include/common.inc.php跟进。

      image-20250218121807109

      common.inc.php中又包含了mysql.class.php文件,接着实例化了一个mysql对象为$db

      image-20250218124247052

      继续跟进mysql.class.php文件,并找到实例化对象的所在mysql类。实例化这个mysql类的对象会自动调用构造函数,构造函数接收了数据库的连接信息参数后传入connect()函数,发现了使用gbk编码即可能存在宽字节注入。

      image-20250218124648181

      在执行登录查询验证的时候,先进行了数据库连接,而数据库连接中设置了GBK编码

      image-20250218131252926

    2. 测试

      输入admin'的时候,发现会在单引号的前面加上\,变成了admin\即存在宽字节注入

      image-20250218132714092

      这时我们只需利用宽字节注入,便可以进入后台

      当输入值有%df'时,后台过滤会在单引号前加\进行转义,但又因为数据库读取时用的GBK编码,会把\即%5c与%df合成汉字从而实现单引号的逃逸,使得过滤失效,sql注入成功。

      image-20250218134536099

posted @ 2025-02-18 14:06  荔枝在敲诈  阅读(156)  评论(0)    收藏  举报