web python template injection_[Day 2] Template Injection:欸不是,你真的懂 Python 嗎?
雖然標題是寫 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 嗎?相关推荐
- python语言语句快的标记是什么_一文搞懂Python程序语句
原标题:一文搞懂Python程序语句 程序流 Python 程序中常用的基本数据类型,包括: 内置的数值数据类型 Tuple 容器类型 String 容器类型 List 容器类型 自然的顺序是从页面或 ...
- python课堂实例_享学课堂带你了解并读懂Python列表中的6种操作实例
原标题:享学课堂带你了解并读懂Python列表中的6种操作实例 今天为大家来介绍一下很多人在享学课堂上学习Python时,经常会用到列表,列表(list)就是动态数组,相当于C++标准库的Vector ...
- python的ai写作_AI伪原创,我们是认真的。[Python实现]
经过了本渣渣长达2年之久的深入学习和研究,耗费了大量的人力物力,使用了超过5亿条中文语料,上百台服务器连续一年的不间断训练,优化市面上已有的神经网络算法,结合多年的seo经验及NLP方面的成就,终于用 ...
- 一文看懂Python collections模块的高效数据类型
原作: George Seif, 发表于medium.com, 大江狗原创翻译, 并对原文稍作修改. Python的最大优势之一是其广泛的模块和软件包.这将Python的功能扩展到许多受欢迎的领域,包 ...
- python真的有用吗-你真的认为python有那么好吗
为什么要放弃一切选择python?python有那么好吗,这么多人都一股脑的学习python,到底魅力在哪里呢? 如果你是一名新手,应该如何选择编程语言呢,这么多的编程语言,你应该作何抉择呢?我们知道 ...
- angular 字符串转换成数字_一文看懂Python列表、元组和字符串操作
好文推荐,转自CSDN,原作星辰StarDust,感觉写的比自己清晰-大江狗荐语. 序列 序列是具有索引和切片能力的集合. 列表.元组和字符串具有通过索引访问某个具体的值,或通过切片返回一段切片的能力 ...
- python编程django项目django.template.exceptions.TemplateDoesNotExist: registration/login.html解决方法
文章目录 遇到的问题 解决方法 参考 遇到的问题 做<python编程:从入门到实践>的web项目:学习笔记. 在19章,遇到问题:添加user应用程序,编写完login.html,进行浏 ...
- Python+OpenCV:模板匹配(Template Matching)
Python+OpenCV:模板匹配(Template Matching) Template Matching with Single Objects ######################## ...
- java和python自学教程视频_免费视频教程,2019年最新Java、PYthon、web视频
干货视频,培训机构最新java.Python.web前端.人工智能视频(基础班+就业班).价值几万的Java.PYthon.web.人工智能视频教程, 为还在学习迷茫的你提供一个学习Java.Pyth ...
最新文章
- Uber提出损失变化分配方法LCA,揭秘神经网络“黑盒”
- ajax按钮禁止重复提交,Ajax禁止重复提交
- git中查看和设置 用户名、密码
- py爬取英文文档学习单词
- 【POJ - 2909 】Goldbach's Conjecture (哥德巴赫猜想,数论,知识点结论)
- 写了 300000 行基础设施代码,我学到了这五条经验
- ipa apk.cn dbl.html,前端解析ipa、apk安装包信息 ―― app-info-parser
- docker 安全性问题
- [转载] Python中NumPy简介及使用举例
- 云计算:大数据时代的系统工程(二)
- 【优化算法】混沌游戏优化 (CGO)【含Matlab源码 1010期】
- 三次参数样条曲线拟合(任意控制点)
- 计算机exce常用功能,EXCEL常用函数介绍(1)EXCEL 函数 -电脑资料
- SpringBoot 获取 Yml 配置 信息 Environment
- python做估值模型_通证估值模型-费雪模型与净现值模型详解
- 今日分享——点点小事对人的影响
- 解决——U盘格式化为NTFs之后,显示不了U盘
- 虚幻引擎 Unreal Engine 详细笔记 根据谌嘉诚视频无遗漏总结 快速上手
- 亿级(无限级)并发,没那么难-科普文
- MonoRail - 简介
热门文章
- 阿桑奇:维基解密将把CIA网络攻击工具资料提供给科技公司
- 【OFDM通信】基于matlab OFDM通信系统仿真【含Matlab源码 2521期】
- 儿童玩具和儿童用品美国CPC认证ASTM测试CPSIA标准大合集
- 今天又谈到360和QQ
- 看完多线程通透了(爆干4万字)
- Python解压缩ZIP格式
- 关爱亚孤儿 我们在行动——九巨龙肥城市京欣学校走进聊城市东昌府区
- 冯·诺依曼体系和哈佛体系结构比较
- php zip提示未安装包,请大神赐教:centos7安装zip扩展成功,但是打印phpinfo未加载成功...
- 甲骨文oracle云计算迎来转机