在前面的内容中,我们使用了TEW-654TR路由器的tftp服务来获取目标的管理权限。但是tftp不对外网开放怎么办?另辟蹊径:在本文中,我们将分析一个Web应用程序中的漏洞。初步分析使用代理软件抓取登录时的数据包,可以看到如上图发送的http请求。数据被发送到my_cgi.cgi脚本。我们分析一下这个文件看看。?rootfsgit:(master)?找到.-namemy_cgi.cgi./usr/bin/my_cgi.cgi?rootfsgit:(master)?文件./usr/bin/my_cgi.cgi./usr/bin/my_cgi.cgi:ELF32-bitLSBexecutable,MIPS,MIPS-IIversion1(SYSV),动态链接(使用sharedlibs),stripped通过抓包我们知道用户在登录页面输入的两个参数是'user_name'和'user_pwd'',那么我们在CGI脚本中搜索这两个字符串就可以看到。有几行字符串好像是sql查询语句,尤其是:selectlevelfromuserwhereuser_name='%s'anduser_pwd='%s'看来应该是根据用户名去数据库查询和密码看密码是否正确。通过上一篇文章的分析我们可以知道,这款路由器使用SQLite作为数据库来存储密码。使用IDA加载my_cgi.cgi。查询“selectlevelfromuserwhereuser_name”字符串以定位do_login函数。假设&猜测用户提交的用户名和密码很可能被传递给sprintf函数生成SQL语句。存放在sql变量中,***进入exec_sql函数。看起来这个过程没有转义数据。除非在进入do_login函数之前或者exec_sql中对数据进行转义,否则可能存在SQL注入漏洞。如果我们的假设是正确的,数据没有经过处理并进入SQL语句,那么我们可以使用最传统的***密码来绕过登录验证:'or'1'='1***执行的sqlis会变成selectlevelfromuserwhereuser_name='admin'anduser_pwd=''or'1'='1'这样查询语句就会返回成功的结果。为了验证猜想,我们来做实验:果然和我们预想的一样。这里需要注意的是,能够以管理员身份登录需要一定的运气。我们构造的SQL语句的where条件是or1=1,所以会返回所有的数据。正好管理员的记录是***,所以我就以管理员的身份登录了。如果第一个条目是普通用户的数据,那么你将以普通用户身份登录。为了保证必须以管理员身份登录,可以构造如下语句:'orlevel=(selectlevelfromuserorderbyleveldesclimit1)/*以上语句可以保证数据机房的级别***查询的是***用户数据。这次我们终于看到了逆向工程的冰山一角。下一篇文章将讨论使用Qemu虚拟机运行路由器固件和动态调试相关内容。
