SSTI原理解析
SSTI(Server-Side Template Injection),服务端模板注入。 一、预备知识1.模板引擎模板引擎(特指web端的模板引擎)是为了分离用户界面和业务数据产生的,通过生成特定格式的文档,利用模板引擎生成前端的html代码,只需要获取用户数据放入渲染函数里即可生成模板+用户数据的前端页面呈现给用户浏览器。 2.SSTI现如今的一些框架,像python的flask,php的thinkphp,java的spring等一般都是使用成熟MVC模式: 用户的输入先进入Controller控制器 根据请求类型和请求指令发送到对应Model业务模型进行业务逻辑判断和数据库存取 将结果返回到View视图层,经过模板渲染后展现给用户 而SSTI漏洞成因就是因为服务端接收用户输入后,未做任何处理就将其作为Web应用模板内容的一部分,模板引擎进行目标编译渲染时,执行了用户输入的恶意语句,从而导致敏感信息泄露、RCE、getshell等问题。 二、常见SSTI问题1.python中的ssti-jinja2示例代码1234567891011121314from flask...
收集一个rc4加密的脚本
12345678910111213141516171819202122232425262728293031323334import base64from urllib import parsedef rc4_main(key = "init_key", message = "init_message"): s_box = rc4_init_sbox(key) crypt = str(rc4_excrypt(message, s_box)) return cryptdef rc4_init_sbox(key): s_box = list(range(256)) j = 0 for i in range(256): j = (j + s_box[i] + ord(key[i % len(key)])) % 256 s_box[i], s_box[j] = s_box[j], s_box[i] return s_boxdef rc4_excrypt(plain,...
原型链污染-概念解析
JavaScript语言的继承不通过class,而是通过原型对象(prototype)实现。 一、构造函数JavaScript通过构造函数来生成新对象,构造函数相当于模板的作用。实例对象的属性和方法定义在构造函数中。 12345678910111213function student(name, ID){ this.name = name; this.ID = ID;}var student1 = new student("cyt", "20231")var student2 = new student("zpc",...
PHP简单代码审计(1)
CTF复习-PHP代码简单审计12345678910111213function is_trying_to_hak_me($str){ $blacklist = ["' ", " '", '"', "`", " `", "` ", ">", "<"]; if (strpos($str, "'") !== false) { if (!preg_match("/[0-9a-zA-Z]'[0-9a-zA-Z]/", $str)) { return true; } } foreach ($blacklist as $token) { if (strpos($str,...
NSSRound#28 Team
ez_php进来就是几个绕过执行文件包含到level2.php 传入POST变量a,b,GET变量password,检测password是不是数字,又检测它是不是123456,因为是弱类型,直接传password=123456a即可。最后的file用伪协议即可 对于下面的有两种方法: 数组绕过 a[]=1&b[]=2 MD5碰撞 这里我是直接用yakit读我的文件,也可以用fastcoll生成后自己将文件里面的拿出来,方法在我的博客里面。 这里进到第二层。其实这里有一个非预期,可以直接从这里读到根目录的flag base64解码后得到flag。 预期解应该是进到level2.php里面,然后绕过waf执行rce。 这里过滤了大小写字母、^、等符号,一般来说无字母数字RCE有三种方法,异或(^),取反(),自增($),这里用到自增 payload: 长度118,小于120,传入post变量的时候记得url编码
PHP中的自增
自增php是弱语言,单字符型变量自增能得到下一个字符,且单个或多个下划线_也可以作为变量名,自增操作可以通过使用++符号来完成 这里我们没给$_赋值,它会给自己赋值NULL=0,这时输出的就是1 当我们获得A时,就可以通过自增获得所有大写字母 那我们怎么获得我们的第一个字母呢? 数组转字符串后是天然的字符串 Array,我们切片取第一个字符,就得到A $++:此时是$,下一步的值才是$+1 ++$_:此时是$__+1 这个自增还可以继续增加,如果超过26个了呢? 可以看到,A-Z之后就是AA-AZ,然后BA-BZ,至于有没有极限,我还没有深究 此时我们可以通过构造执行传参命令的payload assert($_POST[_])





