正文
以下是从公告中获取的漏洞信息,知道了触发页面在诊断(diagnostic)中,参数就是host。
对应页面内容
点击按钮后抓包,发了三个包,第一个是put,但是参数被加密了,后面两个包是get类型,应该是获取结果。
上面的抓包获取了/cgi-bin/DAL?oid=PINGTEST这个关键信息,那么直接关键词在zhttpd中搜索即可,来到了cgi-bin_DAL这个函数。
(注:下文后面我贴的所有ida中看到的程序的代码,我都做了删改和注释,帮助快速看懂关键代码)
int __fastcall cgi_bin_DAL(int a1, unsigned __int8 a2)
{
RdmObjHandler = 0;
v34 = 0;
oid = 0;
method = 0;
oid = (char *)cg_http_vallist_getvalue((a1 + 672), (int)"oid");
method = (char *)cg_http_request_getmethod(a1);
v23 = json_object_new_object(v2);
if ( !strcmp(method, "POST") || !strcmp(method, "PUT") )
{
v24 = cg_string_getvalue((a1 + 4));
v3 = cg_http_packet_getheaderlonglong(a1, "Content-Length");
v34 = (char *)json_tokener_parse(v24, HIDWORD(v3));
insertLoginUserInfo((int)v34, a1 + 680, a1 + 712);
RdmObjHandler = zcfgFeDalHandler((int)oid, (int)method, (int)v34, 0, (int)s);
}
}
zcfgFeDalHandler这个函数在libzcfg_fe_dal.so中,继续跟进代码。这里的全局变量dalHandler,跟进后可确认就是handler表,保存oid值和对应处理函数。
int __fastcall zcfgFeDalHandler(char *oid, const char *method, int a3, int a4, char *dest)
{
if ( !oid )
return 0;
v9 = 0;
v10 = 24;
while ( 1 )
{
v11 = *(&dalHandler + v10 * v9);
if ( !v11 )
{
v12 = 0;
goto LABEL_7;
}
v15 = v10;
if ( !strcmp(oid, v11) )
break;
v10 = v15;
++v9;
}
v12 = 1;
LABEL_7:
printf("handlerName=%s method=%s i=%d\n", oid, method, v9);
v14 = 24 * v9;
if ( !j_parseValidateParameter(a3, method, *(&dalHandler + v14), *(&dalHandler + v14 + 4), dest) )
return -17;
if ( !*(&dalHandler + v14 + 8) )
return 0;
return (*(&dalHandler + v14 + 8))(method, a3, a4, dest);
}
表中pingtest对应如下,这里很容易判断出zcfgFeDalPingTest就是处理函数。
跟进zcfgFeDalPingTest,其中还有多处调用,这里就忽略了,直接来到最后一层关键函数zcfgFeDalIpDiagIPPingEdit。
int __fastcall zcfgFeDalIpDiagIPPingEdit(int