测试基础 常见的安全测试漏洞

周小丽 · 2022年10月18日 · 最后由 leixs 回复于 2022年10月24日 · 7702 次阅读

同事分享的 + 百度搜索,学习下

一、SQL 注入攻击

SQL 注入攻击主要是由于程序员在开发过程中没有对客户端所传输到服务器端的参数进行严格的安全检查,同时 SQL 语句的执行引用了该参数,并且 SQL 语句采用字符串拼接的方式执行时,攻击者将可能在参数中插入恶意的 SQL 查询语句,导致服务器执行了该恶意 SQL 语句。
SQL 注入可能造成的危害有:网页、数据被篡改,核心数据被窃取,数据库所在的服务器被攻击,变成傀儡主机。
(1)测试方法
在需要进行查询的页面,输入正确查询条件 and 1=1 等简单 sql 语句,查看应答结果,如与输入正确查询条件返回结果一致,表明应用程序对用户输入未进行过滤,可以初步判断此处存在 SQL 注入漏洞。
(2)防止 sql 注入
1、JBDC 方式查询,我们可以利用 PreparedStatement,这样不光能提升查询效率,而且他的 set 方法已经为我们处理好了 sql 注入的问题。
  

2、hibernate 方式查询,我们利用 name:parameter 方式查询,例如利用 find(String queryString, Object value...Object value) 方法查询,就可以避免 sql 注入.
 

3、在查询方法中我们检查 sql,将非法字符转换,导致 sql 注入的字符串,过滤掉或者转化。
4、在页面中限制,我们通过 js 设置,不让用户输入非法字符。
5、拦截请求的每一个参数,并将这个参数的非法字符转化,下面的为提交的参数中没有附件的,实现方式。首先在 web.xml 配置文件中添加这个类的 filter,继承类 HttpServletRequestWrapper,如图

  
6、拦截请求的每一个参数,并将这个参数的非法字符转化,下面的为提交的参数中 有含附件的,实现方式。在 xml 中配置上传的时候,配置这个类.继承类 CommonsMultipartResolver 如图

7、使用服务器安全狗,安装好网页安全狗和服务器安全狗,可以有效的避免 sql 被注入入侵的风险,如果有更高级的需求还可以联系安全狗可以提供更为强大的云安全服务,帮助用户抵御外来入侵。

二、CSRF 跨站伪造请求

CSRF(Cross-Site Request Forgery,跨站点伪造请求)是一种网络攻击方式,该攻击可以在用户毫不知情的情况下以用户自身的名义伪造请求发送给受攻击站点,从而在未授权的情况下执行在权限保护之下的操作。具体来讲,可以这样理解 CSRF 攻击:攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的

CSRF 攻击攻击原理及过程如下:
1.用户 C 打开浏览器,访问受信任网站 A,输入用户名和密码请求登录网站 A;
2.在用户信息通过验证后,网站 A 产生 Cookie 信息并返回给浏览器,此时用户登录网站 A 成功,可以正常发送请求到网站 A;
3.用户未退出网站 A 之前,在同一浏览器中,打开一个 TAB 页访问网站 B;
4.网站 B 接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点 A;
5.浏览器在接收到这些攻击性代码后,根据网站 B 的请求,在用户不知情的情况下携带 Cookie 信息,向网站 A 发出请求。网站 A 并不知道该请求其实是由 B 发起的,所以会根据用户 C 的 Cookie 信息以 C 的权限处理该请求,导致来自网站 B 的恶意代码被执行。
(1)测试方法
1、同个浏览器打开两个页面,一个页面权限失效后,另一个页面是否可操作成功
2、使用工具发送请求,在 http 请求头中不加入 referer 字段,检验返回消息的应答
(2)防御 CSRF 攻击
1、比如请求的 Referer 是指向黑客自己的网站 B 而不是网站 A。因此,要防御 CSRF 攻击,网站 A 只需要对于每一个请求验证其 Referer 值,如果是 A 网站的域名,则说明该请求是来自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。
2、Referer 的值是由浏览器提供的,并不能保证浏览器自身没有安全漏洞。对于某些浏览器,目前已经有一些方法可以篡改 Referer 值,黑客完全可以修改 Referer 值,这样就可以通过验证,从而进行 CSRF 攻击。可在请求中添加 token 并验证。

