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

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

​​​​​​​

相关推荐
老华带你飞5 分钟前
公寓管理系统|SprinBoot+vue夕阳红公寓管理系统(源码+数据库+文档)
java·前端·javascript·数据库·vue.js·spring boot·课程设计
yttandb12 分钟前
重生到现代之从零开始的C语言生活》—— 内存的存储
c语言·开发语言·生活
我明天再来学Web渗透16 分钟前
【hot100-java】【二叉树的层序遍历】
java·开发语言·数据库·sql·算法·排序算法
gopher951122 分钟前
HTML详解
前端·html
Tiny201723 分钟前
前端模块化CommonJs、ESM、AMD总结
前端
吕永强24 分钟前
CSS相关属性和显示模式
前端·css·css3
结衣结衣.29 分钟前
python中的函数介绍
java·c语言·开发语言·前端·笔记·python·学习
全栈技术负责人30 分钟前
前端提升方向
前端
赵锦川31 分钟前
css三角形:css画箭头向下的三角形
前端·css
茫茫人海一粒沙32 分钟前
Python 代码编写规范
开发语言·python