Skip to content

Instantly share code, notes, and snippets.

@inogo
Created January 19, 2017 13:25
Show Gist options
  • Save inogo/3ded00c5889f19498b1abbd7810e502b to your computer and use it in GitHub Desktop.
Save inogo/3ded00c5889f19498b1abbd7810e502b to your computer and use it in GitHub Desktop.
PHP NTLM Authentication
<?php // by SiMM
$headers = apache_request_headers(); // получаем все заголовки клиента
if (!isset($headers['Authorization'])) { // если заголовка авторизации нет
header('HTTP/1.0 401 Unauthorized'); // требуем от клиента авторизации
header('WWW-Authenticate: NTLM'); // тип требуемой авторизации - NTLM
exit; // завершаем выполнение скрипта
}
// заголовок авторизации от клиента пришёл
if (substr($headers['Authorization'],0,5) == 'NTLM ') { // проверяем, что это NTLM-аутентификация
$chain = base64_decode(substr($headers['Authorization'],5)); // получаем декодированное значение
switch (ord($chain{8})) { // смотрим номер этапа процесса идентификации
case 3: // этап 5 - приём сообщения type-3
foreach (array('LM_resp','NT_resp','domain','user','host') as $k=>$v) {
extract(unpack('vlength/voffset',substr($chain,$k*8+14,4)));
$val = substr($chain,$offset,$length);
echo "$v: ".($k<2 ? hex_dump($val) : iconv('UTF-16LE','CP1251',$val))."<br>\r\n";
}
exit;
case 1: // этап 3
if (ord($chain{13}) == 0xB2) { // проверяем признак NTLM 0xb2 по смещению 13 в сообщении type-1:
$chain = "NTLMSSP\x00".// протокол
"\x02" /* номер этапа */ ."\x00\x00\x00\x00\x00\x00\x00".
"\x28\x00" /* общая длина сообщения */ ."\x00\x00".
"\x01\x82" /* признак */ ."\x00\x00".
"\x00\x02\x02\x02\x00\x00\x00\x00". // nonce
"\x00\x00\x00\x00\x00\x00\x00\x00";
header('HTTP/1.0 401 Unauthorized');
header('WWW-Authenticate: NTLM '.base64_encode($chain)); // отправляем сообщение type-2
exit;
}
}
} else {
echo 'Ваш интернет-обозреватель или используемый прокси-сервер несовместим с NTLM';
}
function hex_dump($str){ // вспомогательная функция, возвращает шестнадцатеричный дамп строки
return substr(preg_replace('#.#se','sprintf("%02x ",ord("$0"))',$str),0,-1);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment