由一道ISCC2018-web学习php弱类型

引言

做了很多web题有关于PHP弱类型,而且最近正好ISCC2018也有一道PHP弱类型的题,题目不难,借此题浅析一下PHP弱类型,也作为自己的学习笔记。

题面

php是世界上最好的语言

<html>
<body>
<form action="md5.php"  method="post" >
    用户名:<input type="text" name="username"/>
    密码:<input type="password" name ="password"/>
    <input type="submit" >
</body>
</html>
<?php
header("content-type:text/html;charset=utf-8");
if(isset($_POST['username'])&isset($_POST['password'])){
    $username = $_POST['username'];
    $password = $_POST['password'];
}
else{
    $username="hello";
    $password="hello";
}
if(md5($password) == 0){
    echo "xxxxx";
}


show_source(__FILE__);
?>

题解

分析源码可知:

  1. 需要post usernamepassword
  2. 检测password的MD5,如果== 0则显示一段内容(可知是flag)

此题重点在于2.,则提交username任意输入,passwordQNKCDZO,提交后进入下一个环节,得到源码:

include 'flag.php';
$a = @$_REQUEST['a'];
@eval("var_dump($$a);");

可知需要提交参数a,赋值给变量$a,并打印变量$$a的类型和值,如:提交参数a=test,则$a=test,$$a=$test,所以打印出变量$test的类型和值。

这里就要用到PHP的超全局变量$GLOBALS。PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。所以提交参数a的值为GLOBALS,即可打印出PHP 脚本中所有变量的类型和值。
所以在URL中提交a=GLOBALS,即可get flag。


PHP弱类型比较知识点

php中有两种比较的符号 == 与 ===

  • === 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较
  • == 在进行比较的时候,会先将字符串类型转化成相同,再比较
  • 如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行
<?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 
?>  

1.字符串“admin”与数值0比较,先将admin强制转化成数值,由于“admin”是字符串,不包含数字,所以转化结果为0,随意和数值0相等
2.字符串“1admin”包含数字1,强制转化为数值即1,所以==1。
3.“admin1“==1 却等于错误,也就是”admin1”被转化成了0

字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。

4.”0e123456”==”0e456789”相互比较的时候,会将0e这类字符串识别为科学技术法的数字,0的无论多少次方都是零,所以相等

所以上述题目的思路就是提交password,使password字符串的MD5值强制转换后与0相等,所以password的MD5值应以0e开头,即字符串QNKCDZO

下面提供一些MD5以0e开头的字符串:

QNKCDZO
0e830400451993494058024219903391

s878926199a
0e545993274517709034328855841020

s155964671a
0e342768416822451524974117254469

s214587387a
0e848240448830537924465865611904

s214587387a
0e848240448830537924465865611904

s878926199a
0e545993274517709034328855841020

s1091221200a
0e940624217856561557816327384675

s1885207154a
0e509367213418206700842008763514
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值