NetGear多款路由器遠端命令注入漏洞分析(更新補丁分析)

寒江雪語發表於2016-12-22

轉自:http://bobao.360.cn/learning/detail/3287.html

本不想寫這個文章的,只是在評論作者的問題時,提示字數太多,我一再縮減字數,發現還是評論不了,沒辦法呢只能在此寫下問題,評論個連線:

本人在分析時,基本上也是按照原作者的文章來的,只是發下原作者寫的有些問題,這裡說明下:

==========================================================

按照博主傳遞的命令,v24確實為1 (程式碼在下面)
分析了下,這個可以對傳入的引數分為兩種情況,

一種是xxx.xxx.xxx.xxx/cgi-bin/;command     # cgi-bin後面只有一個/

而是xxx.xxx.xxx.xxx/cgi-bin/;command/xxxxxx    # cgi-bin後面只有多個/

(其實這兩種情況直接結果是一樣的,具體看程式碼)

 v19 = strchr(v12, 47);
        v20 = v19 + 1;                          // ;kill
        v21 = v19;                              // /;kill
        v22 = strchr(v19 + 1, 47);              // v22=0
        memset(&v50, 0, 0x40u);                 // v50init
        v23 = (char)v21;    //v21第一個/的位置,v22第二個/的位置(如果有)
        if ( v21 )
          v23 = 1;
        v24 = v22 == 0;   //v24 = 1
        if ( v22 )
          v24 = v21 == 0;
        if ( v24 )
        {//   /;kill  走這個流程
        //xxx.xxx.xxx.xxx/cgi-bin/;kill
          if ( v22 )
            v25 = 0;
          else
            v25 = v23 & 1;
          if ( v25 )
            strcpy((char *)&v50, v20);
        }
        else
        {
        //    /;kill/xxxxxxx走這個流程, 下面這個拷貝命令目的是取 兩個/之間的字串
        // xxx.xxx.xxx.xxx/cgi-bin/;ls/xxxxxx  和 xxx.xxx.xxx.xxx/cgi-bin/;ls 效果是一樣的,前面一種/後的xxxxxx會被忽略
          strncpy((char *)&v50, v20, v22 - 1 - v21);// v50=;kill
          if ( acosNvramConfig_match((int)&unk_F0378, (int)"2") )
            printf("\r\n#############tmp1=%s,tmp2=%s,tmp3=%s,cgi=%s\r\n", v12, v21, v22, &v50);
          v15 = &v46;
          strcpy((char *)&v46, v22);
          if ( acosNvramConfig_match((int)&unk_F0378, (int)"2") )
          {
            v16 = "\r\n###############%s(%d)path_info=%s\r\n";
            v17 = 110;
            v18 = "netgear_commonCgi";
            goto LABEL_34;
          }
        }

測試結果:


相關文章