当前位置:首页 > Web开发 > 正文

user_agent = AAA:BBBrn .Cookie:PHPSESSID=dde63k4h9t7c9dfl79n

2024-03-31 Web开发

标签:

0x00 常识点 1操作PHP原生类来结构POP链

本题没有可以操作的类,没有可以操作的类就找不到POP链所以只能考虑PHP原生类
我们先来解释一下什么是POP链

POP:面向属性编程
在二进制操作时,ROP 链结构中是寻找当前系统环境中或者内存环境里已经存在的、具有固定地点且带有返回操纵的指令集,而 POP 链的结构则是寻找措施当前环境中已经界说了或者能够动态加载的东西中的属性(函数要领),将一些可能的挪用组合在一起形成一个完整的、具有目的性的操纵。二进制中凡是是由于内存溢出控制了指令执行流程,而反序列化过程就是控制代码执行流程的要领之一,固然进行反序列化的数据能够被用户输入所控制
在之前的学习中:

我已经清楚反序列化的主要风险在于我们可以控制东西的变量来转变措施执行流程从而到达我们最终的目的

我们无法控制东西的要领来挪用,因此我们这里只能去找一些可以自动挪用的一些魔术要领,常用的一些魔术要领:

__wakeup() //使用unserialize时触发 __sleep() //使用serialize时触发 __destruct() //东西被销毁时触发 __call() //在东西上下文中挪用不成访谒的要领时触发 __callStatic() //在静态上下文中挪用不成访谒的要领时触发 __get() //用于从不成访谒的属性读取数据 __set() //用于将数据写入不成访谒的属性 __isset() //在不成访谒的属性上挪用isset()或empty()触发 __unset() //在不成访谒的属性上使用unset()时触发 __toString() //把类看成字符串使用时触发 __invoke() //当脚本测验考试将东西挪用为函数时触发

好了回到我们今天说的常识点:
先附上师傅文章:

这里我只提一下我们今天使用的
php内置类SoapClient
他具有SSRF能力
在今天的文章中我们可以操作他进行SSRF
解释:

SOAP是webService三要素(SOAP、WSDL(WebServicesDescriptionLanguage)、UDDI(UniversalDescriptionDiscovery andIntegration))之一:WSDL 用来描述如何访谒具体的接口, UDDI用来打点,分发,盘问webService ,SOAP(简单东西访谒协议)是连接或Web处事或客户端和Web处事之间的接口。其给与HTTP作为底层通讯协议,XML作为数据传送的格局。
SoapClient类可以创建soap数据报文,与wsdl接口进行交互。
简单的用法

<?php $a = new SoapClient(null,array(location'=>':2333','uri'=>'123')); $b = serialize($a); echo $b; $c = unserialize($b); $c->a(); 2:CRLF Injection缝隙

链接:
https://www.jianshu.com/p/d4c304dbd0af

CRLF是”回车+换行”(\r\n)的简称。在HTTP协议中,HTTPHeader与HTTPBody是用两个CRLF分隔断绝分手的,浏览器就是按照这两个CRLF来取出HTTP内容并显示出来。所以,一旦我们能够控制HTTP动静头中的字符,注入一些恶意的换行,这样我们就能注入一些会话Cookie或者HTML代码,所以CRLFInjection又叫HTTPResponseSplitting,简称HRS。
简单来说
http请求遇到两个\r\n即%0d%0a,会将前半部分当做头部解析,而将剩下的部分当做体,当我们可以控制User-Agent的值时,头部可控,就可以注入crlf实现改削http请求包。

3:serialize_hander措置惩罚惩罚session方法差别导致session注入

简单看:
serialize_handler=php
解释:

这样的方法,可以指定php序列化引擎,而差别引擎存储的方法也差别
php中的session中的内容并不是放在内存中的,而是以文件的方法来存储的,存储方法就是由配置项session.save_handler来进行确定的,默认是以文件的方法存储。
存储的文件是以sess_sessionid来进行定名的,文件的内容就是session值的序列话之后的内容。
在php.ini中存在三项配置项:

session.save_path="" --设置session的存储路径 session.save_handler="" --设定用户自界说存储函数,如果想使用PHP内置会话存储机制之外的可以使用本函数(数据库等方法) session.serialize_handler string --界说用来序列化/反序列化的措置惩罚惩罚器名字。默认是php(5.5.4后改为php_serialize)

session.serialize_handler存在以下几种

php_binary 键名的长度对应的ascii字符+键名+颠末serialize()函数序列化后的值 php 键名+竖线(|)+颠末serialize()函数措置惩罚惩罚过的值 php_serialize 颠末serialize()函数措置惩罚惩罚过的值,会将键名和值看成一个数组序列化

在PHP中默认使用的是PHP引擎,如果要改削为其他的引擎,只需要添加代码ini_set(‘session.serialize_handler‘, ‘需要设置的引擎‘);。
本题中,我们操作的是session反序列化和序列化时候使用差别引擎的时候,即可触发缝隙
例如传入$_SESSION[‘name‘]=‘|O:5:"xxxxx":1:{s:4:"test";s:3:"AAA";}‘; 序列化引擎使用的是php_serialize,,那么储存的session文件为
a:1:{s:4:"name";s:5:"|O:5:"xxxxx":1:{s:4:"test";s:3:"AAA";}";}

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30484.html