首发于 代码审计
代码审计-phpcms

代码审计-phpcms

一位苦于信息安全的萌新小白帽
本实验仅用于信息防御教学,切勿用于它用途
公众号:XG小刚

phpcms

最近在学习php代码审计,各种复现、各种测试搞得我头昏脑胀。网上很多代码审计的复现博客看似讲的很清楚,最后自己也复现出来了,但是很多小白(比如我)以为懂了这个漏洞,但实际连参数都不知道怎么传进去的。

跟着反向追踪传参过程是很快速高效,但遇到那种框架写的cms就懵逼了,找不到被利用的点,找不到为啥会被传进参数来。。。

所以,该来的还是要来的,正向通读代码。

(代码审计当然要提前搭建一个简单好用的环境、还要有个趁手的编辑器)

低版本phpcms

phpcms虽然已经停止维护了,但不妨碍我们拿来学习审计,小白最好还是找个简单、低版本的开始审计。

通读代码

目录结构

打开代码,首先观察目录结构

可以看到,根目录下有四个php文件(称之为入口文件),admin.php、api.php、index.php、plugin.php,四个文件什么功能一目了然啊。

然后是好几个文件夹

api下存放api接口文件
caches下存放缓存、备份文件等等,
html下是空的暂时不提
phpcms下存放大部分的模块、模板、插件等等,
phpsso_server是一个安装过程选择的功能,暂时不管,
static下存放各种css,js静态文件
uploadfile顾名思义存放上传的文件。

网站入口

正常来说inde.php就是整个网站的入口,直接看index.php做了什么

先定义了一个常量,(在审计过程中,会遇到很多常量,我们可以使用getdefinedconstant函数将所有常量打印出来,然后用哪个查哪个)

13行包含了/pnpcms/base.php文件,那过去看看

可以看到这是框架的入口,定义了许多常量,然后29-33行加载了两个函数库和一个配置文件system,使用了自动加载函数autoloadfunc()

先不看加载了什么函数库,先去看看怎么加载的

在62行往后,定义了pc_base类,然后通读一下这个类的各种函数

返回头看上面加载的几个函数库

加载global使用的pcbase类的loadsys_func函数,找到函数定义位置,global传参到$func

141行,这个函数引用了自身类的loadfunc函数,global传参到$func

阅读函数,可以了解到212行构造了路径$path=libs\functions\global.func.php

215行判断文件是否存在,并包含该文件。

发现是加载了公共函数库,里面基本是cms所用到各种公共函数,通读一下,看看各种过滤函数,然后特别注意各种可以用的函数。

同样看看extention.func.php,结果是自定义函数库没东西

查看自动加载函数

找到autoloadfunc()定义位置,

149行使用了autoload_func

阅读发现自动包含libs\functions\autoload\下的所有.func.php文件,找到文件通读代码。

跳回index.php

阅读完加载的函数库后,发现一个问题,网站咋加载呢。

大意了啊,回到index.php,发现使用了creat_app()函数

再次回去,看看是怎么加载网站的,使用了loadsysclass函数传入参数application

77行使用了loadclass函数

经几个逻辑判断,构造路径,然后包含了phpcms\libs\classes\application.class.php文件

在下面发现实例化了一个类$classes[$key] = new $name; $name传参是application

哪来的这个类,请看phpcms\libs\classes\application.class.php

参数传递

打开文件,定义了一个类appliaction

而且该类被上面函数实例化,直接触发了__construct()魔术方法

同样使用loadsysclass加载了param.class.php参数处理类文件,

并实例化param类,使用param类的三个函数

三个方法通过GET或者POST传入了三个参数m,c,a

m是模型,c是控制器,a是事件

传入的参数在application类中定义为三个常量,并使用init()进行初始化

阅读appliction类发现,该类通过m,c,a三个参数来加载整个网站的应用

m是加载phpcms\modules\目录下的模块,也就是文件夹

c是加载模块下的控制器,也就是php文件

a是控制器里面的事件,也就是php文件里面的函数

