python文件打开的合法模式组合wr_使用Python来操作你的路由器(TP_LINK WR885N)

2023-11-17

开始之前咱们先了解一下TPLINK WR885N这款设备,官方地址为 http://www.tp-link.com.cn/product_368.html 针对官方介绍,这里博主做个简短的讲解

首先看到的是官方的路由器图片

外观还是不错的,博主手上拿到的设备就是那款黑色的,接着来看下官方介绍的管理界面

嗯,看起来似乎非常不错的样子,但是实际测试发现,其实不是这样的,还是很久以前那种传统的管理界面,这个先按住不说。关于其他的各种参数以及优点之类的博主就不多说了,不是本文的重点。

好的,现在开始实战。

登录界面是这样的

相信有很多同学对这个登录界面已经是非常熟悉了,只需要一个密码即可登录,这跟之前博主写的那篇登录小米路由器登录的那个登录界面一样,所以理论上来说应该是默认使用的admin账户登录。

当然,推测终究是推测,咱们肯定是要先得证明一下推测的正确性。好的,这里咱们直接查看页面源代码。

右键查看页面源代码(火狐浏览器)......额,竟然禁用了鼠标右键,好吧,这么鸡肋的功能我也是醉了,博主推荐安装一个火狐浏览器的小工具Web Deverloper Toolbar 这个工具很实用,后面会用到。

安装完之后会在浏览器上面看到一条工具栏,这里查看源代码就直接点击 Web Deverloper Toolbar 的View Source选择View Source选项即可

当然也可以按快捷键Alt + Shift + U查看源代码,总之是非常好使的工具。

查看源代码就很容易看到页面里面做了什么动作了,下面这段代码就是禁用鼠标右键的

function Click(){return false;}

document.οncοntextmenu=Click;

function doPrev(){history.go(-1);}

这段代码博主也不知道为何要写上去,禁用右键的目的是什么呢?是怕别人看出代码写的太渣?

来接着看代码,javascript部分写了一些登录的操作,下面方法是生成base64编码,推测登录的时候是有用到base64编码

function Base64Encoding(input)

{

var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

var output = "";

var chr1, chr2, chr3, enc1, enc2, enc3, enc4;

var i = 0;

input = utf8_encode(input);

while (i < input.length)

{

chr1 = input.charCodeAt(i++);

chr2 = input.charCodeAt(i++);

chr3 = input.charCodeAt(i++);

enc1 = chr1 >> 2;

enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);

enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);

enc4 = chr3 & 63;

if (isNaN(chr2)) {

enc3 = enc4 = 64;

} else if (isNaN(chr3)) {

enc4 = 64;

}

output = output +

keyStr.charAt(enc1) + keyStr.charAt(enc2) +

keyStr.charAt(enc3) + keyStr.charAt(enc4);

}

return output;

}

略过一些鸡肋方法之后找到登录的方法

function PCSubWin()

{

if(CheckPswLength() == true )

{

var password = $("pcPassword").value;

var auth = "Basic "+Base64Encoding("admin:"+password);

document.cookie = "Authorization="+escape(auth)+";path=/";

location.reload();

}

}

嗯,根据方法的逻辑是先检查密码的长度,咱们在脚本中就没必要检查了,所以剩下的就简单了,先制造一个字符串作为Cookie的值

"Basic "+Base64Encoding("admin:"+password);

注意看这里,默认的用户是admin,证明了之前的推测是没错的,登录用户是admin写死的,将用户和密码组合一下进行一次base64加密,然后接着看

document.cookie = "Authorization="+escape(auth)+";path=/";

这里往Cookie里面写入值,注意上面生成的那个base64编码需要调用escape方法进行一个url编码,然后刷新页面就好了,登录过程如此简单,比小米的登录简单多了

那么看到这有的同学就说了,这样的设计是很不科学的,很容易造成爆破,因为用户名都不用猜,只需要爆破密码就可以了,真的是这样吗?

博主就用错误的密码登录了数次之后出现了这个提示

密码错误已达10次,请两小时后再尝试

看来还是有做一些防御的,防止爆破嘛,博主决定研究下这个防御有没有起到实际作用

于是继续看代码

function pageLoad()

