• 代码审计-3 文件包含漏洞


    代码审计-文件包含漏洞

    在这里插入图片描述
    在这里插入图片描述

    文件包含漏洞种类

    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

    当检测到目标存在文件包含漏洞时可以怎么利用

    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

    文件包含中php可使用的协议

    在这里插入图片描述在这里插入图片描述

    PHPCMS V9.6.3后台文件包含漏洞

    后台路由分析

    访问后台登录页面
    在这里插入图片描述
    从url可猜测出来大致的路由 m为模块,c为控制器,a为方法,pc_hash为参数
    使用admin模块中的index控制器中的login方法在这里插入图片描述

    漏洞寻找

    当我们拿到源码后,可通过seay对文件包含的关键函数进行大致的正则搜索

    在这里插入图片描述
    此处为此CMS包含漏洞产生的php文件

    在这里插入图片描述打开文件查看,此处对$filepath这个变量内容进行了包含
    在这里插入图片描述通过分析$filepath的由来我们可以知道,$filepath变量存放的是一个文件的路径
    并且在下面还通过file_put_contens函数来将$str中的内容写入到了这个文件中
    然后进行include包含此文件

    因为会把$str变量中的内容写到这个文件中,所以如果我们能控制$str变量中的内容就能把恶意代码写到此文件中,最后include还会来包含这个文件
    在这里插入图片描述
    接下来关注点就在$str变量上了,让我们看一下$str变量是怎么来的
    通过代码可以看到,$str变量是由$template变量经过两个函数处理后得到的

    在这里插入图片描述
    继续跟踪下$template变量的由来

    如果 isset($_POST['template']) && trim($_POST['template'])为真就将POST传入的参数名为template的值赋给变量$template,如果为假就赋值为空

    isset():检测变量是否为NULL
    trim():去除字符串两的空格
    
    • 1
    • 2

    在这里插入图片描述

    可以看到此处只是接收了POST方式传递的值赋给了$template

    让我们看一下上面的两个函数new_stripslashestemplate_parse$template做了什么操作才赋值给的$str

    new_stropslashes函数

    此函数中调用了stripslashes函数来去除反斜杠
    如果传入的参数是字符串就直接将addslashes()函数添加反斜杠去除并返回
    如果传入的是数组就循环递归将数组中的字符串中的反斜杠去除并返回
    在这里插入图片描述
    template_parse函数

    此函数主要对模板{}中的内容进行替换,也不会影响恶意代码的写入
    在这里插入图片描述

    经过分析,这两个函数都没有对我们需要写入的恶意代码造成威胁
    现在我们则需要知道怎样才能将恶意代码写入到$template变量中

    此处可以看到
    &data['type']==1时直接返回错误提示
    &data['type']==2时才会向下执行,将我们POST[‘template’]传入的值赋给$template,再将$template的值赋给$str,再将$str的内容写入到$filepath变量所存放的路径对应的php文件中,并包含

    在这里插入图片描述
    跟踪一下&data['type']==2的由来
    发现$data中的数据是根据$id这个变量通过get_one()来查询数据库得到的,get_one()的参数是一个数组,键为'id',值为我们传入的$id

    也就是说GET['id']传进来的值赋给$id,然后执行get_one()函数get_one()的参数为一个数组,键为字符串'id',值为变量$id

    在这里插入图片描述
    继续跟踪get_one()函数查看
    此函数执行的是一个sql语句的查询操作
    因为我们想让$data['type']的值等于2,就需要寻找添加的操作也就是找此处的$data['type']是从哪里添加的
    在这里插入图片描述
    此函数为添加的函数
    此处对数据库进行添加操作的sql语句中的参数都是可以用户传入的
    只要根据上面的内容对参数url进行构造让type的值传入为2就可以了

    在这里插入图片描述
    url进行构造

    index.php路由到modules目录m选择block模块c选择block_admin控制器a选择add方法posGET方式提交的参数

    dosubmit=1&name=test&type=2POST方式提交的必要参数

    dosubmit=1因为ifPOST传递的dosubmit的值做了判断,如果不存在就不会向下执行
    POST方式传递的nametype都是下面必要的参数,存在时才会进行赋值给对应的$name$type变量

    在这里插入图片描述
    访问该地址

    在这里插入图片描述
    cms是通过pc_hash的值来判断是否登录,登录后重新访问该地址在url后加上pc_hash的值

    在这里插入图片描述POST提交之前构造好的参数,此时页面显示操作成功

    在这里插入图片描述
    此时跳转到该页面,上面添加操作的sql语句也成功执行

    在这里插入图片描述

    在这里插入图片描述

    此页面对应的函数位置
    需要的参数有GET传的id,通过对id进行查询返回结果为数组赋值给$data
    此时返回的内容就是我们之前进行添加的,所以$data['type']2,继续向下执行

    在这里插入图片描述
    这里需要POST参数

    在这里插入图片描述
    所以我们在页面处通过POST将需要的参数传入
    函数上面的POST可以不用传,当没有值时就将空赋值给变量了,并不会阻断程序执行不产生影响
    下面的POST['template']就是对应的碎片模块的输入框,点击预览进行提交
    在这里插入图片描述
    写入恶意代码点击预览后$template变量接收到POST传递的值,再将值赋给$str变量
    file_put_content函数将$str中的恶意代码写入到$filepath变量中存放的文件路径对应的文件中
    最后include$filepath变量中存放的文件路径对应的文件进行包含,导致恶意代码执行

    在这里插入图片描述新建test_shell.php成功
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    想要精通算法和SQL的成长之路 - 环形子数组的最大和
    语音分离---学习笔记(1)
    Huggingface transformers 镜像使用,本地使用,tokenizer参数介绍
    【Linux】常用系统工作命令
    湖南智能家居VR虚拟数字展厅提高了销售效率和利润
    ThreadLocal你真的用不上吗?
    概率论的学习和整理10:0-1分支 和 二项分布
    【Python脚本进阶】2.5、编写自己的0day概念验证代码(终)
    java毕业设计车险销售管理系统mybatis+源码+调试部署+系统+数据库+lw
    WCET学习(六)
  • 原文地址:https://blog.csdn.net/xhscxj/article/details/128123904