实例:HTML 中有个锚的功能,也就是通过 #id 来实现当页面的跳转。
(1)测试方法
a.在数据输入界面,输入:alert(/123/),保存成功后如果弹出对话框,表明此处存在一个 XSS 漏洞。(或输入框中输入)
b.或把 url 请求中参数改为 alert(/123/),如果页面弹出对话框,表明此处存在一个 XSS 漏洞。(或 url 请求参数中值改为)
(2)怎么防止 XSS 攻击?
XSS 来源于用户提供的内容,只要过滤掉其中的恶意代码即可,Node.js 项目中推荐使用 xss 库来完成这个工作
四、URL跳转漏洞
URL 跳转漏洞,即未经验证的重定向漏洞,是指 Web 程序直接跳转到参数中的 URL,或者在页面中引入了任意开发者的 URL,将程序引导到不安全的第三方区域,从而导致安全问题。
1.测试方法
(1)使用抓包工具抓取请求。
(2)抓取 302 的 url,修改目标地址,查看是否能跳转。
ps:不过现在很多跳转都加了 referer 的校验导致攻击者跳转失败
2.绕过URL跳转限制
(1)利用?号绕过限制
比如:http://www.aaa.com/acb?Url=http://login.aaa.com
这是一个跳转链接,跳转到它的二级域名下,那么这个问号放哪里可以绕过呢?其实就是放到它自身的域名前面也就是你添加的想要跳转的域名的后面,如:http://www.aaa.com/acb?Url=http://test.com?login.aaa.com 。它其实是会跳转到这个 test.com 域名下,这个域名是我想要跳转的任意域名,而后面的它自身域名一定要带上,不带上就无法辅助用问号?这个特性来跳转到指定域名了,而跳转后,问号和问号后面的内容会变为这样:http://www.test.com/?login.aaa.com
(2)利用反斜杠和正斜杠绕过限制
比如:http://www.aaa.com/acb?Url=http://login.aaa.com/ 同样是在它本身域名钱加上正斜杠,然后正斜杠前面跟上你想跳转的域名地址
如:http://www.aaa.com/acb?Url=http://test.com/login.aaa.com
反斜杠有三种思路:
两个反斜杠绕过方法
比如:http://www.aaa.com/acb?Url=http://login.aaa.com/ 同样是在它本身域名前加上两个反斜杠,然后两个反斜杠前面跟上你想跳转的域名地址
如:http://www.aaa.com/acb?Url=http://test.comlogin.aaa.com\
一个反斜杠绕过方法
如:http://www.aaa.com/acb?Url=http://test.comlogin.aaa.com\
另一种思路,一个反斜杠一个点
利用.这样的格式,也就是一个反斜杠加一个点来跳过限制,
如:http://www.aaa.com/acb?Url=http://test.com.login.aaa.com\
(3)利用@绕过URL 限制
如果你用这方法在火狐里进行跳转,会有弹窗提示,在其它游览器则没有。
如:http://www.aaa.com/acb?Url=http//login.aaa.com@test.com 后面的 test.com 就是要跳转到的域名,前面的域名都是用来辅助以绕过限制的:
(4)利用 # 号绕过
如:http://www.aaa.com/acb?Url=http://test.com#login.aaa.com
(5)利用白名单缺陷绕过
有的域名白名单限制是不全的,比如如果想利用一个跳转,而这个跳转是通用,在这个公司网站很多子域名等都可以跳转,那么你买个域名也不算贵对吧,为什么这么说呢,这个问题就是白名单限制不当,比如,当跳转的域名包含这个网站下的所有域名,比如:
http://www.aaa.com/acb?Url=http://login.aaa.comlogin.aaa.com 也可以改成 aaa.com 同样可以跳转对吧,因为白名单里只要有包含这个域名就直接成功跳转。那么当我在这个域名前面加上如 testaaa.com,白名单里会检查是否包含 aaa.com 这个域名,包含,然后直接跳转,而并没有检查这个域名的整个信息,然后可以利用这个问题,直接注册一个 testaaa.com 这个域名就可以利用这个跳转。
3.预防或修复漏洞方法
(1)若跳转的 URL 事先是可以确定的,包括 url 和参数的值,则可以在后台先配置好,url 参数只需传对应 url 的索引即可,通过索引找到对应具体 url 再进行跳转;
(2)若跳转的 URL 事先不确定,但其输入是由后台生成的(不是用户通过参数传入),则可以先生成好跳转链接然后进行签名,而跳转 cg 首先需要进行验证签名通过才能进行跳转;注:“签名 (sign):就是在应用程序的特定字段写入特定的标记信息,表示该软件已经通过了签署者的审核。签署者对该软件的安全性负责;
(3)若 1 和 2 都不满足,url 事先无法确定,只能通过前端参数传入,则必须在跳转的时候对 url 进行按规则校验:即控制 url 是否是你们公司授权的白名单或者是符合你们公司规则的 url:
(4)XSS 漏洞的注意事项 :跳转 url 检测中也加入了 CRLF 头部注入漏洞的检测逻辑, 具体就是在请求参数中加入了%0d%0a 这种测试代码,需要对这些参数进行删除处理 (事实上:在判断到一个参数中包含 %00 -> %1f 的控制字符时都是不合法的,需对其进行删除)。
(5)开源项目及时进行升级,如 Django 升级 pip install django --upgrade 比如中华 GIS 对 nacos、Log4j2、nginx 等进行升级,应中华要求对存在漏洞的服务进行升级。
五、任意文件上传
文件上传漏洞是 web 安全中经常用到的一种漏洞形式。是对数据与代码分离原则的一种攻击。上传漏洞顾名思义,就是攻击者上传了一个可执行文件如木马,病毒,恶意脚本,WebShell 等到服务器执行,并最终获得网站控制权限的高危漏洞。
文件上传漏洞危害:上传漏洞与 SQL 注入或 XSS 相比 , 其风险更大 , 如果 Web 应用程序存在上传漏洞 , 攻击者上传的文件是 Web 脚本语言,服务器的 Web 容器解释并执行了用户上传的脚本,导致代码执行。如果上传的文件是 Flash 的策略文件 crossdomain.xml,黑客用以控制 Flash 在该域下的行为。如果上传的文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行。如果上传的文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。甚至攻击者可以直接上传一个 webshell 到服务器上 完全控制系统或致使系统瘫痪。
1.常见的防护方法
网站常见的防护方法,知道了网站是如何防护该漏洞的,有利于我们更好地开展渗透测试。
对文件上传的防护大体上可以分为两类,一类是客户端检测,另一类是服务端检测。
(1)客户端检测
客户端检测是指依靠浏览器,用 JS 代码去检测。一般是在网页上写一段 Js 脚本,用 Js 去检测,在文件未上传时,校验文件的后缀名,检测的方式有白名单和黑名单两种。
那么如何判断是否为客户端检测?
在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png 后缀名的文件,而此时并没有发送数据包,所以可以通过抓包来判断,如果弹出不准上传,但是没有抓到数据包,那么就是采用了前端验证。
从安全的角度来看,前端验证非常不可靠,上传正常文件再改数据包就可以绕过,甚至关闭 JS 都可以尝试绕过。很多程序员使用 JavaScript 来拒绝非法文件的上传,这种验证方式对一些普通用户防止上传错误还可以,但是对专业的技术人员来说,这是非常低级的验证方式。攻击者可以用非常多的方法来突破客户端的验证。
由于前端代码对用户完全开放,因此很容易通过分析前端代码来绕过,所以相当于没有检测。可以用以下三种方式去绕过或者删除前端的检测:
用 burp 抓个返回包然后把前端代码里面文件检测的部分代码删掉 (这种方式也叫中间人攻击);
点检查,然后找到文件检测部分的 JS 代码,删掉即可,(但是最保险的办法还是抓包后再去删);
根据前端代码允许上传的类型,预先把木马文件后缀改成相应的后缀,比如 jpg,通过前端代码的检测以后,会自动往服务器发包,然后通过 burp 去拦截这个包,把后缀名改回来。
(2)服务端检测
服务端检测是先将文件上传到服务器,然后服务器依靠后端代码去检测上传的文件是否合规。服务器脚本一般会检测文件的 MIME 类型(文件的媒体类型)、扩展名是否合法,甚至可能会去检测文件中是否嵌入恶意代码。
服务端检测几个常见的手段有:检查 Content-Type(内容类型)、检查后缀 (检查后缀是主流,根据后缀来决定用什么方式来处理这个文件)、检查文件头等。
(3)白名单和黑名单的区别
黑名单:不允许某某类型的文件上传;
白名单:只允许某某类型的文件上传。
显然白名单的方式比黑名单更安全,黑名单很容易就会被绕过。
那么如何判断目标是黑名单还是白名单呢,其实很简单,只要上传一个莫名其妙的后缀,比如 1.czczxca,这个后缀的文件肯定不存在,所以如果能上传成功,说明目标是黑名单检测,如果上传失败,则目标是白名单检测。
2.文件上传漏洞绕过技巧
一般来说文件上传过程中检测部分由客户端 javascript 检测、服务端 Content-Type 类型检测、服务端 path 参数检测、服务端文件扩展名检测、服务端内容检测组成。但这些检测并不完善,且都有绕过方法。
客户端检测绕过(js 检测):
利用 firebug 禁用 js 或使用 burp 代理工具可轻易突破。
如果只对.jpg 后缀设置了白名单,我们可以先把后缀改为.jpg 绕过,再到 Burp Suite 抓包把后缀改回.php
➢服务端 MIME 检测绕过(Content-Type 检测):
使用 burpsuit 代理,修改 Content-Type 的参数
对于只允许指定 Content-Type(内容类型)这种防护手段,最简单的绕过方法是直接上传一个允许的文件类型再抓包修改后缀名。以上传 jpg 文件为例,先上传该文件,抓包修改后缀名为实际的后缀名.php,由于上传的时候是 jpg,所以浏览器发送的数据包中,Content-Type 的类型默认为 jpg,那么此时发送的文件就可以绕过后端的检测。
➢服务端扩展名检测绕过:
文件名大小写绕过,例如 Php,AsP 等类似的文件名
对于那种老版本的 WEB 容器,是区分大小写的,所以这种方法只对 WEB 容器非常古老的版本有效。原理很简单,在解析的时候,windows 的文件和文件夹都是不区分大小写的,而 WEB 容器区分大小写,因此上传的时候就有可能绕过该 WEB 容器,从而实现绕过后缀名检测。
后缀名字双写嵌套,例如 pphphp,asaspp 等
来看一段源代码:
f
i
l
e
n
a
m
e
=
s
t
r
i
r
e
p
l
a
c
e
(
file_name = str_ireplace(
filename=strireplace(deny_ext,“”, $file_name);
这里的意思就是把检测到的危险字符替换为空,php 被替换为空,那么假设上传的文件后缀名为 pphphp,被替换为空后就会变为 php,从而实现了绕过。
可以利用系统会对一些特殊文件名做默认修改的系统特性绕过
文件后缀加空格或点绕过后缀名检测
在文件名后面留一个空格,然后上传上去后空格会被自动的省略,但是看源码可知道,源码中黑名单中没有过滤空值,那么 php 和 php 空格,当然是不一样的。
注意:windows 会自动去除文件末尾的空格,所以需要先上传正常的文件,然后抓包在后缀名的地方加空格,再放包,就可以了。这里的空格改成点也是一样的。
可以利用 asp 程序中的漏洞,使用截断字符绕过
%00 截断和 00 截断
了解%00 之前我们要先了解 0x00。
00 截断:类似我们用对讲机或者电报通话时,说完一句话会用 over 表示一句话说完了,而电脑也需要一个截断的信号,而这个信号就是 00 截断。
0x 是一个十六进制表示方式,声明这是十六进制数,00 实际上就是表示 ascii 码值为 0,有些函数在处理这个字符的时候会把这个字符当做结束符,他们就读取到这里认为这一段结束了。
了解这个有什么用呢?
在文件上传时,如果遇到了白名单机制只允许上传 jpg 后缀的,我们该怎么办?JPG 格式并不会被解析,那么我们需要绕过上传过滤。
假如我写了 1.php%00.jpg 传参之后,有些过滤都是直接匹配字符串,他强行匹配到了结尾是.jpg,然后允许上传,但是 php 的函数去执行的时候他读取到 0x00 认为结束了,那么这个文件就变成了 1.php,从而实现绕过白名单。
%00 实际上和 00 截断是一模一样的原理,只不过%00 是经过 URL 编码的,%00 解码后就是 0x00 截断的那个字符。
需要注意%00 和 00 的区别,只有 GET 传参会进行一次 URL 编码,其他的传参方式不会,所以只有 GET 传参能够识别这种%00 的截断。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
写在最后
在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。
需要完整版PDF学习资源私我
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。**
需要完整版PDF学习资源私我
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-JeoPQUuk-1713064490908)]