BugKu No one knows regex better than me
Posted 山川绿水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BugKu No one knows regex better than me相关的知识,希望对你有一定的参考价值。
BugKu——No one knows regex better than me
一、解题思路
1.绕过第一层循环匹配
将源代码挡下来,在本地测试
<?php
$second =$_REQUEST['second'];
if(preg_match_all("/Yeedo|wants|a|girl|friend|or|a|flag/i",$second)){
echo '匹配成功!';}
else
echo '匹配失败!';
?>
本地搭建的方式也是,使用request的请求方式,因为get的方式比较简单,就直接使用get的请求方式
上述代码主要使用的是preg_match_all()函数匹配,其中只要我们在变量second中含有Yeedo,wants,a,girl,friend,or,a,flag等字符就可以匹配成功。
2.绕过第二层循环匹配
<?php
$key =$_REQUEST['key'];
if(preg_match("/\\.\\.|flag/",$key)){
die("Noooood hacker!");
}
else
echo "跳出匹配!";
?>
这个循环使用的是preg_match()匹配函数
只要我们传入的参数中不要有flag或两个连续的点(…)时,即可跳出匹配,这两里的话输入单个点的话,会被转义
而当我们输入两个点时,被转译了一个剩下一个就会被匹配到
在线base64加解密
因为后面提到base64解密,我们可以选择使用base64加密的方式,进行绕过
3.绕过第三层循环匹配
<?php
$third=$_REQUEST['third'];
if(preg_match("/\\\\|\\056\\160\\150\\x70/i",$third)){ ##\\数字八进制;##\\x十六进制;
echo '匹配成功!';
}
else
echo '匹配失败!';
?>
这里有两个反斜杠(\\),而php在解析字符串的过程中,会把两个反斜杠(\\)转换成一个(),所以这里的管道符(|)没有被解析,就会和后面的编码组合成被匹配的对象
在Php和Python中的编码中
(\\+数字)
-------->属于八进制编码
(\\x+数字)
------->属于十六进制编码
后面的编码,转换出来就是——.php
绕过三层循环后,构造payload为:
http://114.67.246.176:12532/?zero=ZmxhZw==&first=aaaa|.php
二、知识点总结
1.涉及到的函数
·preg_match_all()函数
·preg_match()函数
·base64_decode()函数
2.请求方式
GET
POST
REQUEST
三、PS
这类型的题目,属于代码审计,从这道题中我学会了使用本地测试的方式,构造payload,就是要大胆的去尝试,没有人天生就会的,报错了,失败了,不要气馁,坚持自己的选择,总有一天会成功的!
如果上述博客中存在错误,请大佬批评指正。
以上是关于BugKu No one knows regex better than me的主要内容,如果未能解决你的问题,请参考以下文章