以一道CTF题目引入对php弱类型的说明:
题目Writeup:
打开题目,提示输入密码
网页源码
发现“PHP-The best language for programming”
想起题目PHP-WEAK-TYPE
根据提示,应该是php弱类型绕过
先查看是不是存在php源码泄露
在http://120.24.215.80:10001/index.php~中发现存在php源码
打开网页源码:view-source:http://120.24.215.80:10001/index.php~
看到了PHP源码:
PHP源码
需要提交md5值与QNKCDZO的md5值相等且不是QNKCDZO的字符
考虑php弱类型,QNKCDZO的md5值开始为0e,比较时化为科学记数法为0
md5为0e开始的字符还有:
240610708
s878926199a
s155964671a
s214587387a
s214587387a
s878926199a
s1091221200a
s1885207154a
输入其中一个,得到flag:
Flag
PS1.0:关于PHP源码泄露:
在URL上常见的几种PHP泄露类型.php~.index.php.swp.index.php.bak.index.php.swo.index.php.svn.index.php.zip.index.php.rar.index.php.txt.index.php.old
PS2.0:关于PHP弱类型
弱类型语言允许将字符看做多种类型,php就是一种弱类型语言
在php语言的==和===比较中
==:先把字符串类型变成相同,再进行比较
===:先判断字符串类型是否相同,再进行比较
(当字符串被当作一个数值来处理时,如果该字符串没有包含’.’,’e’,’E’并且其数值在整形的范围之内,该字符串作为int来取值,其他所有情况下都被作为float来取值,并且字符串开始部分决定它的取值,开始部分为数字,则其值就是开始的数字,否则,其值为0)
在上题中当QNKCDZO的md5值当作数值,其开始部分为0e,会被视作科学计数法,0的所有次方都是0,故,只需找到另一个md5值开始为0e的即可,0与0恒等,所以成功绕过,得到Flag。