一道CTF引起一道php代码审计题目如下图:
程序员含义是,用get传入参数ac,fn extract()会直接生成一个ac变量,如果不为空再将fn传入的文件名的文件的内容作为字符串并且去除两边的空格返回给$f,当ac传入的变量和f传入的文件内容完全相等的时候(注意)这里是完全相等,就会返回flag.
本题已经知道目录下有一个flag.txt文件内容是flags
所以在url里面构造index.php?ac=flags&fn=flag.txt 可以解决 后来发现了另一道题如下图:
这道题传入的参数是空,全部是空,回去试一下那道题居然不行,很奇怪,看看题目有什么不同,看到了== 和===一个是松散比较一个是严格比较,但是第一道题如果是空和空也会返回真啊,一脸懵逼,后来又发现第一道题对第一个参数的判断条件是empty() 第二个题目是isset(),其实这就是问题所在empty()和isset()究竟有什么区别? 查查资料自己也写了一个简单的函数测试一下
返回you
返回kong
返回kong
返回kong 总结一下empty 不仅仅检查变量是不是存在,还会检查变量的值。变量不存在,或者变量存在但是值为’假’,就认为是空。
isset 只会检查变量是不是存在,变量不存在也就是NULL才认为是空,哪怕是“”也会认为存在。
PHPempty()和isset()比较
|