%0a绕过XSS防御-poc
在基于PCRE实现的正则引擎中,我们常使用“m表示multi-line、s表示single-line”。
multi-line表示按行来匹配正则,可以理解为以换行符为切割,对每行进行正则匹配然后进行or运算出结果。
中single-line的意思是将待匹配的文本视为一行,换行符不再作为“换行”的标志。
这在日常使用中也经常会出现由首尾界定符产生的小bug,比如下面这一个。
<?php if(preg_match('/^a[a-z]+z$/m', $_GET['input'])) { //匹配a开头 z结尾 echo $_GET['input']; }
正则匹配中我们常使用`^`和`$`来界定正则匹配的首尾,但这两个的符号本身的含义其实是代表了“行的开头和结尾”,也就意味着如果你输入一个%0a换行,后面就可以输入任何字符也能完成匹配。
比如上面的代码本身的含义可能是:用户输入一个以a开头,以z结尾的中间可以有若干字母的字符串。但因为指定了m修饰符,导致用户可以传入:
input=abcz%0a<svg%20onload=alert(1)>
来绕过检测。 有些地方是可以有效的。
作者:求知鱼
-------------------------------------------
个性签名:你有一个苹果,我有一个苹果,我们交换一下,一人还是只有一个苹果;你有一种思想,我有一种思想,我们交换一下,一个人就有两种思想。
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
独学而无友,则孤陋而寡闻,开源、分享、白嫖!