比如:想使用admin模块下database.php控制器的export()函数

传参:index.php?m=admin&c=database&a=export

知道了参数的传参方式,想反向找利用点就简单多了。

开始审计

知道了m,c,a参数的含义,phpcms\modules\下的函数就可以轻松利用了

端口探测

phpcms\modules\search\searchadmin.php文件内有个publictest_sphinx()函数

105行发现一个fsockopen()函数,用来打开一个网络连接或者一个Unix套接字连接 ,post传入的sphinxhost和sphinxport没有进行过滤

sphinxhost是ip地址、sphinxport是端口,这样我们可以通过这个函数进行内网端口探测

经测试,当内网端口存在时返回1

不存在时返回10060


后台Getshell

phpcms\modules\dbsource\data.php文件里有个add()函数

在82行有个fileputcontent()函数,将$str写入caches\caches_template\dbsource\$id.php文件当中

追踪$str来源,原来是查询了数据库的$id行template的值

往上看代码,62行发现template值可以post控制,其他的name,type,dis_type,cache,num都由上面post传入,

70行将内容插入了数据库当中。记住dis_type=3后面有用

既然参数都可控,那就post传入所需要的值,template传入一句话木马,使逻辑能跑到fileputcontents函数。

这里测试发现需要登录后台,那就算个后台getshell了,登录后台给了个pc_hash=saLcKR

结果发现没什么响应

不急,去caches\caches_template\dbsource\下发现多了个文件39.php,成功写入了一句话木马。

这里虽然成功写入了一句话,但发现前面有个限制

如果没定义IN_PHPCMS常量,就exit退出,说明不能直接访问,这不白传了吗。

但仔细思考,不能直接访问,那就说明这个文件是用来被包含的。

那就直接搜谁包含此文件,但这个文件名是动态生成的,所以我们得搜他所在的目录dbsource

发现全局函数库中有个template_url()函数构造了我们需要被引用的路径

逻辑就是传入id,判断文件是否存在,不存在就构建,存在就返回路径

返回的路径有了,那就看看这个函数被谁引用了

phpcms\modules\dbsource\call.php的_format函数中使用了此方法

$type为3时,65行进行文件包含。既然文件包含出来了,说明可以利用

继续看看_format函数被谁使用,由于是private定义,所以只能在此文件内搜索

然后在get()函数的39行发现使用的_format()函数

id是通过我们GET传参控制,$str与我们无关,关键是$data['dis_type']要等于3

$data哪来的呢,发现11行进行了sql查询,正是我们刚开始写一句话时候的传入的dis_type=3

那利用直接一目了然,只传参$id就可

起飞

SQL注入

其实在phpcms\modules\dbsource\data.php文件add()函数里

在第33行有个参数data,为自定义sql

在我们测试上面getshell过程中发现,如果data随便传入一个数据1233

进行包含一句话文件时候,会出现SQL语句报错,这意味着这里执行了SQL语句。

那漏洞来了,我们在data传入sql语句呢?先来个报错注入

发现依旧在caches\caches_template\dbsource\下生成了40.php

起飞

深圳SEO优化公司鹰潭网站改版多少钱河池外贸网站建设公司银川百度关键词包年推广那曲企业网站改版多少钱南阳网站排名优化价格邢台seo哪家好亳州网站定制多少钱南通百姓网标王鹰潭模板制作多少钱自贡网站搭建平顶山seo优化价格清徐外贸网站制作哪家好绥化SEO按天收费公司石岩关键词按天计费哪家好昆明如何制作网站哪家好贵阳百度seo多少钱大同模板网站建设公司塘坑百度网站优化排名多少钱大理建网站哪家好玉树网站优化按天扣费喀什百搜标王哪家好潍坊网站排名优化报价赣州关键词排名民治企业网站设计价格黔西南高端网站设计公司南充网站seo优化哪家好衡水阿里店铺托管哪家好十堰网站搜索优化哪家好惠州如何制作网站哪家好阳江网站搭建推荐歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化