漏洞:阿里云盾phpMyAdmin <=4.8.1 后台checkPageValidity函数缺陷可导致GETSHELL

阿里云盾提示phpMyAdmin <=4.8.1会出现漏洞有被SHELL风险,具体漏洞提醒:

标题

phpMyAdmin <=4.8.1 后台checkPageValidity函数缺陷可导致GETSHELL

简介

checkPageValidity函数对外部输入过滤不严,可导致本地包含任意文件。进一步地攻击者可通过注入代码到特定文件进行包含造成远程代码执行。

阿里云盾漏洞

这个漏洞,将phpmyadmin升级到最新版即可解决。

查看兼容性:

phpmyadmin查看最新版与MySQL和PHP版本的兼容性
当前phpmyadmin最新版为4.8.2,兼容PHP 5.5 ~ 7.2MySQL 5.5及以上,我这个服务器是PHP7.1.18MariaDb10.1.33所以直接升级到最新版就可以了。
因为lnmp1.5提供了升级脚本,直接升级即可。

cd lnmp1.5
./upgrade.sh phpmyadmin

会跳转一下,输入版本号:

You can get version number from https://www.phpmyadmin.net/downloads/
Please enter phpMyAdmin version you want, (example: 4.8.0 ): 4.8.2

然后就升级完成了,再去阿里云里面验证一下漏洞,漏洞已失效。

注意:

  1. 如果你修改了nginx网站目录的位置,你需要修改一下lnmp配置文件root/lnmp1.5/lnmp.conf,将下面这里的路径改成你服务根目录的路径。
Default_Website_Dir='/home/wwwroot/default'
  1. 如果你修改了phpmyadmin的目录名称,你需要修改升级所用的脚本文件/root/lnmp1.5/include/upgrade_phpmyadmin.sh,将脚本中的${Default_Website_Dir}/phpmyadmin/这样的路径全部改成${Default_Website_Dir}/你的phpmyadmin文件夹名/

这样才可以升级成功,以上使用的是lnmp1.5版本,感谢军哥。

ThinkPHP 5.1下使用PHPSocket.IO实现websocket通讯

PHPSocket.IO的官方介绍:

PHPSocket.IO是PHP版本的Socket.IO服务端实现,基于workerman开发,用于替换node.js版本Socket.IO服务端。PHPSocket.IO底层采用websocket协议通讯,如果客户端不支持websocket协议, 则会自动采用http长轮询的方式通讯。PHPSocket.IO实现的Polling通信机制包括Adobe Flash Socket、AJAX长轮询、JSONP轮询等。具体采用哪种机制通讯对于开发者完全透明, 开发者使用的是统一的接口。

项目github地址https://github.com/walkor/phpsocket.io
下面我们使用ThinkPHP5.1框架来整合PHPSocket.IO实现客户端和服务端的通讯。

使用的本地开发环境是PHP5.6.30 + Apache2.4.25

创建新项目

// 使用ThinkPHP5.1新建项目thinksocket;
$ composer create-project topthink/think thinksocket 5.1.*;
// 进入项目,下载workerman/phpsocket.i包;
$ cd thinksocket
$ composer require workerman/phpsocket.io

这样你的安装工作就做好了。接下来配置需要的模块。

配置模块

结合前阵子的文章:ThinkPHP 5.1自动生成模块及目录、文件
我们编辑好build.php文件:

return [
    // 生成应用公共文件
    '__file__' => ['common.php'],
    // 定义socketio模块的自动生成
    'socketio'     => [
        '__file__'   => ['common.php'],
        '__dir__'    => ['controller', 'model', 'view'],
        'controller' => ['Index', 'Server'],
        'model'      => [],
        'view'       => ['index/index'],
    ],
    // 其他更多的模块定义
];

然后运行

$ php think build
Successed

这样就有了socketio模块下面controllerIndex.phpServer.php两个控制器和view下一个index/index一个视图。

创建服务端

编辑控制器Server.php为(具体参考注释):

<?php
namespace app\socketio\controller;

use Workerman\Worker;
use PHPSocketIO\SocketIO;
use think\Db;

class Server{

    public function index(){
        // 在2021端口创建服务
        $io = new SocketIO(2021);
        $io->on('connection', function($socket)use($io){
            $socket->on('chat message', function($msg)use($io){
                $io->emit('chat message', $msg);
            });
            // 监听到新的客户端连接即在服务端输出'new connection'
            echo 'new connection'."\n";
            // 并向服务端发送'连接成功'
            $socket->emit('success', '连接成功');
            // 服务端发送消息过来
            $socket->on('sendMsg', function($msg)use($io){
                // 在服务端输出消息
                echo $msg."\n";
                // 在收到的消息前面拼接'收到'后向客户端发送回去
                $io->emit('sendMsg', '收到"'.$msg.'"');
                // 将接受到的消息存储到数据库
                $data['msg'] = $msg;
                Db::table('msg')->insert($data);
            });
        });
        // 启动服务
        Worker::runAll();
    }
    // 测试数据库链接
    public function ceshi(){
        $msg = Db::table('msg')->select();
        var_dump($msg);
    }
}

为了测试,这里新建了在本地数据库新建了一张表msg用来存储客户端发送过来的消息。

CREATE TABLE `msg` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `msg` varchar(250) DEFAULT NULL,
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4;

这样一个可以返回连接成功消息、接收消息、回复消息、存储消息的简单服务端就做好了。

创建客户端

我们在Index.php控制器中这样写:

<?php
namespace app\socketio\controller;

use think\Controller;

class Index extends Controller
{
    public function index()
    {
        return view();
    }
}

在对应的模版文件view/index/index.html中代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>测试WebSocket</title>
</head>
<body>