{

document.cookie = "Authorization=;path=/";

var ErrNum = httpAutErrorArray[0];

switch(ErrNum)

{

case 1:

isShowReset = true;

$("errMsg").innerHTML = "密码错误,请重新输入。";

$("errMsg").style.visibility = "visible";

$("resetMsg").style.visibility = "visible";

setPswDisable(false);

break;

case 2:

isShowReset = true;

$("errMsg").innerHTML = "密码错误已达10次,请两小时后再尝试。";

$("errMsg").style.visibility = "visible";

$("resetMsg").style.visibility = "visible";

setPswDisable(true);

break;

case 0:

default:

isShowReset = false;

$("errMsg").style.visibility = "hidden";

$("resetMsg").style.visibility= "hidden";

setPswDisable(false);

break;

}

var loginBtn = $("loginBtn");

loginBtn.onmouseover = function(){

loginBtn.style.background = "url(../login/loginBtnH.png)";

};

loginBtn.onmouseout = function(){

loginBtn.style.background = "url(../login/loginBtn.png)";

};

$("officialLink").onclick = function(){

window.open(httpAutErrorArray[1]);

};

}

这段代码里面有提到关键字,所以就研究这段吧,这个pageLoad方法是页面加载完成后立刻执行的方法,看关键部分

var ErrNum = httpAutErrorArray[0];

switch(ErrNum)

{

....

case 2:

isShowReset = true;

$("errMsg").innerHTML = "密码错误已达10次,请两小时后再尝试。";

$("errMsg").style.visibility = "visible";

$("resetMsg").style.visibility = "visible";

setPswDisable(true);

break;

...

}

那个密码次数达到10次的提示就是这里生成的,看上去跟 httpAutErrorArray 这个数组里面的值有关系,找到这个数组所在的方法

var httpAutErrorArray=new Array(2,"http:\/\/www.tp-link.com.cn",0,0 );

这段js代码是页面加载的时候自动生成的,很显然是服务端直接生成的,而需要的值就是httpAutErrorArray数组的第一个值,这里很显然是2,根据上面方法,状态时密码次数10次,正常登录的时候第一个值为0,这样才不会出现那个提示。这里咱们尝试修改第一个值试下,那么问题来了,怎么改?这个是服务端传过来的,拦截response?这么做是可以的,使用神器burp就能做到,但是这里使用burp未免显得大材小用,博主使用常用的小工具Firebug即可,首先调出firebug,调出console控制台,如图

博主用荧光笔写This的区域就是控制台区域,可以在这里写js代码并运行。

好了,开始,这里需要执行的操作就是修改httpAutErrorArray的第一个值,然后执行pageLoad方法即可,在控制台这么写就好了

httpAutErrorArray[0] = 0;

pageLoad();

点击执行之后再看页面就变成了这个样子

是不是一下子就兴奋了起来呢?

试下登录吧,输入正确的密码后点击登录,出现这个界面

OH ,Fuck!看来是服务端也有限制了

不过没关系,不妨碍咱们的研究,上面提到了登录是直接向Cookie里面写入拼接好的字符串即可,那咱们就直接往cookie里面写不就好了,这里有两种方法

第一种就是使用firebug直接执行登录的方法

另外一种就是使用开始提到的那个Web Deverloper Toolbar工具

点击工具栏的Cookies

选择View cookies Infomation进入Cookies的编辑界面

点击下面的Edit按钮就可以开始编辑了

这里咱们需要编辑的是Value字段,根据js代码中的登录方法得到值应该是Base加空格加base64(admin:密码)的形式,博主这里使用的密码是666888,所以得到的值为Base YWRtaW46NjY2ODg4 然后进行url编码,得到的结果是Base%20YWRtaW46NjY2ODg4

URL编码和解码的网站 http://tool.chinaz.com/tools/urlencode.aspx

Base64加密解密的网站 http://www1.tc711.com/tool/BASE64.htm

写入Cookie值之后保存刷新登录界面,不出意外的话就登录成功了,当然博主这里还是处于密码输入错误的状态,需要两个小时后再试

好了,趁着这段等待的时间咱们直接来写Python脚本吧,这个利用Cookie就能登录的脚本写起来应该是非常容易了。

需要的模块:requests,base64,re

base64模块用来生成base64编码的字符串,re模块是用来匹配服务端返回的一些字段。

登录成功之后页面会进行跳转,跳转是使用了前端的js跳转,代码如下

if(window != window.parent)

{

window.parent.location.href = "/userRpm/Index.htm";

}

