PHP代码审计-zzcms
漏洞分析
此篇文章主要记录了zzcms的历史漏洞分析,便于进一步学习代码审计的知识。
环境搭建: ===== 使用phpstudy进行环境搭建  接着进入下一步  然后输入数据库用户名和密码  安装成功。  代码审计 ==== 1.任意文件写入漏洞 ---------- 通过全局搜索,发现 xml\_unserialize() 对 parse() 函数进行了调用  接着去搜索xml\_serialize()函数的调用情况  在该处发现xml\_serialize()函数调用并且参数可控。  parse\_str()函数可以把传递的字符串解析为变量,也就是说这里传递过去的字符串可以当做参数进行使用。 我们去跟进下该函数。  大致看下该函数是用于加解密字符串的, $string 参数传入我们需要加解密的字符串,这里也就是我们上述可控的 $code ; $operation 默认为DECODE也就是解密字符串,而 $key 则为加解密的秘钥。  在这里 $code 这里可控,所以下面的 $get\['time'\] 、 $get\['action'\] 可控  在代码中判断我们传入的$get\['action'\]方法是否为数组中的其中一个,如果是的话调用该方法,并将$get 、 $post 以参数形式传递。目前可知 $get 、 $post 我们可控。  接着发现 updateapps() 方法中使用 preg\_replace() 将我们传入的内容进行正则匹配替换并通过 fwrite() 保存到配置文件。而这里的 $post\['UC\_API'\] 是可控的,所以这里我们可以替换任意内容到配置文件中。  ### 漏洞复现: 由前面的代码分析可知, $code 参数我们需要构造的内容要满足两点:  1、$timestamp - $get\['time'\]> 3600 2、$get\['action'\]=updateapps; 且要通过 \_authcode() 解码,所以我们这里要将 $code 的内容先进行编码这里 $code 传入加密后的内容,而 $post 的内容按照XML格式构造才能解析。 POC如下:  配置文件中已经被我们成功写入一句话    2.任意文件删除 -------- 全局搜索 unlink() 函数。   我们跟进该文件并向上回溯 unlink() 下 $file 参数是否可控,最终在代码中发现了该文件两个可控参数。  在代码中的 $action 是我们可控的, $mlname 也是我们可控的,这里通过 $mlname 传入文件夹名并遍历出该文件夹下的文件,最终将文件名赋值给 $file ,可以在上述的 unlink() 函数中实现遍历删除文件。   ### 漏洞复现: 通过分析,构造路由进行文件删除测试,通过上面代码过滤了 ../ ,我们通过 ..\\ 绕过该处过滤    3.前台XSS漏洞 --------- 由于该系统并没有严格的遵循MVC开发模式去开发,大部分的前后端代码都写在一个php文件中,如下面我们看到的这个php文件。在该PHP文件中本应该是有权限校验的,并且该权限还是后台admin权限,但是这里的 $\_COOKIE\["UserName"\] 是我们可以伪造的,以致于可以绕过这里的逻辑校验。 ###  一些MVC框架大多都使用了模板,并没有直接传入参数而是通过模板渲染进行输出的,如果在传输的过程中没有进行过滤或者转义的话也会造成XSS。 ### 漏洞复现: 我们在Cookie中加入UserName值  4.SQL注入漏洞 --------- 在全局搜索关键字时发现一处SQL语句参数可控的地方,发现这里的 $classname 参数是可控的   在代码开始处可以看出这里的 dowhat 参数可控,我们可直接控制该参数进入 modifybigclass() 函数。 跟进 modifybigclass() 函数  在该函数中我们可以控制 action 参数走到存在漏洞的if条件中,而由我们上述说提到的这里的classname直接通过POST传入并拼接到SQL语句中,最后通过代码query()执行SQL语句。  query() 中封装了 mysqli\_query() 去执行SQL语句。  ### 漏洞复现: 从上面的分析可以看出这里的是存在盲注的,接下来我们用payload测试下  5.逻辑漏洞 ------ 在登录测试时发现该处登录页面有验证码和登录次数的校验  首先通过 getip() 获取我们登录的ip地址,大概率这个函数是有问题的。将获取到的IP地址直接拼接在SQL语句中并且在15分钟内登录次数不能尝试超过10次,最后通过 checkyzm() 来进行验证码校验。  getip ()函数中,可以通过XFF的形式获来获取IP地址,所以存在伪造的情况,而下面的 check\_isip()则会检测ip地址的合法性,这里防止了SQL注入。   该函数通过判断传入的验证码与SESSION中的验证码是否相同而忽略了验证码可重用的问题。应该对每次提交的验证码进行删除并重新生成SESSION中的验证码,所以这里在设计时是存在逻辑缺陷的。  ### 漏洞复现: 我们根据IP的正则形式通过burp构造请求包来绕过登录次数的检测,抓取登录包  6.SQL注入 ------- 全局搜索email from,发现一处sql语句。  发现这里的 $username 参数是可控的 ###  然后直接写入用户的登录次数和登录时间。  在获取 $\_COOKIE\['dlid'\] 的值,然后从表中读取passed 值、然后包含“,”字符。表示群发模式。这串代码主要用于邮件群发功能。没有对执行的语句进行过滤。  ### 漏洞复现: SQL语句select中的条件变量不受单引号保护,可能导致SQL注入漏洞   抓包查看SQL注入点  使用sqlmap进行注入,成功跑出注入点。  7.sql注入3 -------- 通过“/admin/baojia\_list.php”参数“keyword”进行SQL注入。  发现这里的 $ckeyword参数是可控的  跟进这个fetch\_array函数,发现未对输入的参数进行过滤,导致可以产生sql注入。  ### 漏洞复现:   keyword=1' AND (SELECT 3526 FROM (SELECT(SLEEP(5)))qvLz)-- Iojq&Submit=%E6%9F%A5%E6%89%BE  8.敏感信息泄露 -------- ### 漏洞复现: 漏洞地址1: [http://119.28.176.129/index.php?\_SERVER](http://119.28.176.129/index.php?_SERVER) poc:/index.php?\_SERVER  漏洞地址2: [http://demo.zzcms.net/index.php?\\\_SERVER](http://demo.zzcms.net/index.php?%5C_SERVER)   127.0.0.1/admin/index php?\_ Server poc:/admin/index php?\_ Server   REF: <https://xz.aliyun.com/t/10090> <https://wx.zsxq.com/dweb2/index/footprint/88455551854122> [https://blog.csdn.net/qq\_53123067/article/details/126805823](https://blog.csdn.net/qq_53123067/article/details/126805823)
发表于 2023-03-20 09:00:02
阅读 ( 7207 )
分类:
漏洞分析
2 推荐
收藏
0 条评论
Arthur
8 篇文章
×
温馨提示
您当前没有「奇安信攻防社区」的账号,注册后可获取更多的使用权限。
×
温馨提示
您当前没有「奇安信攻防社区」的账号,注册后可获取更多的使用权限。
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!