一道CTF引起

今天打CTF无意间发现了我原来没怎么注意过的一些问题,特地拿出来记录一下。
一道php代码审计题目如下图:
image

程序员含义是,用get传入参数ac,fn extract()会直接生成一个ac变量,如果不为空再将fn传入的文件名的文件的内容作为字符串并且去除两边的空格返回给$f,当ac传入的变量和f传入的文件内容完全相等的时候(注意)这里是完全相等,就会返回flag.
本题已经知道目录下有一个flag.txt文件内容是flags
所以在url里面构造index.php?ac=flags&fn=flag.txt 可以解决

后来发现了另一道题

如下图:
image
这道题传入的参数是空,全部是空,回去试一下那道题居然不行,很奇怪,看看题目有什么不同,看到了== 和===一个是松散比较一个是严格比较,但是第一道题如果是空和空也会返回真啊,一脸懵逼,后来又发现第一道题对第一个参数的判断条件是empty() 第二个题目是isset(),其实这就是问题所在empty()和isset()究竟有什么区别?

查查资料

image

image

自己也写了一个简单的函数测试一下

image
返回you
image
返回kong
image
返回kong
image
返回kong

总结一下

empty 不仅仅检查变量是不是存在,还会检查变量的值。变量不存在,或者变量存在但是值为’假’,就认为是空。
isset 只会检查变量是不是存在,变量不存在也就是NULL才认为是空,哪怕是“”也会认为存在。