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
函数。
后构造代码如图:成功执行代码,并列出目录后在目录中列出文件:即得到flag