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的主要内容,如果未能解决你的问题,请参考以下文章

bugku-writeup-web-文件包含

Bugku——flag在index里面

bugku flag在index里

BugKu 杂项-这么多数据包

no one与none的区别

18/09/26-2-BugKu-逆向-easy100(LCTF)