2021.8.1 今日比较杂,终于搞定了pycharm,搞定了SSTI模板注入!

在pycharm中学习一个函数比如DES.new(),可以按F4查看源码来了解函数。

再按ctal F4来返回程序继续编辑。

1
2
3
4
5
6
7
from Cryptodome.Cipher import DES

key = b"123456ab";
des = DES.new(key,DES.MODE_ECB);#创建对象,选择加密模式
#加密
en_data = des.encrypt("爬虫nb".encode());
print(en_data);

这是练习的DES,注意,一个汉字算三个字节,明文必须为密钥整数倍,密钥为8位,明文正好也为8位。

image-20210801211010315

加密出来就是如此。下面解密。

image-20210801211313205

解密完成,记得第一步解密无法表示汉字,要经过utf-8转码。

下面攻关一项重大知识点:SSTI模板注入

先学习python沙盒绕过

image-20210801221039297

估计你已经看懂了,

1
2
().__class__应该返回()对应的类名称,也就是元组,由图,返回了tuple
().__class__.__bases__返回元组下的基类,也就是(object,)因为我们没有输入元素,不知道逗号后面基类时什么。
1
().__class__.__bases__[0]就返回基类的第一个值,在这里也就是object.
1
().__class.__bases__[0].__subclasses__()也就是返回了object的方法,也就是能对object进行的操作集合。

image-20210801221710879

然后我们想在这里找到file方法

在python2中是在__subclass()[40]的位置,但是python3却没有这个方法,因为我写了个脚本跑了一下

image-20210801224103766

发现确定了187个方法中都没有。。

image-20210801233649794

Python中的序列化与反序列化。

image-20210801233812789

出题人一般会把这种库禁掉,因为他能执行系统命令。

image-20210801234021730

所以我们可以把命令序列化,然后用反序列化加载命令,在这里把反序列化看成一种加密。image-20210801234408051

可以把库加密,然后引入

https://blog.csdn.net/qq_42181428/article/details/99355219?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162782630916780269857262%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162782630916780269857262&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-99355219.pc_search_result_control_group&utm_term=PYTHON%E6%B2%99%E7%9B%92%E7%BB%95%E8%BF%87&spm=1018.2226.3001.4187

这篇链接quite perfect!

image-20210801234509314

这两个也非常有用!image-20210801234533964

上面importilb可以代替import!

image-20210802000820052

再补充一个比较重要函数

__mro__[]一直递归显示到父类函数。

1
os.popen("mkdir", "w", bufsize)

用来执行系统命令

第一个表示要执行的命令,要用字符串形式,第二个是mode,’r’或’w’,第三个是文件需要的缓冲大小,一般用系统默认值bufsize.

image-20210802001724682

image-20210802002331010

function._global()返回所有属性以及值,这个返回太长了,得好几百条

image-20210802002418431

image-20210802002621093

subprocess模块很强大。

image-20210802002707635

现在我们掌握了足够多的补充知识,来读图中这行红色代码,就是用file 方法打开/etc/passwd文件。

image-20210802003033744 0802003033744.png)

这里是dir()它和global效果相同,所以这个更好理解!image-20210802003228488

就是列出了一个image-20210802003302677

在这里是元组,也就是一个元组初始时能使用的所有方法或函数。

image-20210802003811357

我们看,如何理解后面init等意思呢,最后写的是system函数,一般都是模块+函数,这种调用才对,所以,前面一大串是不是代替了模块呢,也就是os呢

image-20210802004030168

上图印证了我们的想法,前面一大串就是用来找引入os模块的模块让他来代替os模块,执行os模块下的函数system.

image-20210802004324825

builtins也是非常常用的引入这个模块代表能使用一些内置函数。出题人可能会删除一部分内置函数,所以reload

1
"".__class__.__mro__[-1].__subclasses__()[61].__init__.__globals__['__builtins__']['eval']('__import__("os").system("ls")')

同刚才引入os模块,前面部分是引入builtins模块,然后调用其中的eval函数来执行下面的语句:也就是导入os模块和执行系统命令。

image-20220210011547010

获取类的位置用index

image-20220210011659981

一定要先导入包模块,否则会报错