CTFshow web(php特性89-92)

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: [email protected]

@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: [email protected]

@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

希望我的文章对大家有所帮助,谢谢!

相关推荐
拉不动的猪13 分钟前
管理不同权限用户的左侧菜单展示以及权限按钮的启用 / 禁用之其中一种解决方案
前端·javascript·面试
西陵24 分钟前
前端框架渲染DOM的的方式你知道多少?
前端·javascript·架构
小九九的爸爸25 分钟前
我是如何让AI帮我还原设计稿的
前端·人工智能·ai编程
海的诗篇_1 小时前
前端开发面试题总结-JavaScript篇(一)
开发语言·前端·javascript·学习·面试
江城开朗的豌豆1 小时前
eval:JavaScript里的双刃剑,用好了封神,用不好封号!
前端·javascript·面试
Forever Nore1 小时前
前端技能包
前端
江城开朗的豌豆1 小时前
JavaScript篇:前端定时器黑科技:不用setInterval照样玩转循环任务
前端·javascript·面试
书中自有妍如玉1 小时前
.net 使用MQTT订阅消息
java·前端·.net
江城开朗的豌豆2 小时前
JavaScript篇:自定义事件:让你的代码学会'打小报告'
前端·javascript·面试
ai产品老杨2 小时前
减少交通拥堵、提高效率、改善交通安全的智慧交通开源了。
前端·vue.js·算法·ecmascript·音视频