web89
<?php
/*
-*- coding: utf-8 -*-
@Author: h1xa
@Date: 2020-09-16 11:25:09
@Last Modified by: h1xa
@Last Modified time: 2020-09-18 15:38:51
@email: h1xa@ctfer.com
@link: https://ctfer.com
*/
include("flag.php");
highlight_file(FILE);
if(isset($_GET['num'])){
$num = $_GET['num'];
if(preg_match("/[0-9]/", $num)){
die("no no no!");
}
if(intval($num)){
echo $flag;
}
}
知识点:
intval ( mixed $var [, int $base = 10 ] ) : int
有一点很重要,intval()用于获取变量的整数值。
intval()不能用于object和array,否则会产生E_NOTICE错误并返回1。
其中 var 表示需要被转换的变量,base 表示需要转换的进制数,缺省为10进制,即默认情况下,$base 的值为10。
下面我们来看一下 intval() 函数的用法和一些注意事项:
转换规则
如果 $var 是一个浮点数,intval() 函数会将其舍弃小数部分并返回整数部分。
如果 $var 是一个字符串,intval() 函数会尝试将其转换为整数。如果字符串以数字开头,则转换为对应的整数;否则返回0。
如果 $var 是一个布尔值,intval() 函数会将其转换为整数。true 转换为1,false 转换为0。
如果 $var 是一个数组或对象,intval() 函数会返回0。
详情请看:
一篇文章带你搞定php里面intval函数的应用-CSDN博客
payload:?num[]=;
web90
<?php
/*
-*- coding: utf-8 -*-
@Author: h1xa
@Date: 2020-09-16 11:25:09
@Last Modified by: h1xa
@Last Modified time: 2020-09-18 16:06:11
@email: h1xa@ctfer.com
@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(intval($num,0)===4476){
echo $flag;
}else{
echo intval($num,0);
}
}
知识点:
弱等于主流大致有以下的几种:
1.小数点:
1==1.0000
2.正号:
2==+2
3.单双引号:
3=="3"
4.科学计数法:
3aaa==3
5.MD5;比如:
由于 MD5 可以将数据映射到一个唯一的散列值,因此可以使用强类型比较符 === 来进行强相等的判断。
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博客
这里只要是强相等就不行,那就弱相等呗,直接照搬:
payload:?num=+4476或者?num=4476lskjasdljkadj
web91
<?php
/*
-*- coding: utf-8 -*-
@Author: Firebasky
@Date: 2020-09-16 11:25:09
@Last Modified by: h1xa
@Last Modified time: 2020-09-18 16:16:09
@link: https://ctfer.com
*/
show_source(FILE);
include('flag.php');
a=_GET['cmd'];
if(preg_match('/^php$/im', $a)){
if(preg_match('/^php$/i', $a)){
echo 'hacker';
}
else{
echo $flag;
}
}
else{
echo 'nonononono';
}
if(preg_match('/^php$/im', a)){这里的意思就是只要识别到php无论大小写都可以,而m的意思是可以多行识别, if(preg_match('/\^php/i', $a)){这里没有m,不能多行识别,所以给前面加个%0a(换行符)就拿到flag
payload:?cmd=%0aphp
web92
<?php
/*
-*- coding: utf-8 -*-
@Author: Firebasky
@Date: 2020-09-16 11:25:09
@Last Modified by: h1xa
@Last Modified time: 2020-09-18 16:29:30
@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(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博客
这里要绕过弱等于直接拿出进制转化就好
payload:
?num=010574
希望我的文章对大家有所帮助,谢谢!