欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

路由器漏洞挖掘之 TEW_645TR_1.12 sql 注入分析

来源:本站整理 作者:佚名 时间:2019-08-13 TAG: 我要投稿

这次再来复现一个路由器的 sql 注入类型的漏洞。在实际环境中可能注入会比较少见,而且这个洞也比较老了,但是为了掌握更大的漏洞攻击面还是有必要去接触的。
 
漏洞分析
环境搭建
还是使用 qemu-user 模式,同样的还是编写一个 sh 脚本:
#!/bin/bash
INPUT="$1"
LEN=$(echo -n "$INPUT"|wc -c)
DEBUG="$2"
if [ "$DEBUG" == "-d" ]
then
echo $INPUT | chroot . ./qemu -E REMOTE_ADDR="127.0.0.1" -E CONTENT_TYPE="multipart/x-form-data" -E REQUEST_METHOD="POST" -g 23946 -E CONTENT_LENGTH=$LEN ./usr/bin/my_cgi.cgi
else
echo $INPUT | chroot . ./qemu -E REMOTE_ADDR="127.0.0.1" -E CONTENT_TYPE="multipart/x-form-data" -E REQUEST_METHOD="POST" -E CONTENT_LENGTH=$LEN ./usr/bin/my_cgi.cgi
fi
不带调试的运行结果:

使用 IDA 进行动态调试发现已经将我们的输入直接拼接到 bss 段的 sql 变量中

 
漏洞分析
在进行漏洞分析时,还发现了存在多处的栈溢出漏洞。
多处栈溢出
在 do_login 函数的开头,s1 寄存器的值为 “request”:

在执行第一个 strcpy 函数时,直接将 user_name 的值复制到栈上,导致栈溢出

同样在执行第二个 strcpy 函数之前,在右边的 general register 窗口中跟进 a1 寄存器的值(在 a1 寄存器上右键,Jump in a new window)

同样使用 Ghidra 9.0 的反汇编窗口中也可以很清楚看到这个漏洞,*(iParm1 + 0x299) 和 *(iParm1 + 0x512) 分别为传入的 user_name 和 user_pass

继续往下分析,又有一个危险函数 sprintf ,这里会将用户名和密码格式化一个 sql 语句到 bss 段的 sql 变量,所以按理说如果输入的 user_name 或者 user_pass 过长,那么这里也是存在一处 bss 溢出的。

Ghidra 中的代码:
sprintf(sql,"select level from user where user_name='%s' and user_pwd='%s'",&local_60,&local_40);
接着会往下执行 exec_sql 函数来执行 sql 函数,这里先 f8 步过

这里执行 sql 查询以及下面的判断如下,经过 exec_sql 函数的执行之后,取得返回值来判断登录的状态
 iVar1 = exec_sql(my_db,sql,__ptr);
  if (iVar1 == 0) {
    if (*(int *)((int)__ptr + 0x4f200) == 0) {
      __n_00 = strlen(sql);
      memset(sql,0,__n_00);
      sprintf(sql,"select level from user where user_name='%s'",&local_60);
      iVar2 = exec_sql(my_db,sql,__ptr);        // 无过滤直接拼接 SQL 语句
      if (iVar2 == 0) {
        if (*(int *)((int)__ptr + 0x4f200) == 0) {
          uVar2 = *strings;
        }
        else {
          uVar2 = strings[1];
        }
        add_msg(uVar2,"login");
      }
      free(__ptr);
      set_redirect_page(&DAT_00417e98);
      return;
    }
    iVar2 = atoi((char *)((int)__ptr + 0x20));
    iVar2 = add_login_user(uParm3,iVar2);
    if (iVar2 == 0) {
      add_msg(strings[3],"login");
      pcVar3 = "back";
    }
    else {
      if (iParm4 != 1) {

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载