所以这里只需要判断页面中是否有 userRpm 这个字符串即可,有则登录成功,没有则失败,失败的情况有两种,第一种是密码错误,第二种是密码输错了10次禁止登录,这里需要判断下

路由器功能相对简单,就不写什么class类了,直接定义几个方法,首先做登录方法,代码如下,很简单,不做过多解释

def doLogin():

host = sys.argv[1]

password = base64.b64encode("admin:"+sys.argv[2])

url_login = 'http://' + host

cookie = {"Authorization":"Basic " + password}

try:

response = requests.get(url = url_login,cookies = cookie)

serverResult = ''.join(response.text.split())

ifSuccess = serverResult.split('userRpm')

if len(ifSuccess) < 2:

loginStatus = re.findall(r'varhttpAutErrorArray=newArray\((.+?),"http',serverResult)

print 'Login Failed. Status is ' + loginStatus[0]

else:

print 'Login Success.'

except Exception,e:

print e

return

运行效果是这样的

[2个小时后~~~]

好了,现在可以正常登录路由器了,来看下实际管理界面是怎么样的

为了搞明白为何界面跟官方宣传的不一致,博主仔细查阅了官方相关的文档,发现,官方所宣传的那个高端大气的管理后台是针对硬件版本4.0以后的机型,当前硬件版本为WR885N 1.0 00000000 软件版本为 1.0.2 Build 140504 Rel.33139n 官方提供的最新固件版本为 TL-WR885N V1.0_140728标准版 修复和优化说明如下

1、适用于TL-WR885N V1.0版本的标准版升级软件,不同型号或硬件版本不能使用该软件,升级前请确认版本。

2、优化无线信道自动选择的功能。

3、解决因第三方软件频繁探测路由器导致路由器登录界面被锁定2小时的问题。

第三条似乎对我们进行密码爆破有帮助,这里暂时不讨论。

接着咱们来写个修改登录密码的方法作为例子,其他的功能写起来类似,根据firebug咱们得知修改密码的连接为

http://192.168.1.1/userRpm/ChangeLoginPwdRpm.htm?oldpassword=666888&newpassword=admin123&newpassword2=admin123&Save=%B1%A3+%B4%E6

没错直接一个get请求就OK了,python写起来就简单了,注意这里请求时候必须带上Cookie,因为各种操作都是基于Cookie来认证

根据Firebug得知修改成功之后会返回如下内容

function goUrl(){

window.parent.document.cookie="Authorization=BasicYWRtaW46NjY2ODg4;path=/";

window.parent.location.href="http://192.168.1.1";

}

修改失败的话就直接返回修改密码的原始页面,所以这里判断修改是否成功则只需要判断返回的内容中是否存在goUrl这个字符串即可

这里如果单独请求修改密码的页面会提示验证失败,所以必须带上Header,referer指向 http://192.168.1.1/userRpm/ChangeLoginPwdRpm.htm ,代码写出来就是这样的

def changePwd():

host = sys.argv[1]

oldPwd = sys.argv[2]

newPwd = sys.argv[3]

url_password = "http://"+ host +"/userRpm/ChangeLoginPwdRpm.htm?oldpassword="+ oldPwd +"&newpassword="+ newPwd +"&newpassword2="+ newPwd +"&Save=%B1%A3+%B4%E6"

cookie = {"Authorization":"Basic " + base64.b64encode("admin:" + oldPwd)}

headers = {

'Host': host,

'User-Agent' : 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; BOIE9;ZHCN)',

'Referer' : 'http://'+ host +'/userRpm/ChangeLoginPwdRpm.htm',

}

try:

response = requests.get(url = url_password,headers = headers,cookies = cookie)

serverResult = ''.join(response.text.split())

changeResult = serverResult.split('goUrl')

if len(changeResult) > 1:

print 'Change password success.'

else:

print 'Change password failed.'

except Exception,e:

print e

return

这样就可以快速修改密码了,当然其他的功能也是同样的原理。

本文链接:https://www.92ez.com/?action=show&id=23380

!!! 转载请先联系non3gov@gmail.com授权并在显著位置注明作者和原文链接 !!! 小黑屋

