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注入漏洞的主要内容,如果未能解决你的问题,请参考以下文章