三、XSS 跨站脚本攻击

由于 web 程序对用户的输入过滤不足,导致用户输入的恶意 HTML/Javascript 代码注入到网页中,混淆原有语义,产生新的恶意语句。在其他用户访问网页时,浏览器就会触发恶意的网页代码,从而达到 XSS 攻击的目的。
XSS(Cross Site Script),与 SQL 注入相似,XSS 是通过网页插入恶意脚本,主要用到的技术也是前端的 HTML 和 JavaScript 脚本。当用户浏览网页时,实现控制用户浏览器行为的攻击方式。一次成功的 XSS,可以获取到用户的 cookie,利用该 cookie 盗取用户对该网站的操作权限;也可以获取到用户联系人列表,利用被攻击者的身份向特定的目标群发送大量的垃圾信息,等等。
XSS 分为三类:存储型 (持久性 XSS)、反射型 (非持久性 XSS)、DOM 型。所造成的影响主要是窃取用户登录凭证(Cookies)、挂马攻击、页面访问挟持等。
1、持久型跨站:最直接的危害类型,跨站代码存储在服务器(数据库)。
攻击者把恶意脚本注入服务器并存储起来,等待受害者请求此脚本并在浏览器中自动运行。
使用场景:攻击者在评论区提交带有恶意脚本的评论,如果服务器检查不出恶意脚本,那么此恶意评论会被存入服务器数据库,下一个用户访问时,评论会被自动获取并展示,其中恶意脚本也被自动运行了。

2、非持久型跨站:反射型跨站脚本漏洞,最普遍的类型。用户访问服务器 - 跨站链接 - 返回跨站代码。
通过用户点击恶意链接,获取用户已登录的会话 cookie(黑客在留言板中插入恶意代码
受害者访问被植入恶意代码的页面,恶意代码将 cookie 发送给黑客的服务器,一般使用 xss 平台生成 payload,受害者执行之后 cookie 会被发送到 xss 平台)

3、DOM 跨站(DOM XSS):DOM(document object model 文档对象模型),客户端脚本处理逻辑导致的安全问题,在用户浏览的页面中直接注入代码
实例: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
反斜杠有三种思路
(1) 两个反斜杠绕过方法
比如:http://www.aaa.com/acb?Url=http://login.aaa.com/ 同样是在它本身域名前加上两个反斜杠,然后两个反斜杠前面跟上你想跳转的域名地址
如:http://www.aaa.com/acb?Url=http://test.comlogin.aaa.com\\
(2) 一个反斜杠绕过方法
如:http://www.aaa.com/acb?Url=http://test.comlogin.aaa.com\
(3) 另一种思路,一个反斜杠一个点
利用.这样的格式,也就是一个反斜杠加一个点来跳过限制,
如: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)常见的防护方法
网站常见的防护方法,知道了网站是如何防护该漏洞的,有利于我们更好地开展渗透测试。
对文件上传的防护大体上可以分为两类,一类是客户端检测,另一类是服务端检测。
(一)客户端检测
客户端检测是指依靠浏览器,用 JS 代码去检测。一般是在网页上写一段 Js 脚本,用 Js 去检测,在文件未上传时,校验文件的后缀名,检测的方式有白名单和黑名单两种。
那么如何判断是否为客户端检测?
在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png 后缀名的文件,而此时并没有发送数据包,所以可以通过抓包来判断,如果弹出不准上传,但是没有抓到数据包,那么就是采用了前端验证。
从安全的角度来看,前端验证非常不可靠,上传正常文件再改数据包就可以绕过,甚至关闭 JS 都可以尝试绕过。很多程序员使用 JavaScript 来拒绝非法文件的上传,这种验证方式对一些普通用户防止上传错误还可以,但是对专业的技术人员来说,这是非常低级的验证方式。攻击者可以用非常多的方法来突破客户端的验证。
由于前端代码对用户完全开放,因此很容易通过分析前端代码来绕过,所以相当于没有检测。可以用以下三种方式去绕过或者删除前端的检测:
1、用 burp 抓个返回包然后把前端代码里面文件检测的部分代码删掉 (这种方式也叫中间人攻击);
2、点检查,然后找到文件检测部分的 JS 代码,删掉即可,(但是最保险的办法还是抓包后再去删);
3、根据前端代码允许上传的类型,预先把木马文件后缀改成相应的后缀,比如 jpg,通过前端代码的检测以后,会自动往服务器发包,然后通过 burp 去拦截这个包,把后缀名改回来。

