"企业的信息安全治理水平,直接取决于安全团队人员的技术专业度,而非运营经验值。所谓的技术,并非指渗透和挖洞的能力,而是指软件开发、IT 架构、网络拓扑相关的知识和经验。
站在乙方的角度来看,技术薄弱的安全人员,通常面临着较大的沟通障碍和成本,因为他们难以理解和区分不同安全技术和产品之间的差异。更难以理解自身企业的 IT 和技术现状,无法做出有效且大胆的决策,通常容易被大品牌厂商引导或者选择尽量不作为以此求稳。最终在各方妥协和博弈之下,做出花大钱,成效较差的短期决策。而这些决策,往往在下一任上任之时,予以推翻。
相反,拥有较强技术背景的安全团队,非常明确知道自己想要什么,不会被厂商引导,相对不在意厂商在“付费安全排行榜”中的名次。在企业内部面对业务团队的挑战时,通常也能占有主动权,做出正向的决策,既帮助企业省钱,也帮助企业打下长治久安的基础。"
——————引用自 [安全工程的兴起及其如何改变未来的网络安全]
1、基础概念
这里大概介绍一些Web安全方面的概念,全乎的请参考:【赛博保安】安全日记之常用术语(一)
1.1、常见的DNS安全攻击
1.1.1、DDOS
-
DDoS攻击也叫做分布式拒绝服务攻击,可以使很多的计算机在同一时间遭受到攻击,使攻击的目标无法正常使用。
-
攻击者可以伪造自己的DNS服务器地址,同时发送大量请求给其他服务器。其他服务器的回复会被发送到被伪造服务器的真实地址,造成该服务器无法处理请求而崩溃。
-
攻击者同样可以通过利用DNS协议中存在的漏洞,恶意创造一个载荷过大的请求,造成目标DNS服务器崩溃。
1.1.2、DNS缓存中毒
- DNS缓存中毒攻击者给DNS服务器注入非法网络域名地址,如果服务器接受这个非法地址,那说明其缓存就被攻击了,而且以后响应的域名请求将会受黑客所控。
- 当这些非法地址进入服务器缓存,用户的浏览器或者邮件服务器就会自动跳转到DNS指定的地址。
- 这种攻击往往被归类为域欺骗攻击(pharming attack),由此它会导致出现很多严重问题。首先,用户往往会以为登陆的是自己熟悉的网站,而它们却并不是。
- 与钓鱼攻击采用非法URL不同的是,这种攻击使用的是合法的URL地址。
1.1.3、域名劫持(DNS重定向)
- 域名劫持是通过攻击域名解析服务器(DNS),或伪造域名解析服务器(DNS)的方法,把目标网站域名解析到错误的地址从而实现用户无法访问目标网站的目的。
- 域名劫持一方面可能影响用户的上网体验,用户被引到假冒的网站进而无法正常浏览网页,而用户量较大的网站域名被劫持后恶劣影响会不断扩大;另一方面用户可能被诱骗到冒牌网站进行登录等操作导致泄露隐私数据。
1.1.4、DNS查询嗅探
-
攻击者主要利用对DNS的配置信息获取网络环境的信息,为之后的攻击做好的准备。
-
针对这些情况,我们需要对DNS服务器需要采取特别的安全保护措施,在防火墙网络中,分开设置内部DNS服务器和外部DNS服务器,连接外部服务的外部DNS服务器上不留有对外禁止访问的内部网络系统的服务器,做到内外网络服务器分割。
1.1.5、ARP欺骗
-
ARP攻击就是通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞,攻击者只要持续不断的发出伪造的ARP响应包就能更改目标主机ARP缓存中的IP-MAC条目,造成网络中断或中间人攻击。
-
ARP攻击主要是存在于局域网网络中,局域网中若有一台计算机感染ARP病毒,则感染该ARP病毒的系统将会试图通过”ARP欺骗”手段截获所在网络内其它计算机的通信信息,并因此造成网内其它计算机的通信故障。
-
ARP欺骗通常是在用户局网中,造成用户访问域名的错误指向。如果IDC机房也被ARP病毒入侵后,则也可能出现攻击者采用ARP包压制正常主机、或者压制DNS服务器,以使访问导向错误指向的情况。
1.2、数据包扩展
1.2.1、URI和URL的区别
- URI:Uniform Resource Identifier 统一资源标识符
- URL:Uniform Resource Location 统一资源定位符
- URI 是用来标示 一个具体的资源的,我们可以通过 URI 知道一个资源是什么。
- URL 则是用来定位具体的资源的,标示了一个具体的资源位置。互联网上的每个文件都有一个唯一的URL。
1.2.2、HTTPS和SSL
- 简单理解:HTTPS = HTTP + SSL/TLS,通过 SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。
- SSL:Secure Socket Layer,安全套接字层,SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。
- TLS:Transport Layer Security,传输层安全,其前身是 SSL
1.3、搭建安全扩展
1.3.1、Web权限
在一般的情况下我们会对某个目录取消执行权限:最典型的就是图片目录,这个目录只放图像没有脚本我们会取消执行的权限。这样我们可以防范一部分的文件上传漏洞,即使开发写的代码有问题也不会导致服务器出现安全事故。
绕过方法:我们可以尝试将文件放在其他目录
1.4、数据库扩展
1.4.1、常见的数据库和默认端口
-
关系型数据库:
- Mysql:3306
- Oracle:1521
- Sql Server: 1433
- DB2: 50000
- PostgreSQL: 5432
- 达梦数据库:5236
-
非关系型数据库
- Redis:6379
- MongoDB:27017
- Elasticsearch:9200
Windows查看端口号的方法:

出现LISTENING,代表这个端口有被使用
2、SQL注入漏洞
- SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的sql服务器加以解析和执行。
- 由于sql语句本身的多样性,以及可用于构造sql语句的编程方法很多,因此凡是构造sql语句的步骤均存在被攻击的潜在风险。
- Sql注入的方式主要是直接将代码插入参数中,这些参数会被置入sql命令中加以执行。间接的攻击方式是将恶意代码插入字符串中,之后将这些字符串保存到数据库的数据表中或将其当成元数据。当将存储的字符串置入动态sql命令中时,恶意代码就将被执行
2.1、简单注入
例如如下sql:
select user_name from sys_user where user_id = -2
union
select role_name from sys_role limit 0,1;

这条SQL有SQL注入的特征,解释:
-
select user_name from sys_user where user_id = -2: 这一部分试图从sys_user表中选取user_name列,其中条件是user_id字段等于-2。由于-2不太可能是实际存在的用户 ID,所以这一部分很可能不会返回任何结果。 -
union select role_name from sys_role limit 0,1;:这一部分使用UNION操作符来组合两个查询的结果集。它从sys_role表中选取role_name列,并且通过LIMIT 0,1限制返回的结果为一条记录(从第 0 条记录开始计数)。 -
整条 SQL 语句的意图是通过前半部分无效的查询(
WHERE user_id = -2)绕过可能的输入验证,然后通过UNION操作来获取sys_role表中的一个role_name值。
2.2、如何判断是否有注入点
- 老方法:在网站后面URL后面拼接(注意是在
?id=1类似这种传参部分的后面拼接,下面说的URL拼接也是这个意思)
# 拼接后页面正常
and 1 = 1
# 拼接后页面不正常
and 1 = 2
# 则可能存在注入点
- 新方法:在URL后面随便拼接字符串,如果对网站有影响,则有注入点。如果随便拼接字符串后跳转404页面,则无注入点。
当判断出有注入点后,接下来就要猜表的字段数,URL后拼接 order by number 试,number 从1开始逐个尝试,假如拼接了order by 4 页面正常,order by 5页面不正常,则说明字段数就是4个。则开始进行联合注入:
Tips: union前后select查询的字段数要一致!
?id=1 union select 1,2,3,4
接下来就开始进行信息收集了,我们要判断上述4个字段哪个字段有注入就在哪个字段后面注入,例如:
# database() 函数用来查询数据库名字
# version() 函数用来查询数据库版本
?id=1 union select 1,database(),version(),4
# user() 函数用来查询数据库用户
# @@version_compile_os 用来查询是什么操作系统
?id=1 union select 1,user(),@@version_compile_os,4
在MySQL中我们也可以这么查询玩:

在MySQL5.0以上的版本存在一个information_schema数据库,里面存储记录数据库名、表名、列名,相当于可以通过information_schema这个数据库获取到数据库下面的表名和列名。
information_schema.tables:记录所有表名信息的表information_schema.columns:记录所有列名信息的表table_name: 表名column_name: 列名table_schema: 数据库名
- 例如我们要查某个数据库下的所有表名,可以这么注入:
# 查询 kuangstudy_fast 数据库下的所有表名(从记录所有表名信息的表中查询表名,在 kuangstudy_fast 这个数据库)
?id=1 union
select
1,table_name,3,4
from
information_schema.tables
where
table_schema = 'kuangstudy_fast'
表现在MySQL中的形式如下:

- 例如我们要继续查表名下的列名,可以这么注入:
# 查询sys_user的所有列(从记录所有列名信息的表中查询列,在sys_user这个数据表)
?id=1 union
select
1,column_name,3,4
from
information_schema.columns
where
table_name = 'sys_user'
表现在MySQL中的形式如下:

- 接着直接查询指定数据
# 查询sys_user的user_id,user_name
?id=1 union
select
1,user_id,user_name,4
from
sys_user
表现在MySQL中的形式如下:

可以使用墨者学院的免费靶场实战一下呦:

2.3、MySQL注入
如果要获取当前数据库的用户,可以使用mysql.user表,mysql.user 是一个特殊表,它存储了数据库用户的权限信息。访问 mysql.user 表通常需要管理员权限,普通用户可能没有足够的权限来查看这些敏感信息。
select host,user from mysql.user;

2.3.0、简要明确请求方式
根据网站的情况来获取相应的请求方法,请求方法可以通过在访问网站的时候审查元素里数据包的前缀看查看。

- 不同的请求方式,它请求的数据类型或者大小都不同。一般大数据会采用POST提交。在注入时候需要按照网站的请求方法去注入。
- 网站在访问的时候由于我们大多数是黑盒测试,不知道对方代码写法,如果对方采用request接收方式,就不需要考虑用何种方法去提交,因为用GET、POST都可以。如果对方是单一接收方式,那么在注入的时候需要用它的方法去注入。
2.3.1、参数提交注入
在真实 SQL 注入安全测试中,我们一定要先明确提交数据及提交方法后再进行注入。提交方法一般以GET、POST居多,提交数据一般有数字型、字符型等。
-
数字
-
如果提交数据是数字,一般不存在单引号,举个例子
https://linxiaoqin.netlify.app/index.html?id=1对应的sql语句可能为
select * from user where id = 1 -- 或者 select * from user where id = '1' -
如果有单引号,那么在注入的时候也会带入到单引号里面,产生不了任何作用,比如
https://linxiaoqin.netlify.app/index.html?id=1 and 1=1对应的sql语句为
select * from user where id = '1 and 1=1'即使有注入也会带入单引号里,产生不了任何作用,所以我们要做的前提是先要把它的符号闭合掉
https://linxiaoqin.netlify.app/index.html?id=1' and '1'='1这样执行的sql为
SELECT * FROM users WHERE id='1' and '1'='1'; -
也有可能有括号,注入的时候需要去尝试
-
同理,POST请求我们只需要将传递的参数进行注入即可。
当然SQL注入还有很多:报错盲注、堆叠注入、二次注入等等,本人作为开发者的角度暂不对具体注入方式进行实操,具体实施可参考小迪的视频以及:
3、文件上传漏洞
upload-labs靶场:一个想帮你总结所有类型的上传漏洞的靶场,这个靶场提供了一个Windows下配置好的集成环境,下载解压即可。
- 查看使用说明,先运行
modify_path.bat,再运行phpStudy.exe启动
- 注意杀毒软件可能会报毒,忽略即可
- 注意自己本机的MySQL可以提前关闭:
net stop mysql,不关也可以
- 访问
本机ip:80即可进入靶场

3.1、打靶
3.1.1、第一关-前端验证绕过
第一关是只对上传文件后缀进行了限制,很好过关。
- 我们创建1.md文件里面写入内容,然后选择文件点击上传
<?php
phpinfo();
?>

- 使用burp抓包将1.md修改为1.php,再把数据包发送

- 最后在浏览器中右击复制图片地址,

- 粘贴进浏览器,成功绕过对文件后缀的监测

3.1.2、第二关-Content-Type绕过
第二关的绕过方式:
- 首先将文件更改为
1.php,抓包在bp中将Content-Type类型修改为image/png
- 上传一个
1.md,会提示

- 抓包修改其content-type类型为:
image/png

- 成功绕过对文件MIME类型的检测
3.1.3、第三关-黑名单绕过
黑名单就是限制了哪些不可以,除了不可以的都可以。所以我们只要构造黑名单之外的后缀名即可绕过,黑名单有.asp .aspx .php .jsp,对于php解析,我们可以上传.php5格式的文件,前提是要在配置文件(upload-labs-env-win-0.1\upload-labs-env\Apache\conf\httpd.conf)里面有这样的一句话
AddType application/x-httpd-php .php .php3 .phtml .php5

然后重启此靶场。这样就可以上传1.php5的文件实现绕过了。
3.1.4、第六关-大小写绕过
此关基本将我们能想到的后缀名都限制了,但是并没有限制.PHP,windows 系统会忽略大小写,而Linux系统默认对大小写敏感。所以我们可以上传1.png然后用BP将名称改为1.PHP就可以实现绕过。
3.1.5、第七关-空格绕过
Windows下xx.jpg[空格] 或者xx.jpg.这两类文件都是不允许存在的,若这样命名,windows会默认去除空格或点。本关不允许上传任何非照片的后缀,大小写也做了限制。
这关源码唯一与前面不同的是,它没有trim()函数,也就是用来去除字符串两端的空格,所以我们如果在上传文件的后缀名里面加上空格,它在黑名单之外,我们就可以成功进行上传。
也就是抓包将后缀改为
xx.php[空格]或者xx.php.
这里简单打几个关,具体其他关卡可以自行百度,网上记录的大佬非常多。
3.2、中间件解析漏洞
- 靶场搭建vulhub
- 安装好Docker后,下载Vulhub的压缩包,上传到虚拟机自己选定目录
# 解压目录
unzip vulhub-master.zip
- 进入相应目录,我这里以 nginx解析漏洞 示例,路径为
nginx/nginx_parsing_vulnerability

cd nginx/nginx_parsing_vulnerability
# 启动容器
docker compose up -d
# 操作结束后清理靶场环境
docker-compose down
这里操作我的网络太差了,一直拉不下来镜像,暂且作罢!
3.3、编辑器安全
环境搭建:https://vulhub.org/#/environments/httpd/apache_parsing_vulnerability/
3.4、WAF绕过
在我们上传文件的数据包里面,需要明确有哪些东西能修改:
Content-Disposition: 响应标头指示回复的内容该以何种形式展示,一般可更改name:表单参数值,不能更改filename: 上传文件名,可以更改Content-Type: 上传文件MIME,视情况更改
WAF绕过的方式比较多,常见的绕过方式有:
- 数据溢出-防匹配
- 符号变异-防匹配
- 数据阶段-防匹配
- 重复数据-防匹配
3.4.1、数据溢出
数据溢出其实就是修改数据包,比如经典的Content-Disposition: form-data; [垃圾数据],name="uploadfile";在中间插入大量的垃圾数据从而绕过WAF。(垃圾数据就是自己随便敲打的数据)
3.4.2、符号变异
符号变异也就是在文件上传场景中,filename=xxx.php,取消掉xxx.php的双引号,通常情况下都是双引号包裹起来的,这样服务器认为是一个字符串。如果不带双引号就会被认为是自带的函数,比如请求头的:Host: 10.1.1.0、Content0Type: multipart/form-data 都是不带双引号的。
总而言之,符号变异也就是在请求包中,去掉原本的双引号,或者只使用一个双引号,不让双引号闭合的特征。
3.4.3、数据截断
数据截断使用%00截断,添加合法后缀名,可以修改数据包中filename="xxx.php%00.png",在文件上传场景中,如果服务器端的应用程序没有正确地验证文件名和类型,那么这种技巧可能会让一个 PHP 脚本文件通过图片文件的验证,并被当作图片上传。
- 比如,服务器可能只检查
.png扩展名而忽略了前面的.php和%00,从而允许上传一个实际包含 PHP 代码的文件。
数据截断还可以使用换行数据包,比如:
...
filename = "x.
p
h
p
"
...
3.5、Fuzz字典模糊测试
以上手动修改文件名的方法还是比较慢,我们可以使用Fuzz字典基于黑盒的自动化软件模糊测试技术。以下有很多Fuzz字典库:
4、XSS漏洞
xss形成的原因与SQL注入类似,也是由于程序员在开发过程中没有对用户提交的恶意数据做过过滤,转义而直接输出到页面,导致用户可以利用此漏洞去任意构造js,html代码插入到网页源代码中并执行。和SQL注入不同的是xss不一定要和数据库交互。
-
反射型XSS:经过后端,不经过数据库。反射型XSS又称非持久型XSS顾名思义,非持久型xss攻击是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。
-
持久型XSS:经过后端,经过数据库。持久型xss,会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在。危害比较大。
-
DOM型XSS:DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。HTML的标签都是节点,而这些节点组成了DOM的整体结构——节点树。通过HTML DOM,树中所有节点均可通过JavaScript进行访问。所有HTML(节点)均可被修改,也可以创建或删除节点。
-
靶场搭建(xss-labs):下载压缩包解压,放入phpstudy启动即可
这里简单介绍下phpstudy的使用:
- 下载phpstudy:https://old.xp.cn/phpstudy-v8/download.html
- 启动
Apache- 创建网站


