PHP代码审计之百家CMS4.1

优采云 发布时间: 2022-06-19 13:20

  PHP代码审计之百家CMS4.1

  本篇着重从代码审计方向出发

  进行漏洞挖掘

  三、PHP前置知识

  PHP是一种弱类型语言,相对于Java来说它没有对数据类型进行严格的定义。所以入门代码审计的PHP是一个不错的选择。

  预定义变量:

  用于收集来自 method="XXX" 的表单中的值,也就是说我们的参数是经过这些系统变量来传递到后端的,这些函数是传参的入口。

  $_GET   <br />$_POST <br />$_REQUEST<br />$_FILES

  函数:

  用来实现某种功能的一段代码且函数被调用才可执行,如果一个函数中存在危险函数,且危险函数可被利用,但函数是没有被调用,那这个利用点还是利用不了的。

  例子

  危险函数:

  本次只列出本系统需要用到的危险函数,随着课程的深入以后会介绍与项目中用到的危险函数供大家学习。

  include()        //文件包含,被包含的文件会被当做PHP代码执行<br />system()         //执行系统命令 <br />file_get_contents()   //把整个文件读入一个字符串中。<br />file_put_contents()   //把一个字符串写入文件中<br />unlink()           //用来删除文件

  函数的详细介绍可以访问如下链接:

  https://www.runoob.com/php/

  四、百家CMS代码审计路由分析

  通过渗透测试观察目录结构,发现该系统的所有功能点放在system目录下,而每个功能点都对应两个文件夹calss、template,class下存放的是每个功能的后端代码,template下是前端代码。由于是商城系统,该系统分为网页端和手机端,所以class、template目录下分别放有mobile手机端代码、web网页端代码。

  

  1.XSS

  这里act代表system文件夹下某个功能点,do代表功能点下的具体PHP文件,而op则代表在该文件中走哪个分支。以此类推下面的路由构成方式与该处相同

  通过上面路由可以很快找到对应的PHP代码,在post分支中发现sname,website通过前端传入。

  在展示页面,我们发现在最下面包含了store_display.php,而store_display.php文件中发现该处参数通过页面渲染在前端通过echo进行输出,从而造成XSS。

  

  

  2.SQL注入

  通过渗透测试中路由找到store.php文件,$_GP['sname']接收我们输入的payload并且直接拼接到SQL语句中,造成SQL注入。

  

  3.任意文件夹删除

  通过渗透测试中路由找到database.php文件,通过前端传递过来的id参数与$path进行拼接后,使用is_dir()判断是否为目录,是目录的话进入redirs()进行删除操作。这里就解释了为什么只能删除文件了

  

  redirs()中判断我们传过来的参数是否是目录是目录就遍历出文件进行删除,不是就直接删除该文件。全程没有任何过滤,所以造成任意文件删除。

  

  4.任意文件删除二

  全局搜索unlink(函数,发现common.inc.php中的file_delete()函数可以被利用

  

  全局搜索file_delete()函数,观察哪里调用了它而且参数可被利用,最终找到uploader.php,这里的file参数是从前端传入且可被利用

  

  我们跟进file_delete()函数中,想要进入unlink(),就必须要$settings['system_isnetattach']不为空,

  

  

  全局搜索system_isnetattach发现该参数是从netattach.php中接收的,我们通过上面的路由分析也可以轻松构造出该路由,也可通过该文件的中文提示找到该功能点。

  

  对应的功能点就是附件设置,system_isnetattach就是设置图片压缩比例,这里只要随意设置不为空就可以了。

  由于此处文件删除是需要手动创建对应的前端页面,为了方便我们通过访问路由来实现文件删除。

  在根目录下建一个demo.txt,构造url访问

  

  http://www.baijia.com:8011/baijiacms/index.php?mod=mobile&act=uploader&op=post&do=util&m=eshop&op=remove&file=../demo.txt<br />

  5.任意文件写入

  通过渗透测试中路由我们定位到漏洞点file.php文件,获取前端传入的url,将url的值传入到fetch_net_file_upload()中。

  

  跟进fetch_net_file_upload()函数,file_get_contents()读取文件内容后,紧接着使用file_put_contents()将文件内容写入到$file_tmp_name文件中,并且后缀是从读取的文件截取到的,所以就造成了任意远程文件上传。

  

  6.命令执行

  通过渗透测试中路由我们定位到漏洞点setting.php,$file['name']是从$_FILES中传入

  

  也就是我们这里上传处的文件名

  

  setting.php中,首先判断文件名为txt后就要进入到file_save(),并且$file['name']作为它的参数传入,如下图

  

  跟进file_save()函数,该函数中传递过来五个参数

  

  在下面的system()函数中,将$file_full_path参数拼接进来而该参数正是我们前端传递的$file['name']值,所以通过&分割,就造成了命令执行。

  

  初学代码审计我推荐大家配合工具进行审计,因为工具可以帮助大家在前期更好的定位漏洞点,以及帮助大家熟悉一些PHP中的敏感函数。

  1)Seay

  2)Fortify

  五、总结

  由于本次公开课给大家讲解的是如何在实战中进行代码审计的一些思路以及具体的实战过程,所以有些漏洞是通过注释全局过滤函数造成,以便大家学习。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线