
文件包含,php伪协议读取next.php

<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;
function complex($re, $str) {
return preg_replace('/(' . $re . ')/ei','strtolower("\\1")',$str);
}
foreach($_GET as $re => $str) {
echo complex($re, $str). "\n";
}
function getFlag(){
@eval($_GET['cmd']);
}
preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])
关于preg_match的/e(在 PHP 5.5.0 之后,e
修饰符被弃用,在 PHP 7.0.0 中完全被移除,用于5.5到5.6的php版本)模式会将replacement中的字符串当作php代码执行
strtolower("\\1"),表示将preg_replace的第一个捕获组进行小写,每一个()为一个捕获组
在""中的字符串会被php解析,故应使\\1为getFlag(),由于pattern是我们传入的,故可以写为\S*匹配所有,replacement写入${getFlag()}执行函数传入cmd获得flag
参考文章:
Comments NOTHING