Вообщем есть Auth.html в нём есть javascript (несколько функций) и форма ввода пароля заголовок формы: Code: <FORM METHOD="POST" ACTION="[B]/Forms/Auth_1[/B]" onSubmit="LoginClick(document.forms[0].hiddenPassword, document.forms[0].LoginPassword);"> <p> </p> Вопрос: Обработчик формы находится на стороне клиента, как я понял (javascript), т. е. мы можем подправить код javascripta (функций) и успешно авторизоваться? Или я ошибаюсь и он всё-таки на стороне сервера? В свойствах формы написано, что отправлять результат в "Custom ISAPI, NSAPI, CGI, оr ASP Script"
Если бы еще выложил функцию LoginClick, то можно было сказать, что можно сделать! Мое предположение, тут просто проверяется ровняются ли друг другу вереденые пароли!
Ну было бы лучше если всю форму привел и еще функцию LoginClick. Обрати внимание на Code: onSubmit="LoginClick(document.forms[0].hiddenPassword, document.forms[0].LoginPassword);" Это говорит нам что данные из формы 0 (скорее всего текущая), передаются в процедуру для дальнейшей обработки, скорее всего там проверяется все ли поля заполненны, а дальше скорее всего идет: document.forms[0].submit; Это и есть отправка формы на адрес который указан в заголовке формы в поле ACTION="/Forms/Auth_1" Так как запрос передается методом POST то в адресной строке никаких значений вроде ?do=newreply ты не увидишь. Собственно ответ ДА скорее всего ты ошибаешься и данные обрабатываются на стороне сервера!
Вся форма: Code: <FORM METHOD="POST" ACTION="/Forms/Auth_1" onSubmit="LoginClick(document.forms[0].hiddenPassword, document.forms[0].LoginPassword);"> <p> </p> <p> </p> <table width="420" border="0" cellspacing="0" cellpadding="0" align=center valign=middle height="180" bgcolor="#C4D3FD" name="Authentication"> <tr align=center> <td height="40" colspan="4" class="Auth">Prestige</td></tr><tr> <td height="50" class="Auth"> </td><td height="50" colspan="2" class="AuthDesc"><div align=center> Enter Password and click Login.</div></td><td height="50" class="Auth"> </td></tr><tr> <td height="40" class="Auth" width="40"> </td><td height="40" class="Auth" width="84">Password:</td><td height="40" class="Auth" width="274"><INPUT TYPE="PASSWORD" NAME="LoginPassword" SIZE="30" MAXLENGTH="30" VALUE="1234"><INPUT TYPE="HIDDEN" NAME="hiddenPassword" VALUE=""></td><td height="40" class="Auth" width="10"> </td></tr><tr> <td height="40" colspan="4" align=center > <INPUT TYPE="SUBMIT" NAME="Prestige_Login" VALUE="Login"> <INPUT TYPE=RESET NAME="Cancel" VALUE="Cancel" ></td></tr><tr> <td height="10" align=center colspan="2" > </td></tr></table></form><SCRIPT language="JavaScript"> <!-- document.forms[0].LoginPassword.select(); document.forms[0].LoginPassword.focus(); // --> </SCRIPT> </body> Функция: Code: function LoginClick(hiddenPassword, loginPassword) { var passwordStr = passwordMD5(loginPassword.value); hiddenPassword.value = passwordStr; loginPassword.value = "ZyXEL ZyWALL Series"; return; }
Это результ работы xSpider`a 7.5 ну и 3 шт. XSS он нашёл там, больше ничего серьёзного... Версия WEb-сервера ;-)
Форма куда отправляются данные. Имя переменной=ее значение&следующая переменная=... В данном случае все переменные пустые
Всё я уже понял, что сверка идёт на стороне сервера, а на стороне клиента пасс шифруется довольно интересным алгоритном (не простым Md5) и передаётся серверу, ввобщем надёжно защищён и если его перехватить то хрен расшифруеш... Но ведь если всё-таки отснифать его, можно будет подделать запрос и передать серверу - получим доступ к управлению конфигуратором, я прав?
извините я вот что то вас не понимаю. javascript - это у нас что??? единственная проверка пароля которую можно сделать с помощью ява скрипт это взять какию то шифровальные функции типо md5() (не помню как точно там будет функция) взять пароль из формы зашифровать в md5 и сравнить с тем что есть при этом сам зашифрованный md5 должен быть в коде страники... могут предприниматься какие то свои методы шифровки но они как правило не отличаються особой стойкостью. ps топик стартер не поял что написал в 1 посту. javascript работает только на стороне юзера но не как не сервера.
cash - я прекрасно понимаю, что javascript - работает на стороне клиента (юзера) пароль берётся из формы шифруется с применением md5 и в таком виде передаётся серверу, а само сравнение такого хэша осуществляется на сервере с хранимым (на стороне сервера, в данном случае в ROM) хэшем зашифрованного пасса.
Даже если как нибудь достанем этот хэш из памяти и потом воспользуемся обычным перебором (типа PasswordPro) тут не поможет - там ещё куча всяких операций со строкой md5(pass) производится (не уверен что обратимых). Вообщем буду снифать переменные передаваемые в POST, затем искать схожесть с тем, что хранится в ROM - памяти, скачал его содержимое по ftp. Хэш пасса сохраняется в энергонезависимой памяти, т. е. остаётся после выключения питания...
Может я чего то не понимаю, не хочу обидеть а хочу разобраться поймите меня верно. первый раз про это слышу это где? каким образом? может RAM ??? что такое ROM и как он туда попадает?
Ломаемый сабж - это железка ADSL-модем Zyxel Prestige 660R-61C - ломаем страницу входа в его web-конфигуратор. RОМ - Read Only Memory - но она Флеш-всё-таки - там хранятся настройки... и собственно сам ХЭШ пасса.
Выкладываю весь исходник страницы авторизации, а вы мне помогите, где тут сравнение хэшей пасса с тем что мы вводим и того, что на стороне сервера (модема)? Code: <html><head> <meta http-equiv="content-type" content="text/html;charset=iso-8859-1"> <meta name="generator" content="Microsoft FrontPage 4.0"> <link rel="stylesheet" type="text/css" href="content_ie.css"> <SCRIPT language="JavaScript"> <!-- if(top.location != self.location) { top.location.href = "rpAuth.html"; top.location.pathname = "rpAuth.html"; } var hex_chr = "0123456789abcdef"; function rhex(num) { var str = ""; for(var j = 0; j <= 3; j++) str += hex_chr.charAt((num >> (j * 8 + 4)) & 0x0F) + hex_chr.charAt((num >> (j * 8)) & 0x0F); return str; } function str2blks_MD5(str) { var nblk = ((str.length + 8) >> 6) + 1; var blks = new Array(nblk * 16); for(var i = 0; i < nblk * 16; i++) blks[i] = 0; for(i = 0; i < str.length; i++) blks[i >> 2] |= str.charCodeAt(i) << ((i % 4) * 8); blks[i >> 2] |= 0x80 << ((i % 4) * 8); blks[nblk * 16 - 2] = str.length * 8; return blks; } function add(x, y) { return ((x&0x7FFFFFFF) + (y&0x7FFFFFFF)) ^ (x&0x80000000) ^ (y&0x80000000); } function rol(num, cnt) { return (num << cnt) | (num >>> (32 - cnt)); } function cmn(q, a, b, x, s, t) { return add(rol(add(add(a, q), add(x, t)), s), b); } function ff(a, b, c, d, x, s, t) { return cmn((b & c) | ((~b) & d), a, b, x, s, t); } function gg(a, b, c, d, x, s, t) { return cmn((b & d) | (c & (~d)), a, b, x, s, t); } function hh(a, b, c, d, x, s, t) { return cmn(b ^ c ^ d, a, b, x, s, t); } function ii(a, b, c, d, x, s, t) { return cmn(c ^ (b | (~d)), a, b, x, s, t); } function calcMD5(str) { var x = str2blks_MD5(str); var a = 0x67452301; var b = 0xEFCDAB89; var c = 0x98BADCFE; var d = 0x10325476; for(var i = 0; i < x.length; i += 16) { var olda = a; var oldb = b; var oldc = c; var oldd = d; a = ff(a, b, c, d, x[i+ 0], 7 , 0xD76AA478); d = ff(d, a, b, c, x[i+ 1], 12, 0xE8C7B756); c = ff(c, d, a, b, x[i+ 2], 17, 0x242070DB); b = ff(b, c, d, a, x[i+ 3], 22, 0xC1BDCEEE); a = ff(a, b, c, d, x[i+ 4], 7 , 0xF57C0FAF); d = ff(d, a, b, c, x[i+ 5], 12, 0x4787C62A); c = ff(c, d, a, b, x[i+ 6], 17, 0xA8304613); b = ff(b, c, d, a, x[i+ 7], 22, 0xFD469501); a = ff(a, b, c, d, x[i+ 8], 7 , 0x698098D8); d = ff(d, a, b, c, x[i+ 9], 12, 0x8B44F7AF); c = ff(c, d, a, b, x[i+10], 17, 0xFFFF5BB1); b = ff(b, c, d, a, x[i+11], 22, 0x895CD7BE); a = ff(a, b, c, d, x[i+12], 7 , 0x6B901122); d = ff(d, a, b, c, x[i+13], 12, 0xFD987193); c = ff(c, d, a, b, x[i+14], 17, 0xA679438E); b = ff(b, c, d, a, x[i+15], 22, 0x49B40821); a = gg(a, b, c, d, x[i+ 1], 5 , 0xF61E2562); d = gg(d, a, b, c, x[i+ 6], 9 , 0xC040B340); c = gg(c, d, a, b, x[i+11], 14, 0x265E5A51); b = gg(b, c, d, a, x[i+ 0], 20, 0xE9B6C7AA); a = gg(a, b, c, d, x[i+ 5], 5 , 0xD62F105D); d = gg(d, a, b, c, x[i+10], 9 , 0x02441453); c = gg(c, d, a, b, x[i+15], 14, 0xD8A1E681); b = gg(b, c, d, a, x[i+ 4], 20, 0xE7D3FBC8); a = gg(a, b, c, d, x[i+ 9], 5 , 0x21E1CDE6); d = gg(d, a, b, c, x[i+14], 9 , 0xC33707D6); c = gg(c, d, a, b, x[i+ 3], 14, 0xF4D50D87); b = gg(b, c, d, a, x[i+ 8], 20, 0x455A14ED); a = gg(a, b, c, d, x[i+13], 5 , 0xA9E3E905); d = gg(d, a, b, c, x[i+ 2], 9 , 0xFCEFA3F8); c = gg(c, d, a, b, x[i+ 7], 14, 0x676F02D9); b = gg(b, c, d, a, x[i+12], 20, 0x8D2A4C8A); a = hh(a, b, c, d, x[i+ 5], 4 , 0xFFFA3942); d = hh(d, a, b, c, x[i+ 8], 11, 0x8771F681); c = hh(c, d, a, b, x[i+11], 16, 0x6D9D6122); b = hh(b, c, d, a, x[i+14], 23, 0xFDE5380C); a = hh(a, b, c, d, x[i+ 1], 4 , 0xA4BEEA44); d = hh(d, a, b, c, x[i+ 4], 11, 0x4BDECFA9); c = hh(c, d, a, b, x[i+ 7], 16, 0xF6BB4B60); b = hh(b, c, d, a, x[i+10], 23, 0xBEBFBC70); a = hh(a, b, c, d, x[i+13], 4 , 0x289B7EC6); d = hh(d, a, b, c, x[i+ 0], 11, 0xEAA127FA); c = hh(c, d, a, b, x[i+ 3], 16, 0xD4EF3085); b = hh(b, c, d, a, x[i+ 6], 23, 0x04881D05); a = hh(a, b, c, d, x[i+ 9], 4 , 0xD9D4D039); d = hh(d, a, b, c, x[i+12], 11, 0xE6DB99E5); c = hh(c, d, a, b, x[i+15], 16, 0x1FA27CF8); b = hh(b, c, d, a, x[i+ 2], 23, 0xC4AC5665); a = ii(a, b, c, d, x[i+ 0], 6 , 0xF4292244); d = ii(d, a, b, c, x[i+ 7], 10, 0x432AFF97); c = ii(c, d, a, b, x[i+14], 15, 0xAB9423A7); b = ii(b, c, d, a, x[i+ 5], 21, 0xFC93A039); a = ii(a, b, c, d, x[i+12], 6 , 0x655B59C3); d = ii(d, a, b, c, x[i+ 3], 10, 0x8F0CCC92); c = ii(c, d, a, b, x[i+10], 15, 0xFFEFF47D); b = ii(b, c, d, a, x[i+ 1], 21, 0x85845DD1); a = ii(a, b, c, d, x[i+ 8], 6 , 0x6FA87E4F); d = ii(d, a, b, c, x[i+15], 10, 0xFE2CE6E0); c = ii(c, d, a, b, x[i+ 6], 15, 0xA3014314); b = ii(b, c, d, a, x[i+13], 21, 0x4E0811A1); a = ii(a, b, c, d, x[i+ 4], 6 , 0xF7537E82); d = ii(d, a, b, c, x[i+11], 10, 0xBD3AF235); c = ii(c, d, a, b, x[i+ 2], 15, 0x2AD7D2BB); b = ii(b, c, d, a, x[i+ 9], 21, 0xEB86D391); a = add(a, olda); b = add(b, oldb); c = add(c, oldc); d = add(d, oldd); } return rhex(a) + rhex(b) + rhex(c) + rhex(d); } function passwordMD5(str) { var MDstring = calcMD5(str); return MDstring; } function LoginClick(hiddenPassword, loginPassword) { var passwordStr = passwordMD5(loginPassword.value); hiddenPassword.value = passwordStr; loginPassword.value = "ZyXEL ZyWALL Series"; return; } // --> </SCRIPT> <NOSCRIPT></head><body marginwidth="0" marginheight="0"> You must use a browser that supports JavaScript(such as Microsoft Internet Explorer or Netscape Navigator) to login the web configuration. </NOSCRIPT> <FORM METHOD="POST" ACTION="/Forms/rpAuth_1" onSubmit="LoginClick(document.forms[0].hiddenPassword, document.forms[0].LoginPassword);"> <p> </p> <p> </p> <table width="420" border="0" cellspacing="0" cellpadding="0" align=center valign=middle height="180" bgcolor="#C4D3FD" name="Authentication"> <tr align=center> <td height="40" colspan="4" class="Auth">Prestige 660R-61C</td></tr><tr> <td height="50" class="Auth"> </td><td height="50" colspan="2" class="AuthDesc"><div align=center> Enter Password and click Login.</div></td><td height="50" class="Auth"> </td></tr><tr> <td height="40" class="Auth" width="40"> </td><td height="40" class="Auth" width="84">Password:</td><td height="40" class="Auth" width="274"><INPUT TYPE="PASSWORD" NAME="LoginPassword" SIZE="30" MAXLENGTH="30" VALUE="1234"><INPUT TYPE="HIDDEN" NAME="hiddenPassword" VALUE=""></td><td height="40" class="Auth" width="10"> </td></tr><tr> <td height="40" colspan="4" align=center > <INPUT TYPE="SUBMIT" NAME="Prestige_Login" VALUE="Login"> <INPUT TYPE=RESET NAME="Cancel" VALUE="Cancel" ></td></tr><tr> <td height="10" align=center colspan="2" > </td></tr></table></form><SCRIPT language="JavaScript"> <!-- document.forms[0].LoginPassword.select(); document.forms[0].LoginPassword.focus(); // --> </SCRIPT> </body></html> ИМХО тут этого нет, значит проверка идёт на сервере, тут / Forms/rpAuth_1
Там все хитрые операции реализуют самый что нинаесть оригинальный алгоритм MD5. Значит на сервак с формы 110% уходит просто мд5-хэш пасса, которого ты написал. Тогда с уверенностью в 75% можно сказать, что где-то на серваке хранится хэш, с которым сравнивается то что пришло с формы и если они - "одно и тоже" - то авторизовался) Тока не оч понятно для чего пасс из поля loginPassword.value перекачевал в hiddenPassword.value??? Если б с той стороны обработчиком был PHP, то скрипт выглядел бы примерно так: Code: <? if(isset($_POST["hiddenPassword"])) { if(CheckPasswd($_POST["hiddenPassword"])) { // Действия при правильной авторизации } else { // Пасс - левый } } ?>
Ява скрипт с нашей стороны а ПХП со стороны сервера... .посмотри там может быть указанно что отправить только пароль и имя на проверку ... ..