雖然標題是寫 Template Injection,但我們暫時先從另外一個角度切入八 owo)/

小 sandbox(?

這邊有一段簡單的 Python 2 程式碼

while True:

try:

inp = raw_input("> ")

exec inp

except Exception, e:

print 'Exception:', e

你該輸入些什麼才能成功 pwn 下這個東西呢?

我想,寫過 python 的人都會知道可以 import os; os.system('id'); 就可以輕鬆執行指令了吧(?

順帶一提,其實我們常用的 import xxx 是 __import__('xxx') 這個函式的語法糖,所以上面的 code 可以改寫成 __import__('os').system('id')

好ㄛ,到這邊有基礎 Python 經驗的人應該都覺得是常識吧

那,如果來玩個黑名單招數呢

def check_secure(inp):

Q____Q = [

'exec', 'open', 'file', 'execfile', 'import', 'eval', 'input',

# and anything you want

]

for s in Q____Q:

if s in inp:

raise Exception("Sorry, '"+ s +"' is not allowed.")

while True:

try:

inp = raw_input("> ")

check_secure(inp)

ret = None

exec "ret=" + inp

if ret != None:

print ret

except Exception, e:

print 'Exception:', e

執行起來大概會像這樣:

$ python ./blacklist.py

> print(1)

1

> exec('print(1)')

Exception: Sorry, 'exec' is not allowed.

> import os

Exception: Sorry, 'import' is not allowed.

恩⋯⋯乍看還行吧。不過,對啦,我想大部分都知道字串比對看起來就很好繞,但怎麼繞呢?

內建函數?

欸等等,大家用 python 的時候都知道要用一些 module 的時候就 import 一下就好,那有沒有想過那些 pow 啊 read 之類的函數到底是哪來的啊?為毛都不用 import 就能用惹好奇怪ㄛ

事實上,python 內建已經有一個叫 __builtins__ 的 module 了,那些所謂的內建函數都塞在這個 module 裡面了,我們可以用 dir(__builtins__) 簡單瞄一下它

>>> __builtins__

>>> dir(__builtins__)

['ArithmeticError', 'AssertionError', ... , 'tuple', 'type', 'vars', 'zip']

應該就會看到一堆大家熟悉的內建函數惹

所以針對前面的那個黑名單字串比對法,可以簡單地用 __builtins__.__dict__['__imp'+'ort__']("os").system('id') 就可以繞過比對了。

那,如果試著把 __builtins__ 裡面的東西通通刪掉,只留下我們需要的函數呢?

Q____Q = __builtins__.__dict__.keys()

Q____Q.remove('raw_input')

Q____Q.remove('print')

for x in Q____Q:

del __builtins__.__dict__[x]

看起來超安全了吧?什麼函數都不能用ㄟ

當然我會在這邊提到,就是,還是可以繞過啦 XD

我們都是 object

對 python 有點概念的,也都會知道所有東西都是一種 object,不管是字串、dictionary、tuple、function 還是三小東西都是一種 object。

除了看教科書的說明以外,要怎麼證明呢?

有一種叫做 __mro__ (Method Resolution Order)鏈的東西,可以輕鬆地觀察一下:

>>> [].__class__.__mro__

(, )

>>> ().__class__.__mro__

(, )

>>> "".__class__.__mro__

(, )

>>> "".__class__.__base__

所謂的 Method Resolution Order,顧名思義就是用來記錄該物件的 method 要怎麼解析,舉例來說如果某個物件 X 同時繼承了 A 跟 B,而 A 跟 B 同時都有 meow() 的 method,該物件 X 要用誰的 method 呢?

而 mro 就在這個場景就達到了作用,他會很簡單地告訴你每個 method 的優先層級,而他決定優先層級的方式,又有一些演算法來決定了,但在目前我們也不用考慮那麼多,我們只要知道:mro 能讓我們存取到所有東西的根源: 就好了!

誒等等,object 是所有東西的根源,那可以透過某種方法就能存取到所有東西了嗎⋯⋯?

Well, yes but no.

它能存取到一些「不得不存在的東西」。也就是整個 python 要跑起來,一定要存在的東西。

方法的話很淺顯易懂:[].__class__.__base__.__subclasses__() 就能做到了

看起來會像這樣:

>>> [].__class__.__base__.__subclasses__()

[, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ]

一堆東西都是 object 的 subclass!這些東西裡,什麼才是對我們有用的呢?

或許眼尖的人會發現裡面就有 file 這東西了,我們就能讀檔了!

[].__class__.__base__.__subclasses__()[40]('/etc/passwd').read()

大家可以在自己的 python 2 試試看(python 3 環境不太一樣,沒有內建 file 這種東西)

但這樣還不夠,我們會想做更多事,例如一開始提到的類似於執行 __import__('os').system('id') 這類的東西。

但今天就先到這邊吧,下集待續 XD

web python template injection_[Day 2] Template Injection:欸不是,你真的懂 Python 嗎?相关推荐

  1. python语言语句快的标记是什么_一文搞懂Python程序语句

    原标题:一文搞懂Python程序语句 程序流 Python 程序中常用的基本数据类型,包括: 内置的数值数据类型 Tuple 容器类型 String 容器类型 List 容器类型 自然的顺序是从页面或 ...

  2. python课堂实例_享学课堂带你了解并读懂Python列表中的6种操作实例

    原标题:享学课堂带你了解并读懂Python列表中的6种操作实例 今天为大家来介绍一下很多人在享学课堂上学习Python时,经常会用到列表,列表(list)就是动态数组,相当于C++标准库的Vector ...

  3. python的ai写作_AI伪原创,我们是认真的。[Python实现]

    经过了本渣渣长达2年之久的深入学习和研究,耗费了大量的人力物力,使用了超过5亿条中文语料,上百台服务器连续一年的不间断训练,优化市面上已有的神经网络算法,结合多年的seo经验及NLP方面的成就,终于用 ...

  4. 一文看懂Python collections模块的高效数据类型

    原作: George Seif, 发表于medium.com, 大江狗原创翻译, 并对原文稍作修改. Python的最大优势之一是其广泛的模块和软件包.这将Python的功能扩展到许多受欢迎的领域,包 ...

  5. python真的有用吗-你真的认为python有那么好吗

    为什么要放弃一切选择python?python有那么好吗,这么多人都一股脑的学习python,到底魅力在哪里呢? 如果你是一名新手,应该如何选择编程语言呢,这么多的编程语言,你应该作何抉择呢?我们知道 ...

  6. angular 字符串转换成数字_一文看懂Python列表、元组和字符串操作

    好文推荐,转自CSDN,原作星辰StarDust,感觉写的比自己清晰-大江狗荐语. 序列 序列是具有索引和切片能力的集合. 列表.元组和字符串具有通过索引访问某个具体的值,或通过切片返回一段切片的能力 ...

  7. python编程django项目django.template.exceptions.TemplateDoesNotExist: registration/login.html解决方法

    文章目录 遇到的问题 解决方法 参考 遇到的问题 做<python编程:从入门到实践>的web项目:学习笔记. 在19章,遇到问题:添加user应用程序,编写完login.html,进行浏 ...

  8. Python+OpenCV:模板匹配(Template Matching)

    Python+OpenCV:模板匹配(Template Matching) Template Matching with Single Objects ######################## ...

  9. java和python自学教程视频_免费视频教程,2019年最新Java、PYthon、web视频

    干货视频,培训机构最新java.Python.web前端.人工智能视频(基础班+就业班).价值几万的Java.PYthon.web.人工智能视频教程, 为还在学习迷茫的你提供一个学习Java.Pyth ...

最新文章

  1. Uber提出损失变化分配方法LCA,揭秘神经网络“黑盒”
  2. ajax按钮禁止重复提交,Ajax禁止重复提交
  3. git中查看和设置 用户名、密码
  4. py爬取英文文档学习单词
  5. 【POJ - 2909 】Goldbach's Conjecture (哥德巴赫猜想,数论,知识点结论)
  6. 写了 300000 行基础设施代码,我学到了这五条经验
  7. ipa apk.cn dbl.html,前端解析ipa、apk安装包信息 ―― app-info-parser
  8. docker 安全性问题
  9. [转载] Python中NumPy简介及使用举例
  10. 云计算:大数据时代的系统工程(二)
  11. 【优化算法】混沌游戏优化 (CGO)【含Matlab源码 1010期】
  12. 三次参数样条曲线拟合(任意控制点)
  13. 计算机exce常用功能,EXCEL常用函数介绍(1)EXCEL 函数 -电脑资料
  14. SpringBoot 获取 Yml 配置 信息 Environment
  15. python做估值模型_通证估值模型-费雪模型与净现值模型详解
  16. 今日分享——点点小事对人的影响
  17. 解决——U盘格式化为NTFs之后,显示不了U盘
  18. 虚幻引擎 Unreal Engine 详细笔记 根据谌嘉诚视频无遗漏总结 快速上手
  19. 亿级(无限级)并发,没那么难-科普文
  20. MonoRail - 简介

热门文章

  1. 阿桑奇:维基解密将把CIA网络攻击工具资料提供给科技公司
  2. 【OFDM通信】基于matlab OFDM通信系统仿真【含Matlab源码 2521期】
  3. 儿童玩具和儿童用品美国CPC认证ASTM测试CPSIA标准大合集
  4. 今天又谈到360和QQ
  5. 看完多线程通透了(爆干4万字)
  6. Python解压缩ZIP格式
  7. 关爱亚孤儿 我们在行动——九巨龙肥城市京欣学校走进聊城市东昌府区
  8. 冯·诺依曼体系和哈佛体系结构比较
  9. php zip提示未安装包,请大神赐教:centos7安装zip扩展成功,但是打印phpinfo未加载成功...
  10. 甲骨文oracle云计算迎来转机