<input type="text" name="" id="msg">
<button id='send'>发送消息</button>

</body>
<script src='https://cdn.bootcss.com/socket.io/2.0.3/socket.io.js'></script>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script>
// 如果服务端不在本机,请把127.0.0.1改成服务端ip
var socket = io('http://127.0.0.1:2021');
// 当连接服务端成功时触发connect默认事件
socket.on('connect', function(){
    console.log('connect success');
});
socket.on('success', function(msg){
    // 连接后弹出服务端返回的消息'连接成功'
    alert(msg);
});

socket.on('sendMsg', function(msg){
    // 将服务端返回的消息输出到控制台
    console.log(msg);
});

// 向服务端发送消息
$('#send').on('click', function(){
    var text = $('#msg').val();
    socket.emit('sendMsg', text);
    // alert(text);
})
</script>
</html>

到这里,一个具备连接服务端,发送消息,接受并输出消息到控制台的简单websocket客户端就建好了。

为服务端绑定入口文件

在项目的public文件夹下新建一个入口文件server.php并将其绑定到socketio模块的Server控制器index方法;
入口文件server.php代码:

<?php
// [ 应用入口文件 ]
namespace think;

// 加载基础文件
require __DIR__ . '/../thinkphp/base.php';

// 执行应用并响应(绑定)
Container::get('app')->bind('socketio/Server')->run()->send();

测试通讯

运行服务端
直接运行项目public目录下的server.php

D:\xampp\htdocs\thinksocket\public>php server.php
----------------------- WORKERMAN -----------------------------
Workerman version:3.5.11          PHP version:5.6.30
------------------------ WORKERS -------------------------------
worker               listen                              processes status
PHPSocketIO          socketIO://0.0.0.0:2021             1         [ok]

ThinkPHP 5.1下使用PHPSocket.IO实现websocket通讯
这个输出表示PHPSocketIO已经成功在2021端口运行监听中。
我们打开浏览器打开http://localhost/thinksocket/public/index.php/socketio/页面;
可以看到页面会弹出‘链接成功’,同时可以看到服务端cmd终端上打印出new connection,同事浏览器控制台会输出connect success,代表已经成功与服务端连接上。
测试发送消息
在页面输入框内输入任意信息,服务端cmd终端将会打印信息,代表服务端收到信息,然后服务端控制台将会输出‘收到’+发送的信息。
至此,我们的测试完成。

以上只是简单的利用ThinkPHP5.1的框架测试PHPSocket.IO通讯。
源代码地址:https://github.com/hsu1943/thinksocketio
供大家参考。

西部世界第二季最后带走的五个球是哪些人?

西部世界第二季在上周已经完结了,最后一集的信息量顶的上前面5集总和,前面就一直是在卖关子,最后一集一股脑抖出来,让人大呼过瘾。

最后的结局是,现有的西部世界崩塌,幸存的“复制人”进入到了一个全新的世界,也不知道这个世界是为了减轻他们的痛苦而造的一个虚幻,还是下一季的剧情主场。

西部世界第三季

而我们的女主,被伯纳德杀死后,又在内心汉尼拔(抱歉我一直叫这个老头汉尼拔)的指引下将其复活,肉身用的是组织头头,成功偷梁换柱,包包里带着几个小伙伴的“精华”,轻松的通过汉尼拔事先安排好的保安队长的检查,进入了人类世界。

这就要粗大事了!

毕竟有了自我意识的复制人在各方面都领先于人类太多,学习能力超强(毕竟读取后写入内存即可),身体构造,不会衰老,全方位碾压。

西部世界第三季

那袋子里到底是那些人呢?可以确定的只有伯纳德一位,最后有镜头是女主利用汉尼拔留下的设备和自己带的“精华”制造一个自己和伯纳德,那么还有几个球该是谁呢,我来大胆猜测一下!

最后一段镜头可以看到三个人,从肉体上和意识的对应关系是:
* 伯纳德身体,对应的应该是伯纳德本人,其实是重塑的阿诺德。这里用掉一个球。
* 德洛丽丝身体,对应的是女主本人,这里要用掉一个球,也有可能他是福特?
* 黑尔身体,她出来的时候是德洛丽丝,如果不做修改重塑,这里不用球。

西部世界第三季

总之这三个人可能性比较大的是福特,伯纳德,德洛丽丝本人,最少得用掉两个球,至于福特的球哪里来的,你记得伯纳德在摇篮里福特留下的代码指引下制造了一个球吗?那大概就是就是福特。那还有三个是谁?

一个是情人“泰迪”,把泰迪带到真实世界中来,也许他才能彻底觉醒,泰迪自杀后,德洛丽丝将他的球留下来了的。

西部世界第三季

还有一个是老鸨,老鸨太重要了,黑尔上船前,镜头里扫到了老鸨,老鸨的男友,还有一个女配角。老鸨对整个计划相当重要,她也是福特实验的重要一环,必须带上。

西部世界第三季

那就剩下一个了,事实上我也不知道第五个应该是谁,威廉?大老板?或者是其他什么人?就当是一个开放题留给第三季吧。

西部世界第三季

无比期待第三季,人类世界在这些个复制人的搅和下会出什么样的幺蛾子呢?

程序员日常第一期:与程序员交流真的有障碍啊

就在刚刚,新鲜出炉的新鲜事儿,看看下面的微信截图你就知道了。

午饭时间到了,只是交流一下点外卖心得,看看有没有什么好吃的,没什么不对。
1

我外卖点好了,分享红包的页面就弹出来,顺手就发到了最顶上的群里,突然感觉话风不对,以为是对面是消息发错群了。
2

感觉到好像哪里不对了!
3

真的是,我就分享一个红包,你就告诉我该怎么写抢红包的逻辑么?还能正常交流吗?
3