shell bypass 403
<?php namespace smpp\helpers; /** * Class capable of encoding GSM 03.38 default alphabet and packing octets into septets as described by GSM 03.38. * Based on mapping: http://www.unicode.org/Public/MAPPINGS/ETSI/GSM0338.TXT * * Copyright (C) 2011 OnlineCity * Licensed under the MIT license, which can be read at: http://www.opensource.org/licenses/mit-license.php * @author hd@onlinecity.dk */ class GsmEncoderHelper { /** * Encode an UTF-8 string into GSM 03.38 * Since UTF-8 is largely ASCII compatible, and GSM 03.38 is somewhat compatible, unnecessary conversions are removed. * Specials chars such as € can be encoded by using an escape char \x1B in front of a backwards compatible (similar) char. * UTF-8 chars which doesn't have a GSM 03.38 equivalent is replaced with a question mark. * UTF-8 continuation bytes (\x08-\xBF) are replaced when encountered in their valid places, but * any continuation bytes outside of a valid UTF-8 sequence is not processed. * * @param string $string * @return string */ public static function utf8ToGsm0338(string $string): string { $dict = [ '@' => "\x00", '£' => "\x01", '$' => "\x02", '¥' => "\x03", 'è' => "\x04", 'é' => "\x05", 'ù' => "\x06", 'ì' => "\x07", 'ò' => "\x08", 'Ç' => "\x09", 'Ø' => "\x0B", 'ø' => "\x0C", 'Å' => "\x0E", 'å' => "\x0F", 'Δ' => "\x10", '_' => "\x11", 'Φ' => "\x12", 'Γ' => "\x13", 'Λ' => "\x14", 'Ω' => "\x15", 'Π' => "\x16", 'Ψ' => "\x17", 'Σ' => "\x18", 'Θ' => "\x19", 'Ξ' => "\x1A", 'Æ' => "\x1C", 'æ' => "\x1D", 'ß' => "\x1E", 'É' => "\x1F", 'А' => "\x04\x10", 'Б' => "\x04\x11", 'В' => "\x04\x12", 'Г' => "\x04\x13", 'Д' => "\x04\x14", 'Е' => "\x04\x15", 'Ё' => "\x04\x01", 'Ж' => "\x04\x16", 'З' => "\x04\x17", 'И' => "\x04\x18", 'Й' => "\x04\x19", 'К' => "\x04\x1A", 'Л' => "\x04\x1B", 'М' => "\x04\x1C", 'Н' => "\x04\x1D", 'О' => "\x04\x1E", 'П' => "\x04\x1F", 'Р' => "\x04\x20", 'С' => "\x04\x21", 'Т' => "\x04\x22", 'У' => "\x04\x23", 'Ф' => "\x04\x24", 'Х' => "\x04\x25", 'Ц' => "\x04\x26", 'Ч' => "\x04\x27", 'Ш' => "\x04\x28", 'Щ' => "\x04\x29", 'Ь' => "\x04\x2A", 'Ы' => "\x04\x2B", 'Ъ' => "\x04\x2C", 'Э' => "\x04\x2D", 'Ю' => "\x04\x2E", 'Я' => "\x04\x2F", 'а' => "\x04\x30", 'б' => "\x04\x31", 'в' => "\x04\x32", 'г' => "\x04\x33", 'д' => "\x04\x34", 'е' => "\x04\x35", 'ё' => "\x04\x51", 'ж' => "\x04\x36", 'з' => "\x04\x37", 'и' => "\x04\x38", 'й' => "\x04\x39", 'к' => "\x04\x3A", 'л' => "\x04\x3B", 'м' => "\x04\x3C", 'н' => "\x04\x3D", 'о' => "\x04\x3E", 'п' => "\x04\x3F", 'р' => "\x04\x40", 'с' => "\x04\x41", 'т' => "\x04\x42", 'у' => "\x04\x43", 'ф' => "\x04\x44", 'х' => "\x04\x45", 'ц' => "\x04\x46", 'ч' => "\x04\x47", 'ш' => "\x04\x48", 'щ' => "\x04\x49", 'ь' => "\x04\x4A", 'ы' => "\x04\x4B", 'ъ' => "\x04\x4C", 'э' => "\x04\x4D", 'ю' => "\x04\x4E", 'я' => "\x04\x4F", // all \x2? removed // all \x3? removed '¡' => "\x40", 'Ä' => "\x5B", 'Ö' => "\x5C", 'Ñ' => "\x5D", 'Ü' => "\x5E", '§' => "\x5F", '¿' => "\x60", 'ä' => "\x7B", 'ö' => "\x7C", 'ñ' => "\x7D", 'ü' => "\x7E", 'à' => "\x7F", '^' => "\x1B\x14", '{' => "\x1B\x28", '}' => "\x1B\x29", '\\' => "\x1B\x2F", '[' => "\x1B\x3C", '~' => "\x1B\x3D", ']' => "\x1B\x3E", '|' => "\x1B\x40", '€' => "\x1B\x65" ]; // Replace unconverted UTF-8 chars from codepages U+0080-U+07FF, U+0080-U+FFFF and U+010000-U+10FFFF with a single ? // return preg_replace('/([\\xC0-\\xDF].)|([\\xE0-\\xEF]..)|([\\xF0-\\xFF]...)/m','?',$converted); return strtr($string, $dict); } /** * Count the number of GSM 03.38 chars a conversion would contain. * It's about 3 times faster to count than convert and do strlen() if conversion is not required. * * @param string $utf8String * * @return integer */ public static function countGsm0338Length(string $utf8String): int { $len = mb_strlen($utf8String, 'utf-8'); $len += preg_match_all('/[\\^{}\\\~€|\\[\\]]/mu', $utf8String, $m); return $len; } /** * Pack an 8-bit string into 7-bit GSM format * Returns the packed string in binary format * * @param string $data * * @return string */ public static function pack7bit(string $data): string { $l = strlen($data); $currentByte = 0; $offset = 0; $packed = ''; for ($i = 0; $i < $l; $i++) { // cap off any excess bytes $septet = ord($data[$i]) & 0x7f; // append the septet and then cap off excess bytes $currentByte |= ($septet << $offset) & 0xff; // update offset $offset += 7; if ($offset > 7) { // the current byte is full, add it to the encoded data. $packed .= chr($currentByte); // shift left and append the left shifted septet to the current byte $currentByte = $septet = $septet >> (7 - ($offset - 8)); // update offset // 7 - (7 - ($offset - 8)) $offset -= 8; } } // append the last byte if ($currentByte > 0) { $packed .= chr($currentByte); } return $packed; } }