PHP弱类型
php是一种弱类型语言,对数据的类型要求并不严格,可以让数据类型互相转换。
在php中有两种比较符号: ==和===
- == :弱等于。在比较前会先把两种字符串类型转成相同的再进行比较。它不会比较变量类型,只比较值。
- === :强等于。在比较前会先判断两种字符串类型是否相同再进行比较,如果类型不同直接返回不相等。既比较值也比较类型。
PHP转换规则
- 若一个数字和一个字符串进行比较或者进行运算时,PHP会把字符串转换成数字再进行比较
- 若字符串以数字开头,则取开头数字作为转换结果,不能转换为数字的字符串或null,则转换为0
- eg:”admin”是不能转换为数字的字符串,而”123”或”123aa”就是可以转换为数字的字符串)
- 布尔值true和任意字符串都弱相等
var_dump(12=="12") //true var_dump(12=="12aa") //true var_dump( "admin"==0) //true var_dump(false==""==0==NULL) //true var_dump(true=="hyuf") //true
题目
$num=$_GET['num']; if(!is_numeric($num)) { echo $num; if($num==1) echo 'flag{******}'; }
流程
使用$定义一个变量$numis_numeric() 函数用于检测变量是否为数字或数字字符串,如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,注意浮点型返回空值,即 FALSE
flag在第二个条件中
在第一个if语句,如果输入为数字,则打印输入的数字,不打印flag
所以我们要执行第二个if语句,所以不能单纯输入数字,否则会执行第一个if语句
为满足判断条件2,根据上述转换规则,输入的数字为1+非数字字符则满足判断条件2打印出flag

PHP文件包含
- web 应用采用 include()、include_once()、require()、require_once()等文件包含函数,并且需要包含的文件路径是通过用户传输参数的方式引入;
- 用户能够控制包含文件的参数,被包含的文件可被当前页面访问;
题目
<?php include "flag.php"; $a = @$_REQUEST['hello']; eval( "var_dump($a);"); show_source(__FILE__); ?>
Include():包含并运行指定的文件,只有在程序执行到include时才包含文件,且当包含文件发生错误时,程序警告,但会继续执行。此时包含文件为flag.php$_REQUEST["参数"],此时参数为hello,此时用于提供给用户输入eval()函数可将字符串转换为代码执行,并返回一个或多个值,此时用于执行我们想要的命令var_dump()的功能是输出变量的信息,此时用于将运行结果输出给我们看show_source()函数,可以使用show_source('flag.php')直接查看flag.php页面如何查看flag.php文件
通过Linux的系统命令
cat flag.php查看文件
通过php函数show_source()函数直接查看大体流程
- 使用php函数→用户输入→php函数转换→执行操作系统命令→获取flag
- php函数直接查看flag
本题定义了一个变量
$a,以及赋一个用户可控的参数hello给$a,我们利用可控参数hello找到我们的flag,传值过程(hello→a→eval)eval函数将用户的输入转化为代码执行(执行系统命令)从而通过执行系统命令查看我们的flag.php文件因为已知页面有
show_source()函数,可以使用show_source('flag.php')直接查看flag.php页面
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至1694933467@qq.com