首页 > 编程语言 >php NFA灾难回溯

php NFA灾难回溯

时间:2025-01-10 11:43:47浏览次数:1  
标签:function name NFA Smarty 回溯 php data

正则分为NFA和DFA两种,而php中使用的是NFA.php通过pcre.backtrack_limit来限制回溯次数,如果超过了这个限制,就会返回false.pcre.backtrack_limit默认值是100万.
因此我们可以通过传入大量的垃圾字符或是触发灾难性回溯来超过限制,从而绕过preg_match.
除此以外,在进行文件上传类题目的时候,也可以通过设置apache下的.htaccess文件来修改这个限制,从而实现绕过木马的waf.

php_value pcre.backtrack_limit 0
php_value pcre.jit 0

[HMGCTF2022]Smarty Calculator

首先www.zip泄露,得到源码,发现使用了Smarty框架.发现处理逻辑包括如下.

function waf($data){
  $pattern = "php|\<|flag|\?";
  $vpattern = explode("|", $pattern);
  foreach ($vpattern as $value) {
        if (preg_match("/$value/", $data)) {
		  echo("<div style='width:100%;text-align:center'><h5>Calculator don  not like U<h5><br>");
          die();
        }
    }
    return $data;
}

if(isset($_POST['data'])){
  if(isset($_COOKIE['login'])) {
      $data = waf($_POST['data']);
      echo "<div style='width:100%;text-align:center'><h5>Only smarty people can use calculators:<h5><br>";
      $smarty->display("string:" . $data);
  }else{
      echo "<script>alert(\"你还没有登录\")</script>";
  }
}

存在Smarty模板注入漏洞.打了一发{$smarty.version}发现版本是3.1.39.使用payload去进行攻击没有成功.发现给出了Smarty目录,这里面估计会有问题.从网上找到了Smarty源文件Smarty使用winmerge比较发现:

源码中过滤的逻辑被修改了.

if (preg_match('/[a-zA-Z0-9_\x80-\xff](.*)+$/', $_name)) {
            $compiler->trigger_template_error("Function name contains invalid characters: {$_name}", null, true);
        }

因此原本的payload打不通.分析正则可以发现(.*)+会导致匹配的灾难性回溯,由于.不能匹配\n,因此可以使用%0A来触发.网上得到的payload如下.

data={function+name='rce(){};system("id");function%0A%0A'}{/function}

成功绕过匹配,进行模板注入.然而这里我并不是完全的理解,我构造的payload为什么打不通.

string:{function+name='rce(){};system("id");function+'}{/function}%0A%0A2

标签:function,name,NFA,Smarty,回溯,php,data
From: https://www.cnblogs.com/meraklbz/p/18663699

相关文章

  • php反序列化
    一、序列化和反序列化1.什么是序列化和反序列化序列化(Serialization):把对象转换为字符串进行存储的过程反序列化(DeSerialization):把存储的字符串恢复为对象的过程2.应用场景:当对象需要被网络传输时当对象状态需要被持久化时3.序列化函数和反序列化函数:①序列化:seria......
  • 如何修改PHP最大文件上传大小限制
    默认情况下,PHP上传文件大小限制是2M,超过2M上传将会报错。如果我们上传的图片或压缩包超过2M,需要修改PHP的配置文件最大上传限制。找到PHP组件目录下的php.ini文件,使用记事本打开,查找post_max_size(允许POST数据大小)值修改成10M或更大,查找upload_max_filesize(允许上传文件大小)值,可......
  • 如何在服务器上查看当前运行的PHP版本?
    要查看主机当前运行的PHP版本,您可以按照以下步骤操作。这种方法简单且适用于大多数Web服务器环境。步骤描述1创建一个新的PHP文件,例如info.php。2在文件中添加以下代码: php<br>phpinfo();<br>3将该文件上传到您的Web服务器的根目录。4在浏览器中访问h......
  • 穷举vs暴搜vs深搜vs回溯vs剪枝系列一>字母大小写全排列
    题目:  解析:  代码: privateList<String>ret;privateStringBufferpath;publicList<String>letterCasePermutation(Strings){ret=newArrayList<>();path=newStringBuffer();dfs(s,0);return......
  • 小九源码-php001-基于PHP的高校毕业生就业服务平台
    ......
  • php8.1新特性
        php8.0到php8.1增加了不少新特性,大部分只是做了小的一些调整,接下来我们将会学习在项目中经常用到或者说比较具有意义的新特性。 一、枚举      枚举可以算得上是“千呼万唤始出来”,在这之前我们可以看到很多php程序员在社区、论坛这些地方表达了对枚......
  • 提升 PHP 编码效率的 10 个实用函数
    PHP开发者始终追求更简洁、高效的代码。幸运的是,PHP提供了丰富的内置函数,能显著减少手动编码,提升开发效率。无论经验深浅,掌握这些函数的使用技巧都至关重要。以下列出了10个可以显著加快您的编码过程的PHP函数:1、array_map()array_map() 当需要对数组每个元素执行相同......
  • windows下php安装依赖版本工具composer
    1.先把php加入到环境变量 2.直接下载composer.phar,地址:https://dl.laravel-china.org/composer.phar把下载的composer.phar放到PHP安装目录  命令下载: php-r"copy('https://getcomposer.org/installer','composer-setup.php');"phpcomposer-setup.phpphp......
  • (免费源码)计算机毕业设计必学必看 万套实战教程 java、python、php、node.js、c#、APP
    摘 要随着互联网时代的到来,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个B/S结构的中医病案管理系统,会使;中医病案管理系统的管理工作系统化、规范化,也会提高平台形象,提高管理效率。本系统是针对目前中医病案管理系统的实际需求,从实际工作出发,对过......
  • (免费源码)计算机毕业设计必学必看 万套实战教程 java、python、php、node.js、c#、APP
    摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,志愿服务管理小程序被用户普遍使用,方便用户能够可以随时进行在线查看志愿服务管理的数据信息管理,特开发了志愿服务管理......