1 概述
TEW-654TR路由器SQL注入
2 实验
访问路由器后台登录的web界面抓包,可以看到html登录页面会将我们提交的用户名密码等提交给my_cgi.cgi
接下来下载该路由器固件,是一个zip文件:unzip FW_TEW-654TR_v1.0R\(1.10.12\).zip,解压之后使用binwalk对bin文件进行提取,进入文件夹即可发现提取的文件系统
找到my_cgi.cgi,使用IDA进行分析
根据burp中看到的request关键字,在strings window进行搜索。然后查看交叉引用,进入到main函数。
在其之前会调用getenv(“REQUEST_METHOD”)(C 库函数 char *getenv(const char *name) 搜索 name 所指向的环境字符串,并返回相关的值给字符串)
下面这部分(loc_10914c),会从栈上恢复s0-s7,fp,ra的值。接着jr ra 重新调用getenv,
如果getenv返回则判断是否为get方法,如果是get,则往左走,直接跳到结束位置
否则继续往右走,获取content_length,content_type,remote_addr等
继续往下,可以看到有打开数据库的动作
查看文件里包含的数据库文件,发现是sqlite3,可以连接sqlite3,查看表等,能直接拿到密码等。
继续通过IDA分析发现是调用open_db,get_input_entries,check_remote_ip
接着是判断参数request的值是login,show_message等字符串,进行比较
传入的是login
可以看到来到了loc_409a6c,
409a6c是指向do_main,跟如发现是查询用户名密码的sql语句。这里就是登录判断校验地方。
关键点是strcpy,然后strlen计算长度,通过memset初始化空间为0
然后通过sprintf格式化,输入的用户名密码就被带入该字符串,再条用exec_sql进行执行
exec_sql在libdbapi.so.1.0.0中找到了该函数,确实调用了sqlite3_exec,但是并没有做任何过滤操作,这就说明sql语句参数可控,可能存在sql注入
通过IDA动态调试分析漏洞
首先先写一个shell脚本
记得我们前面分析的,会提取content_length,content_type,remote_addr,所以用-E设置env,-g指定了gdb远程调试的端口
需要使用qemu-mipsel-static(用户仿真器),将其复制过来,
cp $(which qemu-mipsel-static) ./
然后编写脚本:vim cgi.sh
#! /bin/sh INPUT= "$1" LEN=$(echo -n "$INPUT"|wc -c) echo $INPUT | chroot . . /qemu-mipsel-static -E REMOTE_ ADDR="127.0.0.1" -E CONTENT_ TYPE="multipart/x-form-data" -E REQUEST_ METHOD="POST" -g 1234 -E CONTENT_LENGTH=$LEN ./usr/bin/my_ cgi.cgi
然后运行脚本:bash cgi.sh “request=login&user_name=admin&user_pwd=pass”
然后使用IDA连接远程调试,Debugger-》GDB调试
然后再次Debugger->process options-》设定远程连接 10.1.1.10是运行cgi.sh的ubuntu机器地址。
然后先下4个断点,分别是最后两个strcpy,第二个sprintf,以及exec_sql
运行后第一个断点,查看A1,A1地址里面的内容,是输入的用户名
第二个断点再次跟如A1,发现是密码
继续运行至第三个断点,发现三个寄存器均指向了bss段的sql变量,但是地址中内容还是空的
再次运行到第四个断点,执行exec_sql。可以看到A1寄存器的值指向sql字符串指针。
基于上面分析,发现存在sql注入,那么就可以考虑在登录时使用sql万能密码。传入密码为:or ‘1’=’1,再进行URL编码:%20or%20’1’%3D’1
使用脚本重新发送动态包,取消前三个断点,再次分析。发现确实没有过滤
只是针对该固件调试,无法模拟。