主要学习内容
- PHP 学习
- 本周web题解
不得不说…差的知识太多了…
感谢博主详细的wp LCTF bestphp’s revenge
解题思路
1、SoapClient触发反序列化导致ssrf
2、serialize_hander处理session方式不同导致session注入
3、crlf漏洞
0x00 序列化与反序列化
序列化使用serialize()将对象的用字符串的方式进行表示
反序列化使用unserialize()将序列化的字符串,构造成相应的对象,反序列化是序列化的逆过程。
在PHP中,序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构。
当想要将数组值存储到数据库时,就可以对数组进行序列化操作,然后将序列化后的值存储到数据库中。其实PHP序列化数组就是将复杂的数组数据类型转换为字符串,这样就方便数组存库操作。
为什么会产生反序列化漏洞?
PHP反序列化漏洞又称PHP对象注入,是因为程序对输入数据处理不当导致的。
需要具备反序列化漏洞的前提:
- 必须有 unserailize();
- 函数 unserailize() 函数的参数可控。
参考 入门Web需要了解的PHP反序列化漏洞&深度剖析PHP 序列化与反序列化
0x01 魔术方法
如果反序列化对象中存在魔术方法,而且魔术方法中的代码或变量用户可控,就可能产生反序列化漏洞,根据反序列化后不同的代码可以导致各种攻击,如代码注入、SQL注入、目录遍历等。
魔术方法:PHP的类中可能会包含一些特殊的函数叫魔术函数,魔术函数命名以符号__开头。
有以下的魔术方法:
__construct(), __destruct(),
__call(), __callStatic(), __get(), __set(), __isset(), __unset(),
__sleep(), __wakeup(), __toString(), __invoke(), __set(), _state(),
__clone(), __debugInfo() …
反序列化漏洞中常见到有一些魔术方法:
__construct():在对象创建时自动被调用;
__destruct():在脚本运行结束时自动被调用;
__sleep():在对象序列化的时候自动被调用;
__wakeup():在反序列化为对象时自动被调用;
__toString():直接输出对象引用时自动被调用;
魔术方法的触发
构造方法 __construct()
构造方法是类中的一个特殊方法。当使用 new 操作符创建一个类的实例时,构造方法将会自动调用,其名称必须是 __construct()。在一个类中只能声明一个构造方法,而是只有在每次创建对象的时候都会去调用一次构造方法,不能主动的调用这个方法,所以通常用它执行一些有用的初始化任务。该方法无返回值。
语法:
function __construct(arg1,arg2,…)
{
}
0x02 CRLF漏洞
漏洞原理:http数据包通过\r\n\r\n来分开http header和 body
回车符(CR,ASCII 13,\r,%0d)
换行符(LF,ASCII 10,\n,%0a)
漏洞检测:通过修改HTTP参数或URL,注入恶意的CRLF,查看构造的恶意数据是否在响应头中输出。(XSS一般输出在主体中)
漏洞修复:过滤 \r 、\n 之类的行结束符,避免输入的数据污染其他 HTTP 首部字段。
还没完全理解题目相关知识点…持续更新中…