跳转至

每日一题 —— [PolarCTF]swp

题目地址:https://www.polarctf.com/#/page/challenges

请西电的朋友们记得:做这类信息收集的题目时关掉校园网,打开你的手机热点。因为校园网似乎会屏蔽任何后缀名为 .swp .zip 之类的 url, 从而导致你只能无穷尽地看见“连接已重置”的字样。

打开题目,提示 true .swp file? 可以得知,这是一道 swp 泄漏问题。我们直接访问 /.index.php.swp 下载到缓存文件,从而看到 index.php 的源码如下:

function jiuzhe($xdmtql) {
    return preg_match('/sys.*nb/is',$xdmtql);
}
$xdmtql=@$_POST['xdmtql'];
if(!is_array($xdmtql)) {
    if(!jiuzhe($xdmtql)) {
        if(strpos($xdmtql,'sys nb')!==false) {
            echo 'flag{*******}';
        } else {
            echo 'true .swp file?';
        }
    } else {
        echo 'nijilenijile';
    }
}

观察得知,想要获得 flag, 我们需要 post 一个 xdmtql 的参数,这个参数内必须要有 sys nb 这个字符串。但是呢又必须绕过 preg_match 的限制。这里我们有一个技巧叫做正则绕过.

正则绕过

正则绕过的原理就是,对于 php 中的 preg_match 函数,他因为会不断进行回溯递归的正则匹配,消耗大量的资源,所以当传入的字符串长度超过一定的限制的时候,就会直接返回一个 false,这个长度限制就是 100 万个字符

知道了这个前提,我们这道题就思路明确了:只要开头有一个 sys nb 打头,然后后面跟上 100 万个字符就行。

POST:
xdmtql=sys nbaaaaaaaaaaaa(a*a000000)

至于如何生成 100 万个字符,我们只需要利用 php 的 str_repeat 函数生成,然后在浏览器里打开就行了。

<?php
echo str_repeat('a', 1000*1000);

最后得到 flag.


文章热度:0次阅读