PHP代码审计之taocms(二)

简介: PHP代码审计之taocms

5.缓存文件getshell

我们在搜索危险函数的时候发现一处很有可能getshell的地方,我们先看这里的$arrayData是否可控。

698dfd7c55dc93ca365ead137c2025f2_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

2f342d0127b079d3496c5fa12cc14522_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

这里代码37行的 $o 也就是对应代码49行的 $cat 数组中的内容是从数据库中 cms_category 表中获取的。那么如果这里表中的内容是我们可以控制的那么就能写入任意内容。

59d92a821b6d91fec755057b4b1c2e82_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

我们去看下该表中的内容

618e3c2cf145a62abeb5efdfb33c5f5c_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

从数据内容可以看出这里的功能点其实就是 管理栏目 中的内容,这里就可以添加内容。

9f7362cba02a6996fe28d42d54b35752_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

7f970847c7f2d3a1195e29cd93d74292_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

这里通过 columsdata() 接收参数,然后通过 add_one() 进行数据插入

92556a2718015d688ee25b0c06b91aaf_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

这里还是通过 safeword() 进行数据的过滤的,但是这里的 safeword() 方法在后续并没有起到过滤的效果。

eeb7642e12a13252a0fc6923779e0162_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

959698a08fb3d8220abd20a7a805e3bf_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

08d8f0c6c8005ea47814e9b883c0a6a5_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png通过搜索该文件可以发现有好几处包含了该模板文件,所以我们这里就可以通过写入缓存文件getshell。

89b3e8888f5fd07bf6f9c971fa541bfb_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

2a86b17c3d2ed4cf365ed91c2244e873_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

cat_array.inc 文件内容如下

34d0e2a608699f17d5ff075a9ecb4e68_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

然后我们访问刚才包含该文件的路由

fc24e9cd8e1b0f2751ca126757d0ccc8_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

cd0ae3034424d82eeef2103f3d5e8d6a_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

6.sql注入

直接先进入admin.php和index.php

7f3b9c0b32a37549e71a7637ded3b616_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

发现index.php有点难以理解。但是大致可以通过函数名和语义分析出是根据一些变量或者一些路径来渲染,加载模板文件,随后回显到前端。

a79899f6ecf1e36abb09fd740d94790f_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

再看admin.php,发现存在action参数和ctrl参数。

发现有两个方法,class_exists和method_exists,这两个函数是判断是否存在类和方法的,接下if内的语句判断,指导action是类名,ctrl是函数名,有点像路由

47f5bcc68c0a90f5359289bd634e6aea_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

搜索发现处理数据库请求的类为cms方法为lists

77d64ff721477a59176c5d43c9b83740_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

直接搜索跟进

45e6dcede7a62d2d189e2ca30e114e12_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

发现有过滤函数对变量进行了一些过滤处理。

4092f1ab1eaa52955d645a83974ed228_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

发现有过滤函数对变量进行了一些过滤处理。

c8127adff8b860497ab4234c0f6a7c23_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

发现对输入做了处理

66e6ad52c025ae46fde0e508ec47678a_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

注入点存在处

最后找到几个未过滤的函数方法:delist、getquery、updatelist、get_one、getlist

那就值针对这几个方法看

审计开始

先看第一个函数delist,看到有三个文件有这三个函数,先看第一个

d22cdb63596cf010d84649113b98c0ec_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

delist

Article类

看到传入的参数有表名、参数id,以及where参数,用于筛选匹配数据

e9245415f11ed97e810200b83778a675_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

在后台管理系统中没看到该模块的调用,然后看CMS类的时候发现CMS继承了Article类,所以看CMS类就好了

Category

这里可以看到仍然没有对id进行过滤,直接使用sleep(5)延时,看到burpsuite返回的时间是5s,符合执行语句,这次只有一次数据库操作,所以返回时间没啥变化

6b7056a863a0af7d0b4fb521aa45f9bb_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

8b383dfbda02895870fde8392176174b_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

CMS

跟Article类是一样的语句所以其实是通杀

cc13b2bf9cb3a1d6581c3981a4f26585_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

测试bool盲注,对语句进行拼接,看参数知道是id

payload:27) or 1=1#

0041e8f9e836edbbf11995172ecfb72e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

发现回显没啥特征进行,采用延时确认,发现成功延时12s,我们的语句写的是4s,说明经历了三次注入,

c79a5ec1cee41ea98673989a9ecb9acc_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

这里payload使用--+是失败的,还是需要用#号,不是很明白

直接上sqlmap,注入出当前user,使用的一些参数

-v 3 --level 5 --risk 3 --random-agent --current-user --technique T --dbms mysql -p id

972cd0627473893b8f9492221542ef5b_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

继续跟进代码,看看为什么产生了三次延时,看看createtag方法

a7b80a609b9950ad294c954822aa206f_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

可以看到传参值也是id,而id在加入sql语句前也没有进行安全处理,只针对tags参数进行过滤,但是我们这个删除执行很明显没有传递tag参数,所以走的是下面的else语句,成功拼接到语句中,根据之前阅读的方法知道,delist、getquery、updatelist、get_one、getlist这几个函数中没有对输入值进行过滤,执行我们的payload。

这里有两条语句都拼接了所以一共延时了3次

64e95dcf74145a96c17dc6292eb8b391_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

相关文章
|
5月前
|
安全 小程序 PHP
PHP代码审计(七)Rips源代码审计系统使用教程
上一篇中提到的Seay源代码审计系统是由C#编写的winform程序,现在已经停止更新了,但是,还是比较好用的。 PHP代码审计还有另一个工具,也是一个神器Rips
179 0
|
5月前
|
安全 小程序 PHP
PHP代码审计(五)PHP代码审计方法与步骤
(1):获取到网站源码(这就是废话……) (2):将网站部署到你自己的环境中,能运行。 这里特殊说明一下我的习惯,我本地的环境与线上的环境基本上保持一致,这样在本地审计及线上部署的时候能发现更多的问题。不建议说是随便搭个环境能跑起来就行,这样不是很严谨。 (3):拿到源码之后,浏览大概的项目结构。
69 0
|
5月前
|
Shell PHP Windows
PHP代码审计(四)PHP文件操作函数(2)
改变文件所有者。如果成功则返回 TRUE,如果失败则返回 FALSE。 语法:chown(file,owner)
41 0
|
5月前
|
安全 小程序 PHP
PHP代码审计(六)Seay源代码审计系统使用教程
www.cnseay.com/ 当然,这个已经不能访问了。 软件的版本比较早,需要.NET framework3.5框架,我这里是软件启动的时候自动提醒安装,如果没有自动提醒,那么你需要手动安装.NET frameWork3.5框架,否则,程序应该是没有办法运行。
412 0
|
2天前
|
PHP
【攻防世界】easyphp(PHP代码审计)
【攻防世界】easyphp(PHP代码审计)
|
5月前
|
XML 开发框架 .NET
代码审计之PHP基础铺垫
代码审计之PHP基础铺垫
61 0
|
5月前
|
小程序 Shell PHP
PHP代码审计(四)PHP文件操作函数(3)
改变文件所有者。如果成功则返回 TRUE,如果失败则返回 FALSE。 语法:chown(file,owner)
23 0
|
8月前
|
关系型数据库 MySQL PHP
PHP 原生操作 Mysql
PHP 原生操作 Mysql
82 0
|
8月前
|
关系型数据库 MySQL 数据库连接
PHP 原生连接 Mysql
PHP 原生连接 Mysql
111 0
|
8月前
|
关系型数据库 MySQL Unix
PHP MySql 安装与连接
PHP MySql 安装与连接
137 0