[FBCTF2019]RCEService

知识点1:

preg_match()只匹配单行数据,利用%0a绕过,看一个例子:

<?php
$a=urldecode('%0aflag');
if(preg_match('/^.*(flag).*$/',$a)){
    echo '匹配到了';
}
else 
    echo "没匹配到";
?>

运行会输出没匹配到,这适合传参是get传参,因为%0a经过urldecode后会变成换行符,preg_match()匹配的第一行就空了,开头加一个%0a,能绕过/^  /的检测。

how about /   $/   ?

see an example:

<?php
$a=urldecode('flag%0a');
if(preg_match('/^.*(flag).*$/',$a)){
    echo '匹配到了';
}
else 
    echo "没匹配到";

?>

运行会输出匹配到了,字符串末尾加一个换行符,应该是preg_replace()会把字符串末尾的换行符去掉,利用这个特性可以绕过一些题目中的代码,比如:

if(preg_match('/^flag$/',$_GET['a']&&$_GET['a']!=='flag')){
echo $flag
}

这种情况?a=flag%0a就可以绕过了

 

posted @ 2022-07-02 12:33  Galio  阅读(94)  评论(0编辑  收藏  举报