爬虫逆向案列 ---《某采购网ck反爬》

网站接口:aHR0cDovL3d3dy55bmdwLmNvbS9wYWdlL3Byb2N1cmVtZW50L3Byb2N1cmVtZW50TGlzdC5odG1s

  • 首先分析ck是怎么生成的?
    1. 访问首页获取
    2. 通过js代码逆向获取
    3. 其它页面返回
    4. 访问接口,返回一段js代码,分析js代码获取ck
      所以,ck一般是在网页端的文档中的html可以观察到。
  • 刷新网址我们可以看到:
    1. 第一次访问首页返回了:PYCCV和一段js
      eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('i n$=[\'\\q\\f\\a\\4\\k\\k\\3\\o\\p\\3\',\'\\q\\m\\4\\c\\B\\4\\o\\g\\m\\3\\6\',\'\\q\\w\\a\\4\\k\\k\\3\\o\\p\\3\\G\\7\\6\\b\'];$(n$[0])["\\g\\a\\7\\m"]();$(y(){F(y(){i 9={};i 8;i 5=A;i j=I["\\v\\g\\3\\6\\E\\p\\3\\o\\e"]["\\e\\7\\H\\7\\m\\3\\6\\w\\4\\g\\3"]();5=5*C;(8=j["\\b\\4\\e\\f\\a"](/D ([\\d.]+)/))?9["\\h\\3"]=8[l]:(8=j["\\b\\4\\e\\f\\a"](/J\\/([\\d.]+)/))?9["\\c\\h\\6\\3\\c\\7\\t"]=8[l]:(8=j["\\b\\4\\e\\f\\a"](/T\\/([\\d.]+)/))?9["\\f\\a\\6\\7\\b\\3"]=8[l]:(8=j["\\b\\4\\e\\f\\a"](/S.([\\d.]+)/))?9["\\7\\x\\3\\6\\4"]=8[l]:(8=j["\\b\\4\\e\\f\\a"](/R\\/([\\d.]+).*U/))?9["\\g\\4\\c\\4\\6\\h"]=8[l]:V;5=5+Q;r(9["\\h\\3"]||9["\\c\\h\\6\\3\\c\\7\\t"]||9["\\f\\a\\6\\7\\b\\3"]||9["\\7\\x\\3\\6\\4"]||9["\\g\\4\\c\\4\\6\\h"]){5=(5*L+K);r(5<s)5=5+z;i u=$(n$[1]);r(5>z)5=P["\\c\\k\\7\\7\\6"](5/s);u["\\O\\4\\k"](5);$(n$[2])["\\g\\v\\N\\b\\h\\e"]()}},M)});',58,58,'|||x65|x61|x08c924|x72|x6f|x0fcad9|x06dd1a|x68|x6d|x66||x74|x63|x73|x69|var|x01c264|x6c|0x1|x77|_|x6e|x67|x23|if|0x7b|x78|x0b515d|x75|x43|x70|function|0x929|0x4a|x5f|0x53|msie|x41|setTimeout|x46|x4c|navigator|firefox|0x7|0x3|0x3e8|x62|x76|Math|0x0a|version|opera|chrome|safari|0x0'.split('|'),0,{}))
    2. 第二次则带上第一次返回的ck再次发送请求,注意:这次是post请求,携带了一个answer表单数据。

    3. 第三次则带上第二次返回的ck发送请求,则可以正常访问该网站。

  • 接下来,我们继续分析第一次请求获取的js代码,观察该代码有什么具体用途:
    1. 观察代码我们可以看到,该代码是一个eval加密的代码,我们可以使用execjs库中的eval解密:
      得到var _$=['\x23\x63\x68\x61\x6c\x6c\x65\x6e\x67\x65','\x23\x77\x61\x66\x5f\x61\x6e\x73\x77\x65\x72','\x23\x43\x68\x61\x6c\x6c\x65\x6e\x67\x65\x46\x6f\x72\x6d'];$(_$[0])["\x73\x68\x6f\x77"](); $(function(){setTimeout(function(){var x06dd1a={};var x0fcad9;var x08c924=0x14;var x01c264=navigator["\x75\x73\x65\x72\x41\x67\x65\x6e\x74"]["\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65"]();x08c924=x08c924*0x29;(x0fcad9=x01c264["\x6d\x61\x74\x63\x68"](/msie ([\d.]+)/))?x06dd1a["\x69\x65"]=x0fcad9[0x1]:(x0fcad9=x01c264["\x6d\x61\x74\x63\x68"](/firefox\/([\d.]+)/))?x06dd1a["\x66\x69\x72\x65\x66\x6f\x78"]=x0fcad9[0x1]:(x0fcad9=x01c264["\x6d\x61\x74\x63\x68"](/chrome\/([\d.]+)/))?x06dd1a["\x63\x68\x72\x6f\x6d\x65"]=x0fcad9[0x1]:(x0fcad9=x01c264["\x6d\x61\x74\x63\x68"](/opera.([\d.]+)/))?x06dd1a["\x6f\x70\x65\x72\x61"]=x0fcad9[0x1]:(x0fcad9=x01c264["\x6d\x61\x74\x63\x68"](/version\/([\d.]+).*safari/))?x06dd1a["\x73\x61\x66\x61\x72\x69"]=x0fcad9[0x1]:0x0;x08c924=x08c924+0x0a; if(x06dd1a["\x69\x65"]||x06dd1a["\x66\x69\x72\x65\x66\x6f\x78"]||x06dd1a["\x63\x68\x72\x6f\x6d\x65"]||x06dd1a["\x6f\x70\x65\x72\x61"]||x06dd1a["\x73\x61\x66\x61\x72\x69"]){x08c924=(x08c924*0x3+0x7);if(x08c924<0x7b)x08c924=x08c924+0x929;var x0b515d=$(_$[1]);if(x08c924>0x929)x08c924=Math["\x66\x6c\x6f\x6f\x72"](x08c924/0x7b);x0b515d["\x76\x61\x6c"](x08c924); $(_$[2])["\x73\x75\x62\x6d\x69\x74"]()}},0x3e8)});
      观察代码发现是一个混淆的代码:我们继续使用v_jstools插件进行还原,得到:
        var _$ = ["#challenge", "#waf_answer", "#ChallengeForm"];
        $(_$[0]).show();
        $(function () {
          setTimeout(function () {
            var x06dd1a = {};
            var x0fcad9;
            var x08c924 = 20;
            var x01c264 = navigator.userAgent.toLowerCase();
            x08c924 = x08c924 * 41;
      
            if (x0fcad9 = x01c264.match(/msie ([\d.]+)/)) {
              x06dd1a.ie = x0fcad9[1];
            } else {
              if (x0fcad9 = x01c264.match(/firefox\/([\d.]+)/)) {
                x06dd1a.firefox = x0fcad9[1];
              } else {
                if (x0fcad9 = x01c264.match(/chrome\/([\d.]+)/)) {
                  x06dd1a.chrome = x0fcad9[1];
                } else {
                  if (x0fcad9 = x01c264.match(/opera.([\d.]+)/)) {
                    x06dd1a.opera = x0fcad9[1];
                  } else {
                    if (x0fcad9 = x01c264.match(/version\/([\d.]+).*safari/)) {
                      x06dd1a.safari = x0fcad9[1];
                    } else {
                      0;
                    }
                  }
                }
              }
            }
      
            x08c924 = x08c924 + 10;
      
            if (x06dd1a.ie || x06dd1a.firefox || x06dd1a.chrome || x06dd1a.opera || x06dd1a.safari) {
              x08c924 = x08c924 * 3 + 7;
              if (x08c924 < 123) x08c924 = x08c924 + 2345;
              var x0b515d = $(_$[1]);
              if (x08c924 > 2345) x08c924 = Math.floor(x08c924 / 123);
              x0b515d.val(x08c924);
              $(_$[2]).submit();
            }
          }, 1000);
        });
      
      观察发现是一个jq代码,去除之后得到:
        var _$ = ["#challenge", "#waf_answer", "#ChallengeForm"];
        var x06dd1a = {};
        var x0fcad9;
        var x08c924 = 20;
        var x01c264 = navigator.userAgent.toLowerCase();
        x08c924 = x08c924 * 41;
      
        if (x0fcad9 = x01c264.match(/msie ([\d.]+)/)) {
          x06dd1a.ie = x0fcad9[1];
        } else {
          if (x0fcad9 = x01c264.match(/firefox\/([\d.]+)/)) {
            x06dd1a.firefox = x0fcad9[1];
          } else {
            if (x0fcad9 = x01c264.match(/chrome\/([\d.]+)/)) {
              x06dd1a.chrome = x0fcad9[1];
            } else {
              if (x0fcad9 = x01c264.match(/opera.([\d.]+)/)) {
                x06dd1a.opera = x0fcad9[1];
              } else {
                if (x0fcad9 = x01c264.match(/version\/([\d.]+).*safari/)) {
                  x06dd1a.safari = x0fcad9[1];
                } else {
                  0;
                }
              }
            }
          }
        }
      
        x08c924 = x08c924 + 10;
      
        if (x06dd1a.ie || x06dd1a.firefox || x06dd1a.chrome || x06dd1a.opera || x06dd1a.safari) {
          x08c924 = x08c924 * 3 + 7;
          if (x08c924 < 123) x08c924 = x08c924 + 2345;
          if (x08c924 > 2345) x08c924 = Math.floor(x08c924 / 123);
      }
      
      进一步运行js发现PYCCV 的值就等于计算后的 x08c924值。这里需要注意:需要补navigator.userAgent环境,但是运行多次发现x08c924该值一直没有改变,那么肯定就是获取的js代码发生了改变。
      经过多次js代码的获取解密发现:发生改变的地方有三处:

      这三个变量我们该如何获取呢?
      • 我们可以通过execjs.eval将js代码解密,然后通过正则匹配获取
        例如:
          num1 = re.findall(';var x08c924=(.*?);var',execjs.eval(str))[0]
          num2 = re.findall(';x08c924=x08c924\*(.*?);',execjs.eval(str))[0]
          num3 = re.findall(';x08c924=x08c924\+(.*?);',execjs.eval(str))[0]
        
  • 最后,发送三次请求,成功获取页面:

注意:

  1. 该内容如有侵权,请及时联系vx:wzwzwz0613;
  2. 该文章仅用于参考学习,不得用商业用途;
  3. 需要交流学习爬虫逆向,可联系我进v群;
posted @ 2024-02-03 16:51  带带弟弟学逆向  阅读(132)  评论(0)    收藏  举报