4.1、打靶
4.1.1、level-1
可以发现,get传参name的值test回显在网页,同时还回显了payload的长度。

直接在payload插入js代码:
name=<script>alert()</script>

4.1.2、level-2-闭合绕过
第二关特殊符号被实体转义了,所以直接传入js代码没有生效:

右键查看源码,发现第一个test进行了html实体转义,但是第二个没有,我们只需要闭合掉双引号即可,构造payload

keyword="> <script>alert()</script> <"
4.1.3、level-3-单引号绕过
先输入123456,然后查看网站源码,相对于上一关,这里是单引号闭合,构造payload

'> <script>alert()</script> <'
发现没效果,看一下源码得知没想到符号也被实体化了,我们可以利用 onfocus 事件绕过,构造payload
' οnclick='alert(1)
然后回车点击一下输入框即可完成绕过

onfocus事件就是当输入框被点击的时候,就会触发myFunction()函数,所以我们可以利用这个事件来绕过
<>号的过滤已达到执行js的目的
4.1.4、level-4-双引号闭合
查看源码发现是双引号闭合,所以我们还能继续利用onfocus事件,构建payload
" οnclick="alert(1)

4.1.5、level-5-a标签闭合
查看源码发现是双引号闭合,我们构造payload
" οnclick="alert(1)
发现限制了script和on字符,script会被替换成scr_pt,on会被替换成o_n

这关过滤了js的标签还有onfocus事件,我们使用 <a href>标签法,构建payload
"> <a href=javascript:alert()>xxx</a> <"
之后点击xxx,触发a标签href属性即可

