No title
2021.8.1 今日比较杂,终于搞定了pycharm,搞定了SSTI模板注入!
在pycharm中学习一个函数比如DES.new(),可以按F4查看源码来了解函数。
再按ctal F4来返回程序继续编辑。
1 | from Cryptodome.Cipher import DES |
这是练习的DES,注意,一个汉字算三个字节,明文必须为密钥整数倍,密钥为8位,明文正好也为8位。
加密出来就是如此。下面解密。
解密完成,记得第一步解密无法表示汉字,要经过utf-8转码。
下面攻关一项重大知识点:SSTI模板注入
先学习python沙盒绕过
估计你已经看懂了,
1 | ().__class__应该返回()对应的类名称,也就是元组,由图,返回了tuple |
1 | ().__class__.__bases__[0]就返回基类的第一个值,在这里也就是object. |
1 | ().__class.__bases__[0].__subclasses__()也就是返回了object的方法,也就是能对object进行的操作集合。 |
然后我们想在这里找到file方法
在python2中是在__subclass()[40]的位置,但是python3却没有这个方法,因为我写了个脚本跑了一下
发现确定了187个方法中都没有。。
Python中的序列化与反序列化。
出题人一般会把这种库禁掉,因为他能执行系统命令。
所以我们可以把命令序列化,然后用反序列化加载命令,在这里把反序列化看成一种加密。
可以把库加密,然后引入
这篇链接quite perfect!
这两个也非常有用!
上面importilb可以代替import!
再补充一个比较重要函数
__mro__[]
一直递归显示到父类函数。
1 | os.popen("mkdir", "w", bufsize) |
用来执行系统命令
第一个表示要执行的命令,要用字符串形式,第二个是mode,’r’或’w’,第三个是文件需要的缓冲大小,一般用系统默认值bufsize.
function._global()返回所有属性以及值,这个返回太长了,得好几百条
subprocess模块很强大。
现在我们掌握了足够多的补充知识,来读图中这行红色代码,就是用file 方法打开/etc/passwd文件。
0802003033744.png)
这里是dir()它和global效果相同,所以这个更好理解!
就是列出了一个
在这里是元组,也就是一个元组初始时能使用的所有方法或函数。
我们看,如何理解后面init等意思呢,最后写的是system函数,一般都是模块+函数,这种调用才对,所以,前面一大串是不是代替了模块呢,也就是os呢
上图印证了我们的想法,前面一大串就是用来找引入os模块的模块让他来代替os模块,执行os模块下的函数system.
builtins也是非常常用的引入这个模块代表能使用一些内置函数。出题人可能会删除一部分内置函数,所以reload
1 | "".__class__.__mro__[-1].__subclasses__()[61].__init__.__globals__['__builtins__']['eval']('__import__("os").system("ls")') |
同刚才引入os模块,前面部分是引入builtins模块,然后调用其中的eval函数来执行下面的语句:也就是导入os模块和执行系统命令。
获取类的位置用index
一定要先导入包模块,否则会报错