代码审计-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():去除字符串两的空格

在这里插入图片描述

可以看到此处只是接收了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成功
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值