提示:技术文章有一定的时效性,请先确认是否适用你当前的系统环境。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python文件打开的合法模式组合wr_使用Python来操作你的路由器(TP_LINK WR885N) 的相关文章

  • kali linux中如何安装中文输入法

    前言 在使用kali linux中 我们可能用到中文输入法 那么我们该如何安装中文输入法呢 正文 一 首先 我们需要检查更新源是否可用 如果可用我们就进行第二步 如果不可用 我们则需要手动添加更新源 手动添加更新源 我们需要到网上找到最新的
  • 云原生安全性:构建可信任的云应用的最佳实践

    文章目录 云原生安全性的重要性 1 数据隐私 2 恶意攻击 3 合规性要求 4 业务连续性 构建可信任的云应用的最佳实践 1 安全开发 2 身份验证与授权 3 容器安全性 4 监控与审计 5 持续集成与持续交付 CI CD 6 安全培训和教
  • 制作树莓派img镜像文件

    想做个树莓派的img镜像 然而对SD卡进行全盘复制很浪费空间 且不能恢复到比现有SD卡容量小的卡上 因此探索制作小img的方法 网上看了大神制作的脚本 比如https github com conanwhf RaspberryPi scri
  • MySQL索引原理详解

    目录 一 数据结构 1 1 二叉树 为什么索引的数据结构不用二叉树 1 2 红黑树 自平衡二叉查找树 为什么索引的数据结构不用红黑树 1 3 B树 多路平衡搜索树 为什么索引的数据结构不用B树 1 4 B 树 1 5 MySQL B 树 1
  • QML的Label实现Tooltip提示效果

    在用QML进行界面设计时 往往需要用到Label 但是由于界面宽度的限制 Label会显示不全 需要进行Tooltip进行提示 而QML中的Label本身还不支持Tooltip的提示功能 所以给开发带来了一定的困难 那么 遇到这种问题 该怎
  • SpringBoot中使用ThreadPoolExecutor和ThreadPoolTaskExecutor线程池的方法和区别

    Java中经常用到多线程来处理业务 在多线程的使用中 非常的不建议使用单纯的Thread或者实现Runnable接口的方式来创建线程 因为这样的线程创建及销毁势必会造成耗费资源 线程上下文切换问题 同时创建过多的线程也可能会引发资源耗尽的风
  • 【计算机操作系统】第二章 进程管理

    1 进程的基本概念 1 1 程序的顺序执行和特征 程序顺序执行时的特征 顺序性 处理机的操作严格按照程序所规定的顺序执行 即每一操作必须在上一个操作结束之后开始 封闭性 程序是在封闭的环境下执行的 即程序运行时独占全机资源 资源的状态 除初
  • 大数据课程C5——ZooKeeper的应用组件

    文章作者邮箱 yugongshiye sina cn 地址 广东惠州 本章节目的 掌握Zookeeper的Canal消费组件 掌握Zookeeper的Dubbo分布式服务框架 掌握Zookeeper的Metamorphosis消息中间件 掌
  • 快速性分析 一阶、二阶系统响应

    自控笔记 3 3一阶系统的时间响应及动态性能 一 一阶系统的数学模型 凡是以一阶微分方程作为运动方程的控制系统 称为一阶系统 其数学模型为 时间常数T是表征系统响应的唯一参数 T越小 输出响应上升得越快 调节时间越小 二 一阶系统的典型响应
  • 华为OD机试 - 符合要求的元组的个数(Java & JS & Python)

    题目描述 给定一个整数数组 nums 一个数字k 一个整数目标值 target 请问nums中是否存在k个元素使得其相加结果为target 请输出所有符合条件且不重复的k元组的个数 数据范围 2 nums length 200 10 9 n
  • Java Thread.currentThread()方法具有什么功能呢?

    转自 Java Thread currentThread 方法具有什么功能呢 下文讲述Thread currentThread 方法的功能简介说明 如下所示 Thread currentThread 方法的功能 返回当前线程 注意事项 Th
  • Java实现CSV读写

    在开发过程中经常需要处理csv文件 我一般是实现一个CSVHelper 封装一些对csv文件的基本操作 代码中直接使用封装好的CSVHelper来读写csv文件就可以了 今天就来记录一下如何通过Java实现封装的csv文件的读写 对于C 实
  • 弱网测试

    来自 https www cnblogs com linxiu 0925 p 9412190 html 什么是弱网测试 弱网测试主要在宽带 丢包 延时的弱网环境中 验证客户端的展示 以及丢包 延时的处理机制 属于健壮性测试的内容 比如弱网下
  • STM32移植U8g2图形库——玩转OLED显示

    之前的文章 介绍过ESP8266在Arduino IDE环境中使用U8g2库 实现OLED上的各种图形显示 本篇 介绍一下U8g2库如何移植到STM32上 进行OLED的图形显示 本次的实验硬件为 STM32 型号为最常见的STM32F10
  • 前事不忘,后事之师——基于相似性进行剩余有效寿命预测的案例讲解

    在上一篇文章中我们讲到了三种机电产品算命方法 相似模型法 退化模型法和生存模型法 这一篇我们将使用相似模型法构建完整的剩余使用寿命 RUL 估计工作流程 该案例来自MATLAB的Similarity Based Remaining Usef
  • JavaScript设计模式(三)——单例模式、装饰器模式、适配器模式

    个人简介 个人主页 前端杂货铺 学习方向 主攻前端方向 正逐渐往全干发展 个人状态 研发工程师 现效力于中国工业软件事业 人生格言 积跬步至千里 积小流成江海 推荐学习 前端面试宝典 Vue2 Vue3 Vue2 3项目实战 Node js
  • SpringBoot快速入门

    SpringBoot快速入门 1 SpringBoot简介 SpringBoot概述 SpringBoot起步依赖 SpringBoot程序启动 入门案例 SpringBoot项目快速启动 2 基础配置 自动提示功能消失解决方案 yaml语
  • docker创建多个mysql集群_Docker在一台服务器上安装和配置Mysql集群

    1 从docker hub下载mysql5 6的镜像 docker pull mysql 5 6 2 使用mysql5 6镜像运行4台mysql服务 用端口号区分 前期准备工作 在本机创建四个目录 分别用了存储4台mysql服务的数据 日志
  • Windows服务器管理(运维)——cmd命令大全

    1 文件和目录操作命令 cd 更改当前目录 dir 列出当前目录中的文件和文件夹 mkdir 创建一个新的文件夹 rmdir 删除一个空的文件夹 copy 复制文件或文件夹 del 删除文件 ren 重命名文件或文件夹 move 移动文件或

