php弱类型

题目:php是世界上最好的语言1

介绍:php是世界上最好的语言网址,(http://way.nuptzj.cn/php/index.php)

1,我们打开页面,说是   Can you authenticate to this website? index.txt,把index.php改成index.txt,然后我们可以看到了php代码。

2,php代码:<?php if(eregi("hackerDJ",$_GET[id])) { echo("<p>not allowed!</p>"); exit(); } $_GET[id] = urldecode($_GET[id]); if($_GET[id] == "hackerDJ") { echo "<p>Access granted!</p>"; echo "<p>flag: *****************} </p>"; } ?>   ,这道题目的问题在于urldecode(),我们可能认为传递过来的$_GET[id]没有进行url编码,但是实际上已经经过了url的编码。那么这道题目只需要将id=hackerDJ进行两次url编码即可。

题目:php是世界上最好的语言2

介绍:php是世界上最好的语言,这道题考察php弱类型,网址(http://45.63.58.62:8088/xedni.php

1,首先我们查看源代码,可恶意看到php代码:<?php if(isset($_GET["password"]) && md5($_GET["password"]) == "0") echo file_get_contents("/opt/flag.txt"); else echo file_get_contents("xedni.php"); ?> ,我们看到是两个   ==  ,(在php里面   ==   比较只比较值,不同类型会转换为同一类型比较。要比较类型用   ===   ,必须值和类型都一样才为true)

2,然后就是md5怎么得到0的问题,我们知道这个知识点下面就知道怎么做了,我们直接在百度上面找(s878926199a、240610708、QNKCDZO、aabg7XSs、aabC9RqS这几个是我找的,可以用),现在都解决了,

3,我们在原页面输入:?password=s878926199a,这样就能够得到flag了。

接着再给你们来几个这样的题

题目:天网管理系统

介绍:网址(http://ctf5.shiyanbar.com/10/web1/)

1,打开网址后,里面用户名和密码都是admin,点击“登入系统”也没用。做web的php题如果知道源代码就事半功倍,先右键查看源代码,得到先查看源代码,发现<!-- $test=$_GET[‘username‘]; $test=md5($test); if($test==‘0‘) -->,

2,这里要求我们输入一个字符串,经过md5后等于0,这是考验php弱类型。这里我提供4个都可以通过的值:240610708、QNKCDZO、aabg7XSs、aabC9RqS

3,只要在用户名那里输入上面4个值中的任意一个,就会得到提示:/user.php?fame=hjkleffifer4,毫无疑问,我们访问一下,可以看到代码:$unserialize_str = $_POST[‘password‘]; $data_unserialize = unserialize($unserialize_str); if($data_unserialize[‘user‘] == ‘???‘ && $data_unserialize[‘pass‘]==‘???‘){ print_r($flag); } #伟大的科学家php方言道:成也布尔,败也布尔。 回去吧骚年, 这代码不难懂,就是把post提交的password值经过"反序列化"(不懂的百度吧,搜一下php手册关于unserialize()函数的知识)得到一个数组,要求数组里的user和pass都满足就打印flag,这里由于我们不知道两处???到底是什么,我们只得另辟途径,从php弱类型入手,

5,bool类型的true跟任意字符串可以弱类型相等,而当代码中存在unserialize()的时候,我们可以构造bool类型,来达到欺骗。现在我们要的是一个数组,2个元素,分别是user和pass,而且值都是bool类型的true,于是我们得到  a:2:{s:4:"user";b:1;s:4:"pass";b:1;},这是反序列化,这里我详细解释一下吧,

以后就不解释了(a代表array,s代表string,b代表bool,而数字代表个数/长度),所以这里的a代表数组array,2代表有两个参数 user和pass,s代表user是字符串,4,代表user字符串长度是4,b代表是bool类型的,1代表是真。这里面不同的类型用:和;分割开。6,返回最开始的网页,输入上面写的账号密码,登入即可得到flag。

说到反序列化,我又想起来一个题

题目:PHP反序列化

介绍:网址(http://115.28.150.176/php1/index.php)(不知道这个网址现在怎么打不开了,你们知道题型就好)1,这个我们首先会看到代码,<?php class just4fun { var $enter; var $secret; } if (isset($_GET[‘pass‘])) { $pass = $_GET[‘pass‘]; if(get_magic_quotes_gpc()){ $pass=stripslashes($pass); } $o = unserialize($pass); if ($o) { $o->secret = "*"; if ($o->secret === $o->enter) echo "Congratulation! Here is my secret: ".$o->secret; else echo "Oh no... You can‘t fool me"; } else echo "are you trolling?"; } ?>

声明了一个类,这个类里面包含有$enter$secret两个成员,先把传入的$pass参数反序列化,并传参给$o。如果$o->secret === $o->enter,那么久输出所谓的秘密,也就是o->secret。

2,首先获取我们传入的参数,进行反序列化;给$o中的secret赋值;比较$o->secret和$o->enter是否相等。注意这里是 ‘===‘。3,在 PHP 中普通的传值赋值行为有个例外就是碰到对象 object 时,在 PHP 5 中是以引用赋值的,除非明确使用了 clone 关键字来拷贝,PHP 支持引用赋值,使用“$var = &$othervar;”语法。引用赋值意味着两个变量指向了同一个数据,没有拷贝任何东西。4,知道上面所说的,我们就可以把上面的代码改一下了:<?php class just4fun { var $enter; var $secret; } $o = new just4fun(); $o->enter = &$o->secret; //这里是重点。我们使用引用传参的特点,让$o->secret的值和$o->enter的值,这样两个变量就永远相等了 echo serialize($o); ?>

5,序列化字符串为: O:8:"just4fun":2:{s:5:"enter";N;s:6:"secret";R:2;},自己在本地运行代码得到下面图

6,然后把这些复制下来提交后得到flag:nctf{serialize_and_unserialize}。

ps:详细请参考(http://115.159.210.46/archives/19.html),我也是参考的这个。

时间: 2024-10-19 12:53:27

php弱类型的相关文章

php代码审计之弱类型引发的灾难

有人说php是世界上最好的语言,这可能是对开发人员来说,确实有这方面的特点,因为它开发起来不像其他语言那样麻烦,就比如:弱类型,它不需要像java等语言那样明确定义数据类型.这给开发带来了很大的便利,所有的数据类型都可以用$xx来定义,而不需要int i,string a,fload b等等这样去定义它.这样确实很方便,因为php帮助你判断了数据类型,比如整形int ,你只要$a=1;那这个1就是整形,$a='abc'那这个abc就会被php判断为字符串类型.但是弱类型方便是方便,但是带来的安全

强类型 和 弱类型

完全的面向对象要求对象是强类型的.强类型是在编译的时候就确定类型的数据,在执行时类型不能更改,而弱类型在执行的时候才会确定类型. 强类型安全,因为它事先已经确定好了,而且效率高.一般用于编译型编程语言,如 C++, Java, C#, Pascal 等. 弱类型相比而言不安全,在运行的时候容易出现错误,但它灵活,多用于解释型编程语言,如 Javascript, VB 等. 弱类型的轻量化是以牺牲开发的方便性和效率为基础的.它将一部分机器能完成的事情移到程序员来完成.例如开发同样一个功能,如果用

弱类型、强类型、动态类型、静态类型语言的区别是什么?

作者:amalgamation链接:https://www.zhihu.com/question/19918532/answer/21647195来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 1. 先定义一些基础概念 Program Errors trapped errors.导致程序终止执行,如除0,Java中数组越界访问 untrapped errors. 出错后继续执行,但可能出现任意行为.如C里的缓冲区溢出.Jump到错误地址 Forbidden Beh

什么是编程语言的强类型,弱类型

给你来个例子把 弱类型语言vbs: a=1 b=a+"1"+"a" //结果是11a,这里 a 成了字符串 c=a+1 //结果是2 ,这里a则是数字型 强类型语言:c# int a=2 string b=a.ToString()+"1"+"a" int c=a+1 看到了吗?区分大小写,需要实现申明类型外,一个重要的区别是,弱类型的语言的东西没有明显的类型,他能随着环境的不同,自动变换类型 而强类型则没这样的规定,不同类型间

动态语言和静态语言、编译型语言和解释型语言、强类型语言和弱类型语言的分析

一.动态语言和静态语言1. 我们常说的动.静态语言,通常是指: 动态类型语言 Dynamically Typed Language 静态类型语言 Statically Typed Language 可能还有:动.静态编程语言 Dynamic\Statically Programming Language 2.    动态类型语言:在运行期间检查数据的类型的语言例如:Ruby\Python这类语言编程,不会给变量指定类型,而是在附值时得到数据类型.Python是动态语言,变量只是对象的引用,变量a

[JS2] JS是弱类型

1 <html> 2 <head> 3 <title>JavaScript 是弱类型的</title> 4 <Script Language="JavaScript"> 5 <!-- 6 var myVar //声明变量 7 myVar="JavaScript 是弱类型的" 8 alert(myVar) //使用消息框显示变量 9 myVar=3.1415926 //为变量赋不同类型的值 10 ale

MVC 强类型传值Model。和弱类型传值ViewData[&amp;quot;&amp;quot;]。及用EF进行增删查改(母版页的使用)

<1> 控制器 </pre><pre name="code" class="csharp">using MvcTest.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcTest.Controllers { public cla

php 弱类型总结

0x01 前言 最近CTF比赛,不止一次的出了php弱类型的题目,借此想总结一下关于php弱类型以及绕过方式 0x02 知识介绍 php中有两种比较的符号 == 与 === 1 <?php 2 $a = $b ; 3 $a===$b ; 4 ?> === 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较 == 在进行比较的时候,会先将字符串类型转化成相同,再比较 如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行 这里明确了说如果一个

sqlite 的比较等运算是根据不同的值而不同的,并不是根据的字段类型,因为 sqlite 是弱类型字段

-------------------------------------------------- http://www.sqlite.com.cn/MySqlite/5/127.Html 在SQLite3.0版中,值被定义为什么类型只和值自身有关,和列没有关系,和变量也没有关系. (这有时被称作 弱类型.)所有其它的我们所使用的数据库引擎都受静态类型系统的限制,其中的所有值的类是由其所属列的属性决定的,而和值无关. 为了最大限度的增加SQLite数据库和其他数据库的兼容性,SQLite支持列

对于弱类型语言,譬如PHP,其字符串转为浮点型

弱类型语言,php,javascript,将字符串转为浮点型都可以这样做: $str = "45.3"; $str = float($str); 也可以直接在加上0, $str = $str + 0; 此时$str已经是一个浮点型了,当然结果可能小数位数很多,可以 $str = round($str,2);保留2位小数.