3.csrf
在测试功能点:系统设置 => 权限管理 => 添加管理员 处我们点击提交
通过提示我们了解到必须存在一个前台账户,然后才可以将前台账户绑定为系统管理员,而前台账户是可以注册的。
路径:
/index.php?m=core&f=power&v=add&&_su=wuzhicms
通过路由找到对应代码
从最上面的注解就可以看出 add() 函数是用于添加管理员的,35-37行代码判断是否点击提交操作,然
后判断用户名是否为空,不为空则将传入的 username 值赋值给 $username
在代码38行处根据用户名
从数据库中取出前台账户,如果该前台用户不存在则会提示如下内容,也就是我们上面的提示,在40行代码判断该用户是否已经是管理员,而44-51行代码是判断添加管理员时是否设置密码.
4.目录遍历
通过全局搜索 glob 函数发现一处功能点处可能存在目录遍历,这里的 glob() 函数中 $dir 参数可控
上面代码29行通过 template() 函数渲染 listing.tpl.php 文件,将我们目录下的内容遍历出来并显示在前端页面。
添加我们所需要的 dir 参数,由于上面的代码存在过滤且这里仅仅是将传入的内容替换为空而且只替
换一次,通过 ...../// 的形式来绕过该处的过滤实现目录遍历
5.任意文件删除
全局搜索危险函数 unlink() ,发现该处存在一个 my_unlink() 函数调用了 unlink() 函数并
且通过注解也可以大致了解到该函数是用来删除附件的,这里的 $path 参数传递需要删除的文件。
接下来我们的思路是两点:一是看哪些功能点调用了 my_unlink() ,二是看调用处 $path 是否可以控制。
通过上面的思路,我们 Ctrl+鼠标左键 点击该函数,发现有三处功能点调用了 my_unlink() 函数。
这里我们发现其中一处 del() 函数调用了该功能点进行文件删除.
上面的176、177行代码需要我们传入两个参数id、url,这里需要看看177行代码处的remove_xs()函数中进行了哪些过滤。
通过上面一系列的过滤最终返回我们过滤后的内容。
我们再接着看代码,我们如果传入id参数,这里的path参数是从数据库中拿到的,我们不能控制。
如果不传入id参数则会走下面的else,在207行代码处判断我们传入的 path 是否在数据库中,如果不在就
会进入208行代码,对我们传入的 $path 进行删除
漏洞复现:
我们看到数据包中的路由其实与我们分析的代码是一样的.
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 用于测试
成功将test.txt删除。
sql注入(后台)
先直接全局搜索select
通过全局搜索 在这个地方 发现调用了这个函数
然后查看传递的参数
主要传递的是55行这个$where参数 传到了函数
继续看$keywords 因为这个没调用函数 但是调用了一个$GLOBALS来获取值
这里就又要介绍下$GLOBALS
在这个文件看见了广告管理的注释