四、web5 矛盾
$num=$_GET['num']; //获取参数num
if(!is_numeric($num))// 如果num不是数字
{
echo $num;
if($num==1) //如果num是数字1
echo 'flag{**********}'; //打印flag
}
0x01知识点
- is_numeric()函数判断参数是否为数字的函数
很明显题目中要打印出flag,要参数num不是数字,但是要为1,很矛盾
第二个if判断语句,== 是弱类型比较,等号两边的类型不同会转为相同类型进行比较。与之对应是强类型比较,三个=。
- 弱类型
php中有两种比较的符号 == 和 ===
<?php
$a = $b ;
$a===$b ;
?>
=== 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较
== 在进行比较的时候,会先将字符串类型转化成相同,再比较
注:当涉及到比较数字和字符串时,字符串会被转换成数值并且比较按照数值来进行比较
<?php
var_dump("admin"==0); //true
var_dump("1admin"==1); //true
var_dump("admin1"==1) //false
var_dump("admin1"==0) //true
var_dump("0e123456"=="0e4456789"); //true 0e这类字符串识别为科学技术法的数字,0的无论多少次方都是零,所以相等
?>
0x02实践
(一)md5绕过(Hash比较缺陷)
<?php
if (isset($_GET['Username']) && isset($_GET['password'])) {
$logined = true;
$Username = $_GET['Username'];
$password = $_GET['password'];
if (!ctype_alpha($Username)) {$logined = false;}
if (!is_numeric($password) ) {$logined = false;}
if (md5($Username) != md5($password)) {$logined = false;}
if ($logined){
echo "successful";
}else{
echo "login failed!";
}
}
?>
题目大意是要输入一个字符串和数字类型,并且他们的md5值相等,就可以成功执行下一步语句
一些md5开头是0e的字符串:
QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
md5(‘240610708’) == md5(‘QNKCDZO’)成功绕过!
该题构造url:?num=1’