TEW-654TR注入漏洞

Posted Neil-Yale

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TEW-654TR注入漏洞相关的知识,希望对你有一定的参考价值。

访问路由器后台登录的web界面抓包如下
在这里插入图片描述

可以看到html登录页面会将我们提交的用户名密码等提交给my_cgi.cgi
接下来我们从官网下载该路由器的固件
下过来是一个zip文件
在这里插入图片描述

将其解压,然后使用Binwalk对bin文件提取
在这里插入图片描述

进入提取后的文件夹可以看到成功提取出了文件系统
在这里插入图片描述

搜索前面找到的cgi文件的位置
在这里插入图片描述

然后载入ida先进行静态分析

根据burp中看到的request关键字,在strings window进行搜索
在这里插入图片描述

双击第一项
然后x查看交叉引用
在这里插入图片描述

点击ok进入了main函数
在这里插入图片描述

看到在其之前会调用getenv(“REQUEST_METHOD”),获取不到的话往左边走,跳到loc_10914c
在这里插入图片描述

可以看到,会从栈上恢复s0-s7,fp,ra的值
接着jr ra跳转到ra重新调用getenv

如果getenv返回true的话则走右边
在这里插入图片描述

判断是否为get方法,如果是get,则往左走,直接跳到结束位置
否则继续往右走
在这里插入图片描述

获取content_length,content_type,remote_addr等
继续往下,可以看到有打开数据库的动作
在这里插入图片描述

我们可以在提取出的文件系统里搜索数据库文件
在这里插入图片描述

使用file命令查看
在这里插入图片描述

可以看到是sqlite3
那么我们可以通过sqlite3打开
在这里插入图片描述

列出表
在这里插入图片描述

查看user
在这里插入图片描述

这样就直接拿到了用户名和密码了

继续在ida中分析
在这里插入图片描述

之后是调用open_db,get_input_entries,check_remote_ip
在这里插入图片描述

接着是判断参数request的值是login,show_message等字符串,进行比较
传入的是login继续往下跟
在这里插入图片描述

可以看到来到了loc_409a6c
在这里插入图片描述

而409a6c指向了do_login,跟入
在这里插入图片描述

在do_login中看到了查询用户名密码的sql语句
那么我们就知道了这里就是进行登录校验的地方,如果校验失败,比如密码输入错误,则往右边走
在这里插入图片描述

会进行重定向,恢复栈帧等操作
这是正常的判断流程。但是这里是存在问题的。
我们回过头来看一下。
在这里插入图片描述

一开始的关键是strcpy,具体内容待会儿下断点,动态调试的时候看看
接着是一段空间,通过strlen计算长度,通过memset初始化这个空间为0
在这里插入图片描述

然后通过sprintf格式化,我们输入的用户名密码被带入该字符串,再调用exec_sql进行执行。
来分析exec_sql
在这里插入图片描述

exec_sql是从so文件导入的
我们在libdbapi.so.1.0.0中找到了该函数
在这里插入图片描述

可以看到它其实调用了sqlite3_exec
在这里插入图片描述

里面执行的sqlite3_free,sqlite3_exec等都是sqlite3中标准的数据库函数
这期间没有任何过滤等操作,说明sql语句里的参数是可控的,那么就会存在sql注入。

接下来进行动态调试。为了方便我们可以写成一个shell脚本。记得我们前面分析的,会提取content_length,content_type,remote_addr,所以用-E设置env,-g指定了gdb远程调试的端口. /usr/bin/my_cgi.cgi是在burp看到的.
脚本如下
在这里插入图片描述

我们先简单地模拟调试一下
在这里插入图片描述

这里是指定用户名为admin,密码为pass
接下来windows的ida中远程调试
先下4个断点,分别是最后两个strcpy,第二个sprintf,以及exec_sql
在这里插入图片描述

首先要在ida中设置debugger options
在这里插入图片描述

上面是目标程序在linux中的完整地址,下面分别是linux的ip一起在脚本里指定的端口
然后debugger->attach to process
在这里插入图片描述

选择第一个
载入之后,点击运行,命中第一个断点
在这里插入图片描述

a1寄存器指向的地址为76fd11f7,在hex-view中按G键,输入该地址跳过去
在这里插入图片描述

可以看到是我们输入的用户名
继续运行,命中第二个断点,同样跟到a1寄存器指向的地址
在这里插入图片描述

可以看到,是我们输入的密码
在这里插入图片描述

继续运行
在这里插入图片描述

注意到三个寄存器一起指向了bss段的sql变量,同样在hex-view中跟踪,可以看到此时还是空的
f8单步
在这里插入图片描述

这时可以看到用户名和密码格式化一个 sql 语句,之后就是会调用exec_sql执行了
继续运行,就命中了第四个断点exec_sql
在这里插入图片描述

看到a1寄存器的值为指向sql字符串的指针。
在上面的分析过程中我们看到,用户名和密码不经过滤就直接传入,拼接sql语句并传入exec_sql,执行sqlite3的执行语句。
那么我们就可以考虑在后台登录时,使用sql注入进行攻击(sql万能密码)。
我们这里用最简单的,传入的密码为or ‘1’=‘1,url编码为%20or%20’1’%3D’1
接下来同样动态进行动态调试
在这里插入图片描述

取消前三个断点,在ida中直接运行,命中exec_sql处的断点,根据a1寄存器指向的位置
在这里插入图片描述

可以看到我们进入的注入payload确实没有过滤掉,是可以直接执行的。
如果手头有路由器的同学可以自行尝试注入,由于firmadyne无法模拟该固件,所以本次实验到此结束。

参考:
http://www.devttys0.com/

以上是关于TEW-654TR注入漏洞的主要内容,如果未能解决你的问题,请参考以下文章

OGNL表达式注入漏洞总结

sql注入漏洞都有哪些

可怕的漏洞,SQL注入漏洞实战演习

如何防范SQL注入漏洞及检测

SQL注入漏洞扫描工具都有哪些

SQL注入漏洞的判断