• 代码审计—PHP


    工具🔧

    seay源代码审计系统

    phpstudy——搭建环境

    前言

    🌸//原文:

    【小迪安全】Day50代码审计-PHP无框架项目SQL注入挖掘 - 哔哩哔哩点击进入查看全文>https://www.bilibili.com/read/cv14964585

    【小迪安全】Day51代码审计-PHP框架MVC类上传断点调试 - 哔哩哔哩点击进入查看全文https://www.bilibili.com/read/cv15042607?spm_id_from=333.999.0.0【小迪安全】Day52代码审计-PHP项目类RCE及文件包含下载删除 - 哔哩哔哩点击进入查看全文>https://www.bilibili.com/read/cv15169189?spm_id_from=333.999.0.0

    0x00 相关原理分析要求

    1.教学计划:

    ---审计项目漏洞 Demo->审计思路->完整源码框架->验证并利用漏洞

    2.教学内容:

    ---PHP,JAVA 网站应用,引入框架类开发源码,相关审计工具及插件使用

    3.必备知识点:

    ---环境安装搭建使用,相关工具插件安装使用,掌握前期各种漏洞原理及利用

    4.开始前准备:

    ---审计目标的程序名,版本,当前环境(系统,中间件,脚本语言等信息),各种插件等

    5.挖掘漏洞根本:

    ---可控变量及特定函数,不存在过滤或过滤不严谨存在绕过导致的安全漏洞

    🌟🌟6、定点挖掘关键词

    ---可控变量

            变量接受get post 接受关键字$_GET

    ---特定函数

            输出print

            数据库操作

    ---特定关键字

            select insert update sql执行语句==sql 注入漏洞

    ---搜索特定关键字尝试寻找特定漏洞

            如:echo print         xss漏洞

            如:$_GET $_POST         安全漏洞

    🌟🌟7、定点挖掘功能点:

    🌹如:我要挖掘文件上传,会员中心存在文件上传操作,抓包分析源码中特定文件上传代码段,进行分析。

    🌟🌟8、拓展: 视漏洞而定

    🌹sql注入        数据库监控-监控到当前页面和数据库的交互过程(sql执行语句)

    🌹断点调试        访问页面对应代码进行断点调试(执行过程先后顺序,调用文件列表等)

        

    0x01 sql注入漏洞点判断(php无框架)

    1、分析:

    (1)查找关键词如select,掠过定量处,分析存在变量的代码处;回溯调用函数,注意有传参的位置,是否有过滤,是否有预编译,以及通过查看代码反馈信息的方式来具体判断存在哪一种注释。

    (2)看过滤机制。一般过滤机制在类似incloud等配置文件中(一般是全局性的,可以看看大部分代码中都共同引用了什么配置文件)

    ps:二次注入(解决转义的过滤)与宽子节注入(核心:传一个字符将反斜杠吃掉成为汉字)可绕过php魔术引导机制(magic_quotes_gpc),原理如下:

     SQL注入篇学习之盲注/宽字节注入_其他数据库_萬仟网

    2、研判:

    (1)是否存在预编译(防御sql注入最好的办法,就是使用预编译,绑定变量);

    (2)是否使用安全的存储过程(效果和预编译相似,区别是存储过程需先将sql语句定义在数据库中,但仍然需尽量避免使用动态sql语句,如无法避免,应严格过滤);

    (3)是否检查数据类型,严格限制数据格式;

    (4)是否使用足够安全的编码函数;

    🌟 🌟 如不满足以上四种中任何一种,可判断为存在sql注入。

    3、防御:

    (1)正确使用参数化api进行sql查询(推荐)

    (2)如需求是提交非字符串,可进行数据类型校验,如:用户输入整数还是浮点数时进行数据类型验证,输入邮箱则严格按照邮箱格式等类似白名单的输入检查方式。

    (3)使用安全函数

    ###ps:不推荐黑名单,黑名单防御方式易被绕过,防不胜防。

    4、案例分析思路

    (1)74CMS 人才招聘系统挖掘-2 次注入应用功能(自带转义) 🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸

    🌹分析源代码发现有自带过滤机制(common.php文件);

    🌹过滤机制是魔术引导;

    🌹联想到二次注入和宽子节注入绕过;

    🌹分析了二次注入的原理之后选取网站同时存在insert、update且变量可控的功能点;

    🌹对二次注入功能点抓包分析;

    🌹使用seay代码审计系统——审计插件——mysql监控——输入用户名和密码——点击下断、更新(为了直观的看到存在二次注入的功能点);

    🌹在页面中可能存在二次注入功能点(insert+updata+变量可控,取出首次提交的数值后,更新时又将数值带入数据库中)的地方点击按钮,进行查看;

     🌹如果可以找到满足二次注入的功能点,进行验证。

    (2)苹果 CMS 影视建站系统挖掘-数据库监控追踪(自带过滤) 🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸

    🌹根据url的index.php?m=vod-search进行代码审计

    🌹对m参数进行一系列分析后定位到过滤文件module中的vod.php

    🌹追踪到chksql,又定位到过滤函数stopattack,进一步定位到过滤关键字的语句getfilter,然后进行全局搜索,发现过滤的关键字

    //总结:搜索框追踪到sql语句,sql语句追踪到特定文件vod.php,特定文件里追踪到调用函数chksql,chksql进行右键函数定位追踪到该函数模块,该函数模块又涉及到stopattack,再次右键定位函数发现匹配关键字的函数模块,关键字又是从哪来的?是刚刚stopattack函数模块中调用的getfilter参数,对getfilter参数右键定位,即查询到过滤关键字的语句。

    ❤️tips1:管他丫的,就是找就对了,各种溯源

    ❤️tips2:双重编码可对此处过滤进行绕过。

    0x02 php框架mvc类上传断点调试(文件上传

    1、mvc框架简介

    php MVC框架实例教程 - 临点 - 博客园

    MVC的全名是Model View Controller,是一种使用模型-视图-控制器设计和创建web应用程序的模式,是一种设计典范。

    其中:

        Model(模型):是应用程序中用于处理应用程序数据逻辑的部分,通常负责与数据库直接进行 curd 的交互。

        View(视图):是应用程序处理数据显示的部分,通过将处理好的数据进行渲染。

        Controller(控制器):是应用程序中处理用户交互的部分,通常用于处理数据逻辑的分发,并相应的反送给视图和控制器。

    2、总体思路

    (1)关键词搜索(函数,键字,全局变量等)

    文件上传:$_FILES,move_uploaded_files等

    文件上传的关键字:在写上传的时候会有注释,如//上传

    (2)应用功能处抓包(任何可能存在文件上传的功能点),对此处代码进行分析。

    1. 全局数组$_ _FILES
    2. $_ FILES['myFile']['name'] 显示客户端文件的原名称。
    3. $_ FILES['myFile' ]['type']文件的MIIME类型,例如"image/gif"
    4. $_ FILES['myFile']['size']已 上传文件的大小,单位为字节。
    5. $_ _FILES['myFile' ]['tmp_ _name'] 储存的临时文件名,一 般是系统默认。
    6. $_ FILES['myFile']['error'] 该文件上传相关的错误代码。以下为不同代码代表的意思:
    7. 0;文件上传成功。
    8. 1;超过了文件大小php.ini中即系统设定的大小。
    9. 2;超过了文件大小MAX_ _FILE_ _SIZE 选项指定的值。
    10. 3;文件只有部分被上传。
    11. 4;没有文件被上传。
    12. 5;上传文件大小为0
    1. 相关函数
    2. move uploaded file(file, newloc)函数将上传的文件移动到新位置。
    3. strtolower()函数把字符串转换为小写。
    4. trim()函数移除字符串两侧的空白字符或其他预定义字符。
    5. strrchr()函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
    6. str ireplace() 函数替换字符串中的一些字符(不区分大小写)
    7. getimagesize()函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回FALSE并产生一条E_ WARNING级的错误信息。
    8. exif jimagetype()读取一个图像的第一个字节并 检查其签名。
    9. substr()函数返回字符串的一部分。
    10. fopen()函数打开文件或者URL。
    11. fread()函数读取文件(可安全用于二进制文件)
    12. fwrite()函数写入文件(可安全用于二进制文件)

    3、文件上传代码审计研判

    (1)文件可上传
    (2)知道文件上传路径
    (3)上传文件可以被访问
    (4)上传文件可以被执行

    4、防御方案及缺点

    (1)黑白名单

    容易被绕过,所以基本被白名单验证所淘汰。不推荐黑名单,因为大部分都不全,总有奇奇怪怪的绕过姿势。

    (2)文件头验证

     进行验证,在1.gif文件中,我们写入文件头GIF89a,文件内容随便写,我们发现这个文件被判断为GIF文件,返回了尺寸数组。

    (3)content-type验证

    content-type位于request请求里,是我们抓包后可以自行修改的内容。

    (4)上传文件重命名

    将用户上传的文件重命名是一种安全程度较高的防御方式,我们一般采用hash(文件名+时间戳+salt随机数)的方式对文件重命名。入侵者在不清楚自己的木马命名的时候就很难连接进行攻击了。

    5、案例分析思路

    (1)Beescms 无框架后台任意文件上传🌸🌸🌸🌸🌸🌸🌸

    ---进入首页——后端
    ---在源代码中搜索关键字:上传,搜索函数$_FILES(直接搜索没有,把$去掉,灵活变通)
    ---点击其中一个查看(这里是一个文件上传的处理过程)
    ---浏览器访问该文件
    ---上传一个doc文件抓包分析看传递的参数
    ---传递的参数:文件说明:file_info和uppic,传递的表单名为up


    ---在源代码里面查找这两个参数,出现文件上传的代码段。

           (tips:

            ❤️ 如果uppic的参数存在,就传递表单名up;

          ❤️ fl_html里面将传递的字符串利用htmlspecialchars将特殊字符转换为 HTML 实体;

             ❤️explode 使用一个字符串分割另一个字符串,这里将$_type_file以|分割,前面有有一个$_type_file函数,将允许的文件格式以|分割);

             ❤️$_sys文件是一个数组,包含上传文件的大小,和文件类型;
            ❤️ is_uploaded_file()函数检查指定的文件是否是通过 HTTP POST 上传的。如果文件是通过 HTTP POST 上传的返回 TRUE,可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件;

            ❤️ $_FILES['up']['tmp_name']是is_uploaded_file()要检查的文件,up是要上传的表单名,tmp_name变量中的值就是文件在Web服务器中临时存储的位置(上传文件的临时保存文件)。)

    ---确定文件的大小限度(这里是系统设置的值);

    --- up_file处理上传的文件,并且验证是否符合上传标准;

    ---根据up_file返回值(返回的字典形式)确定文件的路径、扩展名、大小、时间;

    ---最后在进行数据库的插入操作;


    ---定位函数up_file(进行相关的验证);

    ---传递了三个参数:表单名,文件大小,文件类型;

    ---确定文件的大小不超过系统设置的文件大小;

    ---pathinfo() 函数以数组的形式返回关于上传的文件路径信息,如/testweb/test.txt,生成数组:[dirname] => /testweb;[basename] => test.txt;[extension] => txt;[filename] => test;


    ---查看上传的文件的后缀名是不是在系统规定的后缀里面;

    ---判断path=’’的话,就上传到upload/file/路径下(如果path没传参的话默认为空,有参数的话就是参数值);

    ---file_exists检查文件或者目录是否存在,不存在就创建目录;

    ---再根据时间戳生成文件名;


    ---这里的关键就是绕过pathinfo函数,让php文件的格式的能够最后检测;

    ---尝试绕过均不成功,无法上传。

  • 相关阅读:
    STL1(C++标准模板库)
    【NodeJs-5天学习】第三天实战篇④ ——QQ机器人,实现自动回复、重要提醒
    毕业设计python选题高校研究生管理系统java选题版本源码 调试 开题 lw
    PMP每日一练 | 考试不迷路-11.10(包含敏捷+多选)
    JDK版本和Gradle版本配套关系
    SpringBoot整合Spring Boot Admin监控
    如何在Java中做基准测试?JMH使用初体验
    SPA项目开发之首页导航+左侧菜单
    Day31——二叉树专题
    攻不下dfs不参加比赛(九)
  • 原文地址:https://blog.csdn.net/haoaaao/article/details/126106101