[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就可以绕过了