4.1.6、level-6-大小写绕过
这关过滤了很多,script会被替换成scr_pt,on会被替换成o_n,href会被替换成hr_ef,这个时候试试大小写过滤,构造payload
"><SCRIPT>alert(1)</SCRIPT>
4.1.7、level-7-双拼写绕过
这关进行了小写转化,将检测出来的on,script,href给删掉了,我们可以利用双拼写绕过
- 比如on,我们可以写成oonn,当中间on被删掉的时候,就变成了on
- 比如script,可以写成scscriptipt,当script被删掉的时候,就变成了script
"> <a hrehreff=javasscriptcript:alert()>x</a> <"
[!note]
之后的打关作者就不进行了,这里放两篇参考:
- https://blog.youkuaiyun.com/l2872253606/article/details/125638898
- https://blog.youkuaiyun.com/weixin_43669045/article/details/107932942
5、CSRF漏洞
CSRF跨站请求伪造,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户请求受信任的网站。
- 简单的说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己以前认证过的站点并运行一些操作(如发邮件,发消息,甚至财产操作(如转账和购买商品))。因为浏览器之前认证过,所以被访问的站点会觉得这是真正的用户操作而去运行。
要完毕一次CSRF攻击,受害者必须依次完毕两个步骤:
- 登录受信任站点A,并在本地生成Cookie。
- 在不登出A的情况下,访问危急站点B。
样例:
银行站点A:它以GET请求来完毕银行转账的操作,如:
http://www.mybank.com/Transfer.php?toBankId=11&money=1000
危险站点B:它里面有一段HTML的代码例如以下:
<img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>
首先。你登录了银行站点A,然后访问危险站点B,噢,这时你会发现你的银行账户少了1000块。在访问站点B的时候你的的浏览器会带上你的银行站点A的Cookie发出Get请求,去获取资源以GET的方式请求第三方资源。
5.1、CSRF漏洞的挖掘
要挖掘CSRF漏洞:
- 最简单的方法就是抓取一个正常请求的数据包,如果没有Referer字段和token,那么极有可能存在CSRF漏洞
- 如果有Referer字段,但是去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞
5.2、CSRF防护
- 当用户发送重要的请求时需要输入原始密码
- 设置随机 Token:要抵御 CSRF关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中,那么在请求地址中添加 token 并验证就很好的达到防护。比如若依系统。
- 检验 referer 来源(但是referer其实可以被抓包修改):根据 HTTP 协议,在 HTTP 头中有一个字段叫Referer,它记录了该 HTTP 请求的来源地址。
- 验证码:CSRF攻击的过程,往往是在用户不知情的情况下构造了网络请求。而验证码,则强制用户必须与应用进行交互,才能完成最终请求。因此在通常情况下,验证码能够很好地遏制CSRF攻击。但是验证码并非万能。很多时候,出于用户体验考虑,网站不能给所有的操作都加上验证码。因此,验证码只能作为防御CSRF的一种辅助手段,而不能作为最主要的解决方案。
6、SSRF漏洞
SSRF服务器端请求伪造是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
- SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。

比如,黑客操作服务端Web Server从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。利用的是服务端的请求伪造。ssrf是利用存在缺陷的web应用作为代理攻击远程和本地的服务器。
在我们浏览一些网站上传图片或者文件的时候,有两种上传方式:
- 本地上传:从电脑磁盘选择文件上传,不存在SSRF漏洞
- 远程上传:从某个URL链接选择上传,可能存在SSRF漏洞,因为你填的这个URL,对方服务器会先访问一下来获取到这个图片。那么在这个过程中,假如我们把 URL 改成内网的其他服务器上地址和端口,就可以探测内网的其他信息了。
- 比如端口开放情况,url填写
ip:3306,根据返回的信息可以确认是否开启3306端口
- 比如端口开放情况,url填写

如图,正常情况下,攻击者没办法直接访问到服务器A和B的,因为服务器A、B都是在内网,就无法探知服务器A、B的资产信息,但是可以通过Web站点来探知。至于对于内网IP的考虑,内网IP段是私网的,也就那么几个段,可以试。
6.1、url伪协议
当我们发现SSRF漏洞后,首先要做的事情就是测试所有可用的URL伪协议。什么意思呢?其实也就是填写url:
file:///从文件系统中获取文件内容,如填写:file:///www/server,就可以获取到服务器的www/server下的文件目录dict://ip:port字典服务器协议,访问字典资源,如dict://ip:3306/info就可以访问到3306端口的信息
6.2、SSRF防御思路
- 过滤返回信息:验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
- 统一错误信息:避免用户可以根据错误信息来判断远端服务器的端口状态。
- 限制请求的端口为http常用的端口:比如,80,443,8080,8090
- 黑名单内网ip:避免应用被用来获取获取内网数据,攻击内网
- 禁用不需要的协议:仅仅允许http和https请求。可以防止类似于
file:///,gopher://,ftp://等引起的问题
1660

被折叠的 条评论
为什么被折叠?