(二)服务端检测
服务端检测是先将文件上传到服务器,然后服务器依靠后端代码去检测上传的文件是否合规。服务器脚本一般会检测文件的 MIME 类型(文件的媒体类型)、扩展名是否合法,甚至可能会去检测文件中是否嵌入恶意代码。
服务端检测几个常见的手段有:检查 Content-Type(内容类型)、检查后缀 (检查后缀是主流,根据后缀来决定用什么方式来处理这个文件)、检查文件头等。
(三)白名单和黑名单的区别
黑名单:不允许某某类型的文件上传;
白名单:只允许某某类型的文件上传。
显然白名单的方式比黑名单更安全,黑名单很容易就会被绕过。
那么如何判断目标是黑名单还是白名单呢,其实很简单,只要上传一个莫名其妙的后缀,比如 1.czczxca,这个后缀的文件肯定不存在,所以如果能上传成功,说明目标是黑名单检测,如果上传失败,则目标是白名单检测。

(2)文件上传漏洞绕过技巧
一般来说文件上传过程中检测部分由客户端 javascript 检测、服务端 Content-Type 类型检测、服务端 path 参数检测、服务端文件扩展名检测、服务端内容检测组成。但这些检测并不完善,且都有绕过方法。
客户端检测绕过(js 检测):
利用 firebug 禁用 js 或使用 burp 代理工具可轻易突破。
如果只对.jpg 后缀设置了白名单,我们可以先把后缀改为.jpg 绕过,再到 Burp Suite 抓包把后缀改回.php
➢服务端 MIME 检测绕过(Content-Type 检测):
1、使用 burpsuit 代理,修改 Content-Type 的参数
对于只允许指定 Content-Type(内容类型)这种防护手段,最简单的绕过方法是直接上传一个允许的文件类型再抓包修改后缀名。以上传 jpg 文件为例,先上传该文件,抓包修改后缀名为实际的后缀名.php,由于上传的时候是 jpg,所以浏览器发送的数据包中,Content-Type 的类型默认为 jpg,那么此时发送的文件就可以绕过后端的检测。

➢服务端扩展名检测绕过:
1、文件名大小写绕过,例如 Php,AsP 等类似的文件名
对于那种老版本的 WEB 容器,是区分大小写的,所以这种方法只对 WEB 容器非常古老的版本有效。原理很简单,在解析的时候,windows 的文件和文件夹都是不区分大小写的,而 WEB 容器区分大小写,因此上传的时候就有可能绕过该 WEB 容器,从而实现绕过后缀名检测。
2、后缀名字双写嵌套,例如 pphphp,asaspp 等
来看一段源代码:
$file_name = str_ireplace($deny_ext,"", $file_name);
这里的意思就是把检测到的危险字符替换为空,php 被替换为空,那么假设上传的文件后缀名为 pphphp,被替换为空后就会变为 php,从而实现了绕过。

3、可以利用系统会对一些特殊文件名做默认修改的系统特性绕过
文件后缀加空格或点绕过后缀名检测
在文件名后面留一个空格,然后上传上去后空格会被自动的省略,但是看源码可知道,源码中黑名单中没有过滤空值,那么 php 和 php 空格,当然是不一样的。
注意:windows 会自动去除文件末尾的空格,所以需要先上传正常的文件,然后抓包在后缀名的地方加空格,再放包,就可以了。这里的空格改成点也是一样的。

4、可以利用 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 的截断。

