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
真诚地希望我的文章能够帮助大家,谢谢!