前言
在网上漫游发现的一个cms cnvd也是有提交的
也是初次审计这种
现在也已经好像没更新了
也是先看了一会代码 才知道这是MVC的 之前由于也没有了解过MVC 就很懵
开始啥都没看懂
后来经过百度 和 求助了一波团队的时候 总算是有一点点明白了 能把代码走动
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。(百度的)
而在之后的路径中会看见m f v这几个参数
m就是文件夹 f就是文件 v就是方法
就先大概介绍这些
下面开始审计
sql注入肯定是容易找的 就先找sql注入了
工具:seay phpstorm phpstudy
第一处 sql注入(可惜是后台的)
先直接全局搜索select
这个函数 展示没有发现有过滤
然后找哪里调用了这个函数
通过全局搜索 在这个地方 发现调用了这个函数
然后查看传递的参数
主要传递的是55行这个$where参数 传到了函数
然后我们看$where参数的组成 里面有两个变量$siteid $keywords
我们是可能可控的
先看$keywords 因为这个没调用函数 但是调用了一个$GLOBALS来获取值
这里就又要介绍下$GLOBALS 因为刚开始我也没懂这个是怎么用来获取值的 知道我百度一阵之后
和代码翻翻之后 在一个文件中发现了
这个cms用$GLOBALS来获取全部的变量 直接把GET POST代替了
具体怎么代替的就不跟进解释了 一句话 就是$GLOBALS可以取到get post的传的值
那么这个keywords 前面又没有定义变量啥的 大概率是 传参的 (后面经过验证 也的确如此)
那另一个参数就不用看了 就先控制这个参数才进行注入了
有了可控参数 现在就需要找到整个payload了
可能熟悉MVC的师傅 就知道该怎么构造payload了 但我没学过MVC 也不了解 就只能用其他方式来找了
在这个文件看见了广告管理的注释
那我就去后台找这个功能了
又因为调用的函数是search嘛 那就是这个搜索框 八九不离十了
直接输入1 然后搜索 但是这样看不出来
就输入1然后抓包 看看包了
好了 这样路径参数什么的也出来了
就全部复制到url
然后构造
payload :SELECT COUNT(*) AS num FROM
wz_promote_place
WHEREsiteid
=’1’ ANDname
LIKE ‘%1%’ or extractvalue(1,concat(0x7e,(select database())))%23
闭合%‘%23
这里我尝试了下 盲注 和报错都是可以的
如果现在到过头来看 就一个简单的搜索框的注入没什么花里胡哨的 过滤也没 但审计来看 还是绕了一大圈子
第二处 前台sql注入
还是在搜索select的时候 发现在mysql.class文件下有一个函数里面有select 并且后面的拼接也没有任何的过滤
然后我们搜索哪里调用了这个函数
首先是在api目录下的sms_check文件中发现调用了get_one函数 并且参数是通过前面的$code拼接
我们可以看到code 先是通过$GLOBALS来获取参数param的值 从前面的介绍可以知道 $GLOBALS是可以获取post get的值 这个文件前面没有定义param变量 那么 这个param应该就是post 或者get 就是我们可控的 这也是导致注入的点
code还通过strip_tags() 函数 而这个函数的作用是剥去html标签 应该是过滤xss吧大概
之后就直接传入了函数 继续更进函数 因为这个文件前面还引入了db类
这个函数应该是调用的这个文件里面的
来到这个文件
可以看到这个get-one函数里面 还调用了一个array2sql函数来处理$where
那先来看看这个函数的作用
可以看到这个函数是用来过滤的
如果是数组 这进入if 把括号 单引号这些过滤掉
不是则走else 过滤 %20 %27
然后返回参数
但也就是这个过滤的地方 没有防护到位
我们传的参数不是数组 所以就没有走if
而else里面过滤的却是 %20 %27
我们传参的时候尽管是经过url编码的 但是web服务器会自动解码一次 所以 我们传到后端代码处的时候是没有进行url编码 相当于
但是二次编码的就不一样了 因为web服务器只解码一次
如果是二次编码这里的else过滤就起效果
return 调用的get_one 则是最开始看见的mysql.class文件里面了
下面就可以开始直接构造payload了 这里通过代码分析可以看到是单引号闭合
单引号报错
闭合显示正常页面
就进行盲注
我用的报错
payload:[http://192.168.1.7/wuzhicms/api/sms_check.php?param=1%27+or%20extractvalue(1,concat(0x7e,(select%20database())))%23](http://192.168.1.7/wuzhicms/api/sms_check.php?param=1'+or extractvalue(1,concat(0x7e,(select database())))%23)