【粉丝福利】PHP代码审计之wuzhicms(二)

简介: 【粉丝福利】PHP代码审计之wuzhicms

3.csrf

在测试功能点:系统设置 => 权限管理 => 添加管理员 处我们点击提交

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

89975120fe0c8fd119c543bc403c5a3b_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

通过提示我们了解到必须存在一个前台账户,然后才可以将前台账户绑定为系统管理员,而前台账户是可以注册的。

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

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

路径:

/index.php?m=core&f=power&v=add&&_su=wuzhicms

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

通过路由找到对应代码

从最上面的注解就可以看出 add() 函数是用于添加管理员的,35-37行代码判断是否点击提交操作,然

后判断用户名是否为空,不为空则将传入的 username 值赋值给 $username

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

在代码38行处根据用户名

从数据库中取出前台账户,如果该前台用户不存在则会提示如下内容,也就是我们上面的提示,在40行代码判断该用户是否已经是管理员,而44-51行代码是判断添加管理员时是否设置密码.

1165995fd7717ba22fe6cb1f84421a79_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

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

4.目录遍历

通过全局搜索 glob 函数发现一处功能点处可能存在目录遍历,这里的 glob() 函数中 $dir 参数可控

17503d9f4cf15885ff0166b37f8cada0_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

上面代码29行通过 template() 函数渲染 listing.tpl.php 文件,将我们目录下的内容遍历出来并显示在前端页面。

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

添加我们所需要的 dir 参数,由于上面的代码存在过滤且这里仅仅是将传入的内容替换为空而且只替

换一次,通过 ...../// 的形式来绕过该处的过滤实现目录遍历

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

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

5.任意文件删除

全局搜索危险函数 unlink() ,发现该处存在一个 my_unlink() 函数调用了 unlink() 函数并

且通过注解也可以大致了解到该函数是用来删除附件的,这里的 $path 参数传递需要删除的文件。

接下来我们的思路是两点:一是看哪些功能点调用了 my_unlink() ,二是看调用处 $path 是否可以控制。

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

通过上面的思路,我们 Ctrl+鼠标左键 点击该函数,发现有三处功能点调用了 my_unlink() 函数。

这里我们发现其中一处 del() 函数调用了该功能点进行文件删除.

90863c2656b45fd63d676596e7cf6221_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

上面的176、177行代码需要我们传入两个参数id、url,这里需要看看177行代码处的remove_xs()函数中进行了哪些过滤。

23fe846f9c40719909a7334b539470e3_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

通过上面一系列的过滤最终返回我们过滤后的内容。

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

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

我们再接着看代码,我们如果传入id参数,这里的path参数是从数据库中拿到的,我们不能控制。

4bc8abe2faaabdb582165880e41d3bb2_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

如果不传入id参数则会走下面的else,在207行代码处判断我们传入的 path 是否在数据库中,如果不在就

会进入208行代码,对我们传入的 $path 进行删除

04428ccbb5f481ba464be1d1cc488cb6_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

漏洞复现:

2456eba2b67e843132885cc91ee15c30_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

我们看到数据包中的路由其实与我们分析的代码是一样的.

GET /www/index.php?v=del&url=qr_image/mobile.png&m=attachment&f=index&_su=wuzhicms&_menuid=29&_submenuid=52 HTTP/1.1
Host: www.wuzhicms.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Referer: http://www.wuzhicms.com/www/index.php?dir=.%2Fqr_image&m=attachment&f=index&v=dir&_su=wuzhicms&_menuid=29&_submenuid=52
Cookie: PHPSESSID=k652a136tnltn7n1obr88jo5h6; fbp_uid=QO%2BEiNPcY77ztIj3VwL07Q%3D%3D; fbp_username=qPFUCdQQfkRNinLQXE3qZA%3D%3D; fbp_wz_name=CfApQiRkuXByfw7AqHDG5A%3D%3D; fbp_siteid=MCakL%2FitF2Mz8zst4dyFvQ%3D%3D; fbp_userkeys=u0CzDoL6HLYQwPI%2Ffgo2bg%3D%3D
Upgrade-Insecure-Requests: 1

在更目录下创建一个 ceshi.txt 用于测试

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

成功将test.txt删除。

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


sql注入(后台)

先直接全局搜索select

5783a751df6f3a039d66d9043d30fc7a_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

通过全局搜索 在这个地方 发现调用了这个函数

4732199b0db4a5f371aa2a3d3ed9efaa_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

然后查看传递的参数

主要传递的是55行这个$where参数 传到了函数

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

继续看$keywords 因为这个没调用函数 但是调用了一个$GLOBALS来获取值

这里就又要介绍下$GLOBALS

97e48b905798e197b7ef74a5187406a9_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

在这个文件看见了广告管理的注释

129153e9998f3c780c8e65c6b9a7baaf_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

ff3a5ab80705872e481c7b2dadf52c32_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月前
|
NoSQL 关系型数据库 MySQL
使用redis实现关注粉丝功能(php版) 2020-07-12染念 染
redis不用说啥了,比mysql有的是可以吹的地方,于是很多人选择用redis来实现这类操作频繁的场景 @(汗) 但是下午第一次安装redis花了好多时间... 这里借用[button href="https://www.jianshu.com/p/e3f0b98a78bc"]Redis实现用户关注功能[/button]的思路
28 0
|
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