74cms v4.2.126-通杀sql注入-漏洞文库小世界-安全文库-NGC660 安全实验室

74cms v4.2.126-通杀sql注入

74cms v4.2.126-通杀sql注入

0x00 前言

厂商:74cms

下载地址:http://www.74cms.com/download/index.html

关于版本:

新版的74cms采用了tp3.2.3重构了,所以可知底层是tp,74cms新版升级是后台升级的,所以先将将升级方法。

注:此漏洞不用升级至最新版本也可使用。

0x01 74cms升级到最新版

1, 先去官网下载 骑士人才系统基础版(安装包)

2, 将下载好的包进行安装

3, 进入后台点击查看如果不是最新版的话,请点击升级!

4, 如果是本地环境的话,会提示 域名不合法升级失败,这个问题很好解决

5, 搜索文件74cms\upload\Application\Admin\Controller\ApplyController.class.php

6, 查找所有$_SERVER[‘HTTP_HOST’] 改为 http://baidu.com 即可

0x02 数据填充不然没得测试

b4f12aa8a24af83dc4255bfecf714b9d

0x02.1注册商家账号方便测试

首先先注册一个商家用户然后发布一条消息,注册商家直接去后台注册最简单了

注册完成以后将此商家用户登录前台

e5a95dc18702e482eb11a67be608bf2d

0x02.2注册普通账号方便测试

cd4ae0e6bc932bc12dde56b6f4518fa0

0x03 sql漏洞演示

4d1333f7af20a655a2c8a0ad3c89026f

fbbb44443bcf2ef55c908ba2c6e13ecc

这样的话只要点击完以后有数据 你在 lat lng 字段都可以正常的进行注入

Payload: 
http://74cms.test/index.php?m=&c=jobs&a=jobs_list&lat=23.176465&range=20&lng=113.35038 PI() / 180 - map_x  PI() / 180) / 2),2))) * 1000) AS map_range FROM qs_jobs_search j WHERE (extractvalue (1,concat(0x7e,(SELECT USER()), 0x7e))) -- a

7754805447601891df73e902715d42bf

0x04 漏洞原理

老样子一步步分析吧。

先从地址开始分析

地址:http://74cms.test/index.php?m=&c=jobs&a=jobs_list

典型的mvc结构

m 层可以看到为空,我们可以打开目录

74cms\upload\Application\Common\Conf\config.php 查看DEFAULT_MODULE 参数

1fa8c7b459fab6f482883206187a4855

因此可以确定

M = home

C = jobs

A = jobs_list

翻译一下的意思就是 Home 目录 下面的jobs 文件里面的jobs_list 方法

跟进去

40e46889bdfa47d046564fadb6e8f941

跟进来以后,发现我们的lng 参数并没有在jobs_list 方法,但是在外部的时候的却是这个类。

这是因为74cms 使用了 thinkphp 的 tag 也就是标签库驱动 。

所以我们在这里并没有看到相关的代码快,因为他是直接嵌了V层中执行也就是我们常说的视图层。

想了解这一块的

上官网下载thinkphp3.2手册 搜索tag

2976f6acf6d7de47359dba1f20653d1e

即可获得详细信息

跟进视图层进行查看

33fb2de1de41dd94c8808cfd8adc5b70

找到了视图文件:

74cms\upload\Application\Home\View\default\Jobs\jobs_list.html

b3f38e9e58ff139b17c9a37053673ab9

根据图中的条件可得知具体目录名为

74cms\upload\Application\Common\qscmstag\jobs_listTag.class.php

c83b37d220869ab1bb66074da0fd4fa9

da8d2a34d7230f0cd830655d7ffa64ad

说明我们的猜想是没有错的。

为了不浪费大家的时间,我就尽量选重点讲,避免浪费大家时间!

a0755f93d84f7c5aa932deb9059f9beb

这里我们需要了解一下。

首先是我们可外部控制的值

6eea57837f3b4f4d7fc1ea763d12114f

3948ed1a17bd60914f2347b2084d31e9

6e530ea2dbf5d6fa397c9e179fbd9e94

所以最终我们符合条件的内容都会赋值为$this->params

知道这个接口,我们继续注入点,因为前面的东西有太多和我们的这个注入无关的东西了所以我们忽略掉

87f70e98dfa94a212636b61750f7c0c0

我上图中还圈出来的第二个圈圈,可以看到 $this->params[lat] 与 $this->params[lng] 赋值并且没有过滤给了$this->field 而大部分的php框架在 field

可控制的情况下大部分都是有注入问题的,所以这里我基本可以通过经验确定,只要带入了进行查询那就是一个注入漏洞。

这里的构造方法知道这些即可,其他的都不是很重要

这里我们打印一下,最终处理的内容

df7b8bfc6ce93cebbe6170a56ff738fd

0e183e320e07507b274dfcbb8240e663

好了知道这些前置条件以后我们继续。

在执行完这个构造函数以后,还会自动的执行run() 方法

53d0725227910aa51c00b57e16c07b2b

8a76285d1d9b17c573561432b9c10537

13bca4c456fd23f1db9cb33c19fc6545

3392b5fa3a1241667d63153787f6e1e1

0x05 修复方法

e27c99810166ae21aceea0977cc70398

$this->field = "id,ROUND(6378.138*2*ASIN(SQRT(POW(SIN((".floatval($this->params['lat'])."*PI()/180-map_y*PI()/180)/2),2)+COS(".floatval($this->params['lat'])."*PI()/180)*COS(map_y*PI()/180)*POW(SIN((".floatval($this->params['lng'])."*PI()/180-map_x*PI()/180)/2),2)))*1000) AS map_range";

强转为浮点型,防止注入

请登录后发表评论

    请登录后查看回复内容