程序下载地址:https://pan.baidu.com/s/1VdoPLqNP6V6aguodza9uQQ
马子文件下载地址:https://pan.baidu.com/s/1fwDQ7fdiqsv_Azr9Ii89mg提取码:dm8q
版本:V4.9.015
简介:PHPOK企业站系统(以下简称系统或本系统),采用PHP+MYSQL语言开发,是一套成熟完善的企业站CMS系统。本系统函盖功能全面,自定义功能强大,扩展性较好、安全性较高。可以轻松解决大部分企业站需求。
0x01 程序安装到复现
1.第一步安装系统
2.第二步这里要创建数据库,不然他不会自动创建。
3.第三步完成安装,然后我们点击进入后台。
4.第四步进入后台-》程序升级-》升级配置
5.第五步,服务端构建代码,创建`index.php`放在网页根目录
[PHP]纯文本查看复制代码
?
6.第六步,后台-》程序升级-》在线升级,我这里改下代表是我服务器的升级软件
7.第七步,我们点击升级,在用D盾监听下目录是否上传成功木马文件。
8.第八步,访问木马文件,看看是否能访问成功
0x02 代码审计
漏洞所在文件:
漏洞文件代码:(只贴上相关代码)
首先我们看第369行,,这里我们看到他这里是接收变量中的值,那么就是把接收的值转换成类型。
第370行,判断变量是否有赋值,如果没有复制那么就提示一个数据。
第373行,,函数代表空格转换成。
第374行,,这里可以看到调用本身文件中的方法,那我们进入这个方法看看,在文章的第465行。
第465行,,函数代表检查文件或目录是否存在。
第470行,,申明一个空数组。
第471行,,函数代表引入一个文件,如果没有找到这个文件只会提示个警告不会终止错误。
第478行,,函数代表检查文件或目录是否存在。
第486行,,函数代表字符串切割,并且判断不等于那么就进入487行区间。
第489行,,URL地址拼接,函数代表空格转换成,函数代表移除字符串两侧的空白字符。
第493行,,判断外部传入的是否等于1或者等于4。
第494行,,这里使用了3元运算符。
第495行,,这里代表是获取当前访问的网址。
第496行,,获取客户端Ip
第497行,,URL地址拼接,函数代表空格转换成。
第498行,,也是URL地址拼接。
第499行,,函数代表判断是否有某函数。
第502行,,获取服务器PHP版本。
第506行,,获取服务端mysql版本号。
第511行,,这里是设置CURL请求的超时时间。
第513行,,设置请求IP。
第515行,,请求URL地址,返回内容。
下面就是返回数据,那么我们回到第一张图片。
第375行,,这里代表是把接收到的内容转换成数据。
第376行,,判断不等于。
第379行,,判断是否为空。
第382行,,把接收到的值,从转换成实体。
第383行,,写入当前文件,第一个参数代表路径,第二个参数代表内容。
第384行,,我们看到这里的意思就是解压文件到某个目录。
第386行,,删除写入的文件。
第386行,,这里是字符串切割。
第387行,,这里调用自定义方法,也是在本文章第152行。
第154行,,定义一个空数组。
第155行,,这里大概意思是遍历当前文件所有文件名,这里我就不去找代码,就把代码直接复制出来。
那么代码路径在中第297-313行
第156行,,判断是否为空,并且判断他的数据是不是小于1。
第159行,,代表统计字符串长度。
第162行,,循环遍历数组。
第163行,,代表移除字符串两侧的字符。
第165行,,这里代表跳出循环。
第167行,,代表字符串切割。
第168行,,这里判断是否等于。
第169行,,代表移除字符串两侧的字符,代表写入文件。
第183行,,代表字符串切割,从0到10切割判断等于。
第185行,,代表判断文件是否存在。
第187行,,剪切文件到某个目录。
第189行,,代表判断目录是否存在,并且判断临时文件是否不存在。
第190行,,创建目录。
第194行,,代表判断文件是否存在,并且判断不等于文件的进入区间。
第194行-第210行都是一样,剪切和创建目录。
第205行,,代表整个文件读入一个数组中。
第209行,,代表数组循环。
第213行,,代表移除字符串两侧的字符。
第214行,,判断是否有值,并且判断文件是否存在。
第215行,,代表删除文件。
第218行,,判断是否有值,并且判断目录是否存在。
第225行,这里又看到调用自己的方法。
为何还有那么多代码要分析。
我们接下来继续往下分析,这里的话我就把代码Copy出来,代码太多截图不好看。
我这里挑重要的函数讲解下,这里都是sql执行语句,没有什么可以分析的。
函数:
,代表检查文件或目录是否存在。
,代表读取文件,如果携带2个参数那么就是写入。
,代表字符串替换。
,代表查看字符串长度。
,代表字符串切割。
,代表变量删除。
,代表把字符串切割成数组。
,代表移除字符串两侧的字符。
好了 我们回到上上张图片。
第231行,,代表移除字符串两侧的字符,代表写入文件。
第233行,,代表字符串替换。
第240行,,代表检查文件或目录是否存在。
第241行,,引入一个文件。
第243行,,代表删除文件。
第244行,,代表把目录结构挪列出来。
第245行,,判断值是否存在,并且判断他的数量是否小于0。
第247行,,这里代表循环删除某个文件。
第251行,这里又进入一个自定义方法区间。
老样子,Copy代码,代码量不多我就Copy出来。
那么我们还是做简单的介绍下重要函数。
,代表移除字符串两侧的字符。
,判断文件是否可写。
,代表检查文件或目录是否存在。
,字符串替换。
,写入文件或读取文件。
这里已经介绍完毕了,整个审计分析逻辑在上面。
0x03 漏洞修复
路径:
第152行,方法里面的循环加上这段代码去过滤。
,这里我只写了比较有危害的关键字。
作者:小猪 文章来源:i春秋论坛
领取专属 10元无门槛券
私享最新 技术干货