5、可以利用不在黑名单列表中却能够成功执行的同义后缀名绕过黑名单的限制
(一)换一个后缀名绕过黑名单检测
假设我们要上传的文件为 php 文件,那么就要去尝试,看看什么样的后缀名会被当成 php 文件解析。实际上,除了后缀为.php 的文件会被当成 php 文件解析, 还有 phtml php3 php4 php5 之类的后缀也会,可以都去尝试一下,看看能否上传成功。
对于不同的文件,可以采用不同的后缀去测试,虽然概率很小,但万一成功了呢?

6、可以利用解析/包含漏洞配合上传一个代码注入过的白名单文件绕过
(一)用.htaccess 文件巧妙绕过黑名单
假如开发者把后端代码写的很严格,甚至后缀名的大小写也写进了黑名单,那么就可以尝试用.htaccess 文件来绕过了。
.htaccess 全称是 Hypertext Access(超文本入口)。htaccess 文件也被称为分布式配置文件,是 Apache 特有的的针对目录改变配置的方法。通过在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。该文件可以针对不同的目录采用不同的策略。
一般后端的黑名单不会过滤把.htaccess 后缀写进去,那么我们可以先上传一个.htaccess 文件上去,提前设置好让它把.jpg 文件当做 php 文件来解析,这样后续只需要上传.jpg 文件就可以了。
.htaccess 文件的内容如下:

AddType application/x-httpd-php .jpg
这个指令代表着.jpg 文件会当做 php 文件来解析。

(3)文件上传漏洞预防
系统运行时的防御
       1、文件上传的目录设置为不可执行。只要 web 容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要。
       2、判断文件类型。在判断文件类型时,可以结合使用 MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者 resize 函数,在处理图片的同时破坏图片中可能包含的 HTML 代码。
       3、使用随机数改写文件名和文件路径。文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像 shell.php.rar.rar 和 crossdomain.xml 这种文件,都将因为重命名而无法攻击。
       4、单独设置文件服务器的域名。由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传 crossdomain.xml、上传包含 Javascript 的 XSS 利用等问题将得到解决。
       5、使用安全设备防御。文件上传攻击的本质就是将恶意文件或者脚本上传到服务器,专业的安全设备防御此类漏洞主要是通过对漏洞的上传利用行为和恶意文件的上传过程进行检测。恶意文件千变万化,隐藏手法也不断推陈出新,对普通的系统管理员来说可以通过部署安全设备来帮助防御。
系统开发阶段的防御
       1、系统开发人员应有较强的安全意识,尤其是采用 PHP 语言开发系统。在系统开发阶段应充分考虑系统的安全性。
       2、对文件上传漏洞来说,最好能在客户端和服务器端对用户上传的文件名和文件路径等项目分别进行严格的检查。客户端的检查虽然对技术较好的攻击者来说可以借助工具绕过,但是这也可以阻挡一些基本的试探。服务器端的检查最好使用白名单过滤的方法,这样能防止大小写等方式的绕过,同时还需对%00 截断符进行检测,对 HTTP 包头的 content-type 也和上传文件的大小也需要进行检查。
系统维护阶段的防御
       1、系统上线后运维人员应有较强的安全意思,积极使用多个安全检测工具对系统进行安全扫描,及时发现潜在漏洞并修复。
       2、定时查看系统日志,web 服务器日志以发现入侵痕迹。定时关注系统所使用到的第三方插件的更新情况,如有新版本发布建议及时更新,如果第三方插件被爆有安全漏洞更应立即进行修补。
       3、对于整个网站都是使用的开源代码或者使用网上的框架搭建的网站来说,尤其要注意漏洞的自查和软件版本及补丁的更新,上传功能非必选可以直接删除。除对系统自生的维护外,服务器应进行合理配置,非必选一般的目录都应去掉执行权限,上传目录可配置为只读。

共收到 10 条回复 时间 点赞

赞一个!

mark 一下

赞一个,最近刚好在学习

普及了安全知识

厉害厉害

眼一下!

学习了,厉害厉害

mark,学习😆

先赞后看,前段时间忽然让做安全测试,可以学习一波

Jerry li 有了解安全渗透测试的吗?求指导 中提及了此贴 11月02日 17:27
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册