opname[code]) ValueError: opcode LOAD_NAME not allowed 所以没法直接用__import__。类似地,也没法用__builtins__这些变量。 在这个时候,我想起了lambda表达式,所以莽试了一发用lambda表达式包裹起一句话RCE: (lambda: __import__('os').system('sh'))() 结果您猜怎么着?就能getshell辣!然后就是为...
记录一下当前栈的信息,作为一个list,在load_mark结束时返回。 弹出前序栈的栈顶,用这个list来覆盖当前栈。 load_mark相当于进入一个子过程,而pop_mark相当于从子过程退出,把栈恢复成调用子过程之前的情况。所有与栈的切换相关的事情,都靠调用这两个方法来完成。因此load_mark和pop_mark是栈管理的核心方法。 回...
由于request.GET.get('email')也就是用户通过get传入的email参数完全可控,我们就能让request.user里的任意属性输出出来,例如{user.password}。 通过debug查看了一下request.user里的内容,其中session_key,目录,secret_key等等敏感信息都能查看,其中SECRET_KEY如果泄露,则可能配合django反序列化漏洞实现rce。 Jinja的沙盒...
这里补充几个不需要获取globals,而是作为object的直接子类就提供有rce功能的方法. 1._frozen_importlib_external.FileLoader类:该类下有get_data函数可以实现读取文件 python ''.__class__.__mro__[-1].__subclasses__()[xx]["get_data"](0,"/etc/passwd") 2.importlib类:importlib类中的load_module可以...
那么思路就有了:通过get_data路由发送SSRF请求->admin路由接收进行反序列化->修改ctf_config下的name属性为SSTI注入语句->实现RCE。 那么编写POC脚本: import base64 ssti = b'2*6' payload = b'\x80\x03c__main__\nctf_config\n}(Vname\nV{{' + ssti + b'}}\nub0V123\n.' ...
首先可以确定的是,代码可以触发RCE导致dir命令的执行。 从源码中可以看到,__reduce__方法实际上对应的指令码是R: 对反序列化的过程进行调试,会发现它进入了load_reduce()方法,从此方法不难发现原因 此函数即R指令码对应的函数,它做的操作主要是将栈顶标记位args,然后取当前栈栈顶的元素标记位func,然后以args为...
RCE 在攻击中我们的目的肯定最终是利用序列化的内容实现我们想要实现的操作,这里以RCE为例进行介绍,基本的构造如下: c<module><callable>(<args>tR 填充上内容也就是: cossystem#引入 os 模块的 system 方法,这里实际上是一步将函数添加到 stack 的操作(S'ls'# 把当前 stack 存到 metastack,清空 stack,再将...
2. 简单rce。 import pickle import os class genpoc(object): def __reduce__(self): s = """echo test >poc.txt""" # 要执行的命令 return os.system, (s,) # reduce函数必须 返回元组或字符串 e = genpoc() poc = pickle.dumps(e) ...
模板引擎可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码的分离,这大大提升了开发效率,良好的设计也使得代码重用变得更加容易。 但是模板引擎也拓宽了我们的攻击面。注入到模板中的代码可能会引发RCE或者XSS。 说白了就是flask和django对jinja2模板引用,因为jinja2模板存在注入字符串,SSTI服务端模板注入正是因为...
而类名中存在“R关键字”,则无法进行__setstate__姿势的RCE,这里利用方式只剩下一种:c指令码的变量修改。 但是变量修改有什么用呢?我们可以注意到第67行的ctf_config包下的name变量,如图:直接将变量的值拼接到Template方法中,这里存在一个SSTI注入问题。