web学习第一周笔记

函数内访问全局变量需要 global 关键字或者使用 $GLOBALS[index] 数组


$_GET 变量


$_GET 变量是一个数组,内容是由 HTTP GET 方法发送的变量名称和值。 $_GET 变量用于收集来自 method="get" 的表单中的值。从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送的信息量也有限制(最多 100 个字符)。


echo和print

echo 是语法结构,也就是关键字,不是函数。使用的时候不用加括号,加上也可以。显示多个值的时候可以用逗号隔开。只支持基本类型,布尔型除外,echo true的时候显示1,echo false的时候啥都没有。

print 和 echo 基本一致。但是print 不支持逗号分隔多个显示变量的语法。

print_r 是函数,不仅可以打印变量的的值,还能显示变量类型,而且也可以显示数组和对象这样复杂的变量类型。print_r() 将把数组的指针移到最后边。使用 reset() 可让指针回到开始处。

两者相同点:

echo 和 print 都是语言结构(官方文档解释为language construct);

echo 和 print 都是用来输出字符串的;

当同时只有一个参数的时候,echo 和 print 后面的括号(parenthesis)都是可选的,即:echo ($argument1) 等价于 echo $argument1,print(argument)等价于print argument;

echo 和 print 在输出之前,都会将参数的进行转换,尝试转换为字符串类型。

两者的区别:

echo能接受N个字符串类型的参数(注意:有多个参数的时候,不能使用括号,即echo a r g 1 , arg1, arg1,arg2是正确的,echo( a r g 1 , arg1, arg1,arg2)会导致解析错误); print只能接收1个字符串类型的参数;

echo没有返回值; print有返回值,其值永远为int类型的1。

在这里引用PHP官方原文档的说明 : “The major differences to echo are that print only accepts a single argument and always returns 1.”

String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型), Array(数组), Object(对象), NULL(空值)。


松散比较:使用两个等号 == 比较,只比较值,不比较类型。

严格比较:用三个等号 === 比较,除了比较值,也比较类型。

例如,“42” 是一个字符串而 42 是一个整数。FALSE 是一个布尔值而 “FALSE” 是一个字符串。

注意一下数据类型中的对象类型,function函数 new函数 &this->的用法

魔术常量


反序列化漏洞

1. 原理

1. 序列化就是将一个对象转换成字符串。字符串包括,属性名,属性值,属性类型和该对象对应的类名。序列化函数serialize()  
2. 反序列化就是将一个序列化了的对象或数组字符串,还原回去反序列化函数unserialize()。
3. protected属性被序列化的时候属性值会变成 %00*%00属性名 private属性被序列化的时候属性值会变成 %00类名%00属性名(%00为空白符,空字符也有长度,一个空字符长度为 1)

2. 魔术方法

__construct() 当对象创建(new)时会自动调用。但在unserialize() 时是不会自动调用的。

__destruct() 当一个对象销毁(反序列化)时被调用

__toString() 当一个对象被当作一个字符串使用时被调用

__sleep() 在对象在被序列化之前立即运行

__wakeup() 将在序列化之后立即被调用

1. __wakeup()
  将在序列化之后立即被调用
  **当序列化字符串表示对象属性个数的数字值大于真实类中属性的个数时就会跳过__wakeup的执行。**
 2. __destruct(),当一个对象被销毁时被调用,
   eval() 函数把字符串按照 PHP 代码来计算。
   该字符串必须是合法的 PHP 代码,且必须以分号结尾。
   如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。
  3. __toString()
   __toString() 方法用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。此方法必须返回一个字符串。本节围绕着一个问题,如果在代码审计中有反序列化点,但是在原本的代码中找不到pop链该如何? N1CTF有一个无pop链的反序列化的题目,其中就是找到php内置类来进行反序列化。**__toString当对象被当作一个字符串使用时候调用(不仅仅是echo的时候,比如file_exists()判断也会触发)**
     1.  echo($obj)/print($obj)打印时会触发 
     2.  反序列化对象与字符串连接时 
     3.  反序列化对象参与格式化字符串时 
     4.  反序列化对象与字符串进行==比较时(PHP进行==比较的时候会转换参数类型) 
     5.  反序列化对象参与格式化SQL语句,绑定参数时 
     6.  反序列化对象在经过php字符串处理函数,如strlen()、strops()、strcmp()、addslashes()等 
     7.  在in_array()方法中,第一个参数时反序列化对象,第二个参数的数组中有__toString()返回的字符串的时候__toString()会被调用 
     8.  反序列化的对象作为class_exists()的参数的时候 

3.pop链POP 链的构造利用

一、POP链简介

  1. POP 面向属性编程(Property-Oriented Programing) 常用于上层语言构造特定调用链的方法,与二进制利用中的面向返回编程(Return-Oriented Programing)的原理相似,都是从现有运行环境中寻找一系列的代码或者指令调用,然后根据需求构成一组连续的调用链,最终达到攻击者邪恶的目的。类似于PWN中的ROP,有时候反序列化一个对象时,由它调用的__wakeup()中又去调用了其他的对象,由此可以溯源而上,利用一次次的“gadget”找到漏洞点。
  2. POP CHAIN:把魔术方法作为最开始的小组件,然后在魔术方法中调用其他函数(小组件),通过寻找相同名字的函数,再与类中的敏感函数和属性相关联,就是POP CHAIN 。此时类中所有的敏感属性都属于可控的。当unserialize()传入的参数可控,便可以通过反序列化漏洞控制POP CHAIN达到利用特定漏洞的效果。

1. 攻防世界unserialize3

看到xctf类中有-wakeup(),他是在反序列化函数执行之前会自动执行的,而当 序列化的字符串中的 属性值 个数 大于 属性个数 就会导致反序列化异常,从而绕过 __wakeup(),所以我们先实例化一个xctf的类,对其进行序列化,得出的结果

O:4:“xctf”:1:{s:4:“flag”;s:3:“111”;}

将属性的个数改为大于一的数并在网页的url上输出,最终得到答案

2.攻防世界Web_php_unserialize

$_GET 变量用于收集来自 method=“get” 的表单中的值。

preg_match 函数用于执行一个正则表达式匹配。而模式分隔符后的"i"标记这是一个大小写不敏感的搜索参考自

highlight_file()函数 高亮显示,当使用该函数时,整个文件都将被显示,包括密码和其他敏感信息!

审计代码,知flag 在 fl4g.php ,需要将其传参至var中,所以首先进行base64加密来度过base64_decode,然后不能正则匹配,否则直接跳出程序,此处上面代码正则匹配的是不区分大小写的o:数字或者是c:数字,那么在反序列化串的O:前加个加号“+”,绕过preg_match函数。绕过wakeup则是让属性加一即可。

3.buuctf_php

首先是通过爆破,找到www.zip文件,审计其中代码,发现大致思路就是通过反序列化来执行__destruct()中的echo f l a g 两 个 条 件 flag 两个条件 flagthis->password == 100,$this->username === ‘admin’ 同时反序列化的时候需要绕过__wakeup(),要注意private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上\0的前缀。字符串长度也包括所加前缀的长度。其中 \0 字符也是计算长度的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值