CTFshow web(php特性93-96)

                                                                      web93

<?php

/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 16:32:58
# @link: https://ctfer.com

*/

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){
        die("no no no!");
    }
    if(preg_match("/[a-z]/i", $num)){
        die("no no no!");
    }
    if(intval($num,0)==4476){
        echo $flag;
    }else{
        echo intval($num,0);
    }
}

知识点:

进制转换
除了将十进制数转化为整数之外,intval() 函数还可以实现不同进制之间的转换(2进制、8进制、16进制)。在这种情况下,需要显式指定 $base 参数的值。例如:

echo intval('1100', 2); // 12(二进制)

echo intval('14', 8); // 12(八进制)

echo intval('C', 16); // 12(十六进制)

还有一个比较特殊,

如果intval第二个参数是0,,那么你就可以自由根据你的需求去谢你需要的进制

比如

?c=0x117c(十六进制)

?c=010574(八进制)

其实就是进制表示的方法

知识点内容来自:

一篇文章带你搞定php里面intval函数的应用-CSDN博客x

我的文章都写有的,如果要系统学习点进去就好了。

这里进制转化法直接饶过弱相等,但是不能出现字母,那就用八进制嘛

payload:?num=010574

                                                                        web94

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 16:46:19
# @link: https://ctfer.com

*/

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==="4476"){
        die("no no no!");
    }
    if(preg_match("/[a-z]/i", $num)){
        die("no no no!");
    }
    if(!strpos($num, "0")){
        die("no no no!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
}

知识点:

弱等于大致有以下的几种:

1.小数点:

1==1.0000

2.正号:

2==+2

3.单双引号:

3==“3”

4.科学计数法:

3aaa==3

5.MD5;比如:

由于 MD5 可以将数据映射到一个唯一的散列值,因此可以使用强类型比较符 === 来进行强相等的判断。例如:

<?php
$str1 = "Hello, world!";
$str2 = "hello, world!";

$hash1 = md5($str1);
$hash2 = md5($str2);

if ($hash1 === $hash2) {
  echo "两个字符串的 MD5 散列值相等";
} else {
  echo "两个字符串的 MD5 散列值不相等";
}


上述代码中,虽然 $str1 和 $str2 的值不相同,但是它们的 MD5 散列值都是 "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",输出结果为 "两个字符串的 MD5 散列值不强相等"。

这里给大家找了两个MD5解密后以0e开头的一串数字:

然后下面是MD5后以0e开头的数字,是弱相等的

a=MMHUWUV&b=QNKCDZO

6. 布尔值true和任意字符串都弱相等

7.进制转化法弱相等(很鸡肋,实战之中建议拿来绕过弱相等)

<?php

$a = "4476";
$b = 010574;

if ($a == $b) {
  echo "相等";
} else {
  echo "不相等";
}


上述代码是相等的,因为0开头就是八进制的典型特征,所以经过转化后两者数值相等,没有问题。但是在网页上提交的数据是以字符串的形式传递给服务器的,包括数字。所以哪怕当你以 "?num=134233" 这样的形式提交数据时,在服务器端接收到的数据类型仍然是字符串。所以上面的代码就变成了”010574“==”4476“(现在这个是错误的),因为”010574“是个字符串,所以直接变成010576!=4476

以上内容来自文章:PHP强相等&弱相等(附带科学计数法)_php 科学计数法-CSDN博客

如果掌握不够好,可以点进去读几分钟,就会有深刻了解了。

这里还是不能匹配到字母,而且要绕过强相等,思路肯定是使用进制转化法的,不然会匹配到字母的,还是?num=010574但是提交的时候当成字符串了对面也是字符串,直接转化后强相等了,这里其实很简单,只要在前面加点啥的,别让他们强相等就好了,绕过强相等直接在前面加个+或者空格或者%0a(换行符)

payload:?num=+010574

                                                                web95

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 16:53:59
# @link: https://ctfer.com

*/

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){
        die("no no no!");
    }
    if(preg_match("/[a-z]|\./i", $num)){
        die("no no no!!");
    }
    if(!strpos($num, "0")){
        die("no no no!!!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
}

这里不能匹配字母,弱相等4476,所以还是同样的思路,进制转化,?num=010574

但是

第三个if绕不过,原因是这样的:

  • strpos($num, "0")会在$num中查找字符"0"的首次出现。在这个例子中,"0"位于字符串的起始位置(索引0)。
  • 根据strpos()函数的行为,它将返回字符"0"首次出现的位置索引,即0。
  • 由于strpos()返回了0,当使用非操作符!时,会有一个逻辑陷阱。在PHP中,数字0被视为布尔值FALSE。因此,尽管strpos()实际上找到了字符"0",但是由于它的返回值(0)在逻辑判断中等同于FALSE!strpos($num, "0")的结果会被评估为TRUE
  • 这导致if条件被满足,执行die("no no no!!!");,脚本输出"no no no!!!"并终止。

      糟了,那接下怎么办?这不就断了思路了吗?

    哈哈哈,还是直接像上一题一样加上+在前面不就好了嘛!

payload:?num=+010574

?num=%0a010574

?num= 010574(空格放在0前面)

                                                                web96

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 19:21:24
# @link: https://ctfer.com

*/


highlight_file(__FILE__);

if(isset($_GET['u'])){
    if($_GET['u']=='flag.php'){
        die("no no no");
    }else{
        highlight_file($_GET['u']);
    }


}​​​​​​​

知识点:

在计算机文件系统中,... 是两个特殊的目录项,它们分别代表当前目录和上一级目录。当这些符号用在文件路径中时,它们可以帮助指定相对路径。

  • .(单点)代表当前目录。所以,当你看到像 ./ 这样的路径时,它指的是“从当前目录开始”的意思。使用 ./ 可以明确表示一个文件或脚本是在当前目录下,尤其是在需要执行当前目录下的脚本或程序时非常有用。例如,在命令行中,你可能需要输入 ./script.sh 来执行当前目录下名为 script.sh 的脚本,这里的 ./ 告诉系统从当前目录查找该脚本。

  • ..(双点)代表父目录,也就是当前目录的上一级目录。使用 ../ 可以访问当前目录的父级目录中的文件或目录。例如,如果你想从当前目录访问其父目录中的一个文件,可以使用类似 ../file.txt 的路径。

这些符号使得文件系统的导航更加灵活,允许用户和程序在不同目录之间建立相对引用,而无需指定绝对路径。这在编写可移植脚本或应用时特别有用,因为你无需假设文件的绝对位置,只需根据当前工作目录的相对位置来指定路径。

payload:

?u=./flag.php

真诚地希望我的文章能够帮助大家,谢谢!

​​​​​​​

  • 23
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值