type
status
date
slug
summary
tags
category
icon
password

程序分析

这个固件是用的luci框架编写的,其中/etc/config/luci通常是luci框架的配置文件,/usr/lib/lua/luci 通常是 LuCI 框架的核心文件所在的目录
Luci采用的是MVC的Web框架,即Model、View、Controller

 
这里我们最先做的事找到无鉴权的API接口
显然,此类固件的cgi部分是用Lua所写的。我们既然想要挖未授权的漏洞,那么首先就要找到无鉴权的API接口,定位到/usr/lib/lua/luci/controller/eweb/api.lua文件。
可以看到,只有对/cgi-bin/luci/api/auth发送请求的时候,不需要权限验证
在 LuCI 的控制器中注册一个路由条目(entry),让 URL 路径/api/auth对应执行rpc_auth函数。同时设置sysauth = false表示这个接口不需要用户登录认证(即“免登录访问”,不需要认证,可以匿名访问)。
这意味着当用户访问 /api/auth 路径时,将调用 rpc_auth 函数。在 luci 框架中 sysauth 属性控制是否需要系统级的用户认证才能访问该路由,这里的 sysauth 属性为 false ,表示无需进行系统认证即可访问。
这个就是我们要找的无鉴权的api接口,之后我们看这个接口的具体作用
 
这个接口调用rpc_auth函数
这里首先引入4个模块,这几个模块其实都是对应的不同文件,
  • jsonrpc:用于处理 JSON-RPC 请求。
  • http:用于处理 HTTP 请求和响应。
  • ltn12:用于处理数据流。
  • _tbl:假设是一个包含无认证功能的模块(noauth),用于处理实际的 JSON-RPC 方法。
然后获取 HTTP_CONTENT_LENGTH 的长度是否大于 1000 字节,如果不大于的话会将准备 HTTP 响应的类型设置为 application/json
 
之后重点看
 
这里用/usr/lib/lua/luci/utils/jsonrpc.lua中的handle及其相关函数,可以得知这里通过JSON数据的method字段定位并调用noauth.lua中对应的函数,同时将Json数据的params字段内容作为参数传入。
 
 
 
house of系列CNVD-2013-11625复现
Loading...