随机推荐

  • angular html原理,Angular 4.x ngModel 双向绑定原理揭秘

    在 Angular 4 x 中对于使用 Template Driven 表单场景 如果需要实现表单数据绑定 我们就需要引入 ngModel 指令 该指令用于基于 domain 模型 创建 FormControl 实例 并将创建的实例绑定到表
  • java日志级别

    java中日志级别有7 个级别 severe Warning info config fine finer finest 默认情况只记录前三个级别 另外可以使用Level ALL开启所有的级别记录 或者使用Level OFF关闭所有的级别记
  • android动静态申请IMEI或其他特殊权限(适配11)

    报错原因 今天又是撸代码的一天 人生第一个项目上架闪退被打回 很难受 打开就闪退 后面才恍然大悟 打开APP默认申请获取手机IMEI 测试用的手机被我手动打开了权限 所以一直没有注意这个问题 果然 log报错 java lang Secur
  • pjsip的一个qt写的demo

    msvc版本编译的pjsip的demo 有源码 也有可直接运行的包 本程序解决了pjsip双方互相同时呼叫时会出现的问题 目前只是用来呼叫接听的demo 没有做流媒体传输 https download csdn net download q
  • 【C语言】使用C语言实现静态、动态的通讯录(简单易懂)

    我们在学习结构体之后 就可以尝试去实现通讯录的制作 如果您这边对于结构体还没有太多的认识的话 请先访问这一篇文章 会有利于接下来的学习 自定义类型 带你走进结构体 枚举 联合 小王学代码的博客 CSDN博客 目录 一 通讯录 二 静态通讯录
  • Java自增和自减运算符(++和--)

    在对一个变量做加 1 或减 1 处理时 可以使用自增运算符 或自减运算 或 是单目运算符 放在操作数的前面或后面都是允许的 与 的作用是使变量的值增 1 或减 1 操作数必须是一个整型或浮点型变量 自增 自减运算的含义及其使用实例如表 1
  • Flutter实现倒计时功能,秒数转时分秒,然后倒计时

    Flutter实现倒计时功能 发布时间 2023 05 12 本文实例为大家分享了Flutter实现倒计时功能的具体代码 供大家参考 具体内容如下 有一个需求 需要在页面进行显示倒计时 倒计时结束后 做相应的逻辑处理 实现思路 在Flutt
  • 牛客中等难度3

    HJ70 矩阵乘法计算量估算 描述 矩阵乘法的运算量与矩阵乘法的顺序强相关 例如 A是一个50 10的矩阵 B是10 20的矩阵 C是20 5的矩阵 计算A B C有两种顺序 AB C 或者 A BC 前者需要计算15000次乘法 后者只需
  • 异常处理包装技术

    异常大致可分为两种 受检查异常和非受检查异常 受检查异常是在编译期间就可以检查到的 非受检查异常又分为error和RuntimeException 非受检查异常是可控的 可以人为操作修改的 一般我们针对业务异常 非受检查异常 进行处理 会继
  • 鸿蒙系统是否可以用来做服务器,小米手机也能使用鸿蒙系统?国内厂商使用鸿蒙热情高涨...

    原标题 小米手机也能使用鸿蒙系统 国内厂商使用鸿蒙热情高涨 自从6月2日HarmonyOS 2正式发布以来 国内针对鸿蒙系统的热议一直不减 对于新买的华为手机用户来说 能第一批次使用上国产的手机系统 也确实过了一把瘾 本次手机系统更新 华为
  • Android蓝牙开发教程(三)——蓝牙设备相互通讯

    在上一篇中已经介绍如何连接我们搜索到的蓝牙设备 如果你还没阅读过 建议先看看上一篇文章Android蓝牙开发教程 二 连接蓝牙设备 在上一篇文章中 无论是自动连接还是被动连接 连接成功后 都是将获取到的BluetoothSocket交由连接
  • 根据眼动数据的模板作为KNN聚类的中心点并因此进行数据分类

    from scipy io import loadmat import numpy as np import matplotlib pyplot as plt 实验数据采集分为两个过程 第一个是眼动校准阶段 要求实验参与者依次观看界面上的数
  • VMWare 6.5.3 绿色精简版汉化 +VMware Workstation 6.5.3 Build 185404 汉化绿色精简版

    绿色精简版 参考网上6 5 X几个绿色精简版更新制作 bat不加密 不加入个人信息 喜欢研究的随便看 精简版一般使用够用了 高手估计会觉得缺少某些功能了 那就只能装完整版了 bridge 桥接 usb服务 host only都可以使用 VM
  • C++23新特性个人总结

    文章目录 1 关键字 1 1 consteval 1 2 auto 1 2 1 新增支持数组指针的引用类型 1 2 2 代替decay copy语义 1 3 volatile 1 4 constexpr 1 5 char8 t 1 6 wc
  • 【自动化风控建模系列1】最简洁的代码实现特征初步筛选

    金融信贷开发评分卡时 通常会准备好特征中间层供评分卡开发筛选使用 评分卡的特征选择余地越大 后期越是有可能开发出性能更高的评分卡 但特征变量的选择在此时就成为第一个问题 如何初步筛选出合适的变量 基于经验 我认为第一步的筛选只需要剔除那些极
  • Educoder---Java面向对象 - 集合框架(1)

    第一题 请仔细阅读右侧代码 根据方法内的提示 在Begin End区域内进行代码补充 创建ArrayList集合并且向集合中添加数据 具体要求如下 添加字符串类型数据 https www educoder net 添加double类型数据
  • 偏移注入payload构造技巧实战+Access注入

    url http 218 245 4 113 8888 web03 ca55022fa7ae5c29d179041883fe1556 index asp id 886 拿到url 虽然知道肯定是id是注入点 但还是写一下完整思路 1 拿到界
  • node环境实现console输出不同颜色

    一 输出规则分析 1 输出及打印如下 console log x1B 31m s x1B 0m 这是红色 console log x1B 36m s x1B 0m 这是青色 2 规则说明 x1B 31m 是一个转义序列 它将被您的终端拦截并
  • 【翻译】Dart和Flutter是什么?

    Dart是在Go之后从谷歌出现的 最近作为Flutter跨平台前端框架背后的语言 其受欢迎程度激增 这对那些对云原生基础设施感兴趣的人来说很重要 因为有一种对 全栈Dart 的推动 Flutter开发者可以使用相同的语言来构建他们应用程序背
  • python文件打开的合法模式组合wr_使用Python来操作你的路由器(TP_LINK WR885N)

    开始之前咱们先了解一下TPLINK WR885N这款设备 官方地址为 http www tp link com cn product 368 html 针对官方介绍 这里博主做个简短的讲解 首先看到的是官方的路由器图片 外观还是不错的 博主