来自外网的误报说明安全设备需要进行策略升级,不需要处置。
如果是来自内网的误报可以和负责人协商一下看能不能解决,有必要的话添加白名单处理。
答:
1.失效的访问控制
2.加密机制失效
3.注入(包括跨站脚本攻击XSS和SQL注入等)
4.不安全设计
5.安全配置错误
6.自带缺陷和过时的组件
7.身份识别和身份验证错误
8.软件和数据完整性故障
9.安全日志和监控故障
10.服务端请求伪造SSRF
此处owasp top 10 是2021年版的,一般情况下top10四年更新一次,目前最新的版本就是2017年版和2021年版。有些博客上写的2022年版的其实是2013年版的。
答:
SQL注入原理:
通过某种方式将恶意的sql代码添加到输入参数中,然后传递到sql服务器使其解析并执行的一种攻击手法
漏洞产生原因(实现条件):
用户对sql查询语句参数可控
原本程序要执行的SQL语句,拼接了用户输入的恶意数据
答:
1.联合注入
2.堆叠注入
3.宽字节注入
4.cookie注入
5.XFF头注入
6.UA注入(user-agent注入)
7.Referer注入
8.二次注入
9.base64注入
11.万能密码
12.文件读写
1.基于时间的盲注 sleep() benchmark()
2.基于布尔的注入
3.基于报错的注入 updatexml() extractvalue() floor() exp()
答:
1.预编译 (数据库不会将参数的内容视为SQL命令执行,而是作为一个字段的属性值来处理)
2.PDO预处理 (本地和Mysql服务端使用字符集对输入进行转义)
3.正则表达式过滤 (如果用户输入了非法信息则利用正则表达式过滤)
答:
1.大小写绕过注入
2.双写绕过注入
3.编码绕过注入
4.内联注释绕过注入
答:
获取数据库数据
数据库中存放的用户的隐私信息的泄露,脱取数据库中的数据内容(脱库),可获取网站管理员帐号、密码悄无声息的进行对网站后台操作等。
网页篡改
通过操作数据库对特定网页进行篡改,严重影响正常业务进行与受害者信誉。
网页挂马
将恶意文件或者木马下载链接写入数据库,修改数据库字段值,进行挂马攻击。
篡改数据库数据
攻击 数据库服务器,篡改或者添加普通用户或者管理员帐号。
获取服务器权限
列取目录、读取、写入shell文件获取webshell,远程控制服务器,安装后门,经由数据库服务器提供的操作系统支持,让攻击者得以修改或控制操作系统。
答:
原理:
攻击者在Web页面中注入恶意的Script代码,当用户浏览该网页时,嵌入的Script代码会被执行,从而达到攻击的目的。
XSS类型:
反射型XSS
存储型XSS
DOM型XSS
答:
大小写转换;
引号的使用;
使用 / 代替空格;
编码绕过(将字符进行十进制或者十六进制转码);
5.双写绕过;
6.使用制表符 换行符和回车符
7.使用 IMG 源
答:
窃取cookie
抓取屏幕截图
获取键盘记录
重定向
植入广告,恶意链接
网页钓鱼
网页挂马
结合网页挂马或者其他工具(Metasploit)获取服务器或者操作系统权限
答:
对用户的输入进行过滤
比如说添加黑名单或者白名单规则,比如说对& " ’ / expression javascript import等敏感字符进行转义
使用 HttpOnly Cookie
如果cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,窃取cookie内容,这样可以有效的防止XSS攻击窃取cookie。
response.addHeader(“Set-Cookie”, “uid=112; Path=/; HttpOnly”);
设置X-XSS-Protection属性
该属性被所有的主流浏览器默认开启。X-XSS-Protection,即XSS保护属性,是设置在响应头中目的是用来防范XSS攻击的。在检查到XSS攻击时,停止渲染页面。
header(“X-XSS-Protection: 1”);
开启CSP网页安全策略
CSP是网页安全策略(Content Security Policy)的缩写。开启策略后 可以起到以下作用
禁止加载外域代码,防止复杂的攻击逻辑。
禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。
禁止内联脚本执行(规则较严格,目前发现 GitHub 使用)。
禁止未授权的脚本执行(新特性,Google Map 移动版在使用)。
合理使用上报可以及时发现 XSS,利于尽快修复问题。
避免内联事件
尽量不要使用 onLoad=“onload(’{{data}}’)”、onClick=“go(’{{action}}’)” 这种拼接内联事件的写法。在 JavaScript 中通过 .addEventlistener() 事件绑定会更安全。
使用模板引擎
开启模板引擎自带的 HTML 转义功能。例如: 在 ejs 中,尽量使用 而不是 ; 在 doT.js 中,尽量使用 {{! data } 而不是 {{= data }; 在 FreeMarker 中,确保引擎版本高于 2.3.24。
答:
web应用程序在用户进行敏感操作时,如修改账号密码、添加账号、转账等,没有校验表单token或者http请求头中的referer值,从而导致恶意攻击者利用普通用户的身份(cookie)完成攻击行为。
受害者A登录网站,攻击者B构造有效链接诱导受害者A访问,网站在线期间会将该请求当做正常业务执行。(比如修改密码,向某用户转账等业务,当然现在这种简单的EXP基本上见不到,拿靶场验证一下用于理解原理就行了)
答:
GET类型
POST类型
比如在一个页面中构造好一个表单表单,将这个页面隐藏在一个不可见的iframe窗口中,然后使用JavaScript自动提交这个表单,在整个过程中,对于用户来说是不可见的。当用户访问该页面后,表单会自动提交,相当于模拟用户完成了一次POST操作
盗用其他用户或者管理员的账号
获取个人隐私或者机密资料
联合其他漏洞组合拳
比如说拿到管理员账号之后,我们在某个页面利用XSS漏洞进行网页挂马,普通用户访问后就会下载木马程序,进而联合MSF或者CS等工具getshell。再比如说你把管理员密码还原一下,真正管理员登录的时候也会受到网页挂马的影响,结合工具可以进一步拿下管理员主机权限。
答:
验证码验证
验证码被认为是对抗CSRF攻击最简洁而有效的防御方法。
CSRF攻击的过程,往往是在用户不知情的情况下构造了网络请求。而验证码,则强制用户必须与应用进行交互,才能完成最终请求。因此在通常情况下,对用户执行敏感操作时进行验证,就能够很好地遏制CSRF攻击。
但是验证码并非万能。很多时候,出于用户体验考虑,网站不能给所有的操作都加上验证码。因此,验证码只能作为防御CSRF的一种辅助手段,而不能作为最主要的解决方案。
在请求地址中添加 token 并验证
CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。
要抵御 CSRF关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。
可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。
验证 HTTP头的Referer 字段
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,头信息里会包含Referer。
比如我在 http://www.google.com 里有一个 www.baidu.com 链接,那么点击这个链接,它的头信息里就会有:
Referer= http://www.google.com
通过验证Referer,可以判断请求的合法性,如果Referer是其他网站的话,就有可能是CSRF攻击,则拒绝该请求。
在 HTTP 头中自定义属性并验证
这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。
缺陷是要采用这种方法来进行防护,要把所有请求都改为 XMLHttpRequest 请求,就意味着可能要重写整个网站,这代价无疑是不能接受的。
答:
当攻击者想要访问服务器B上的服务,但是由于存在防火墙或者服务器B是属于内网主机等原因导致攻击者无法直接访问。如果服务器A存在SSRF漏洞,这时攻击者可以借助服务器A来发起SSRF攻击,通过服务器A向主机B发起请求,达到攻击内网的目的。
答:
分享:通过URL地址分享网页内容
转码服务
在线翻译
图片加载与下载:通过URL地址加载或下载图片
图片、文章收藏功能
未公开的api实现以及其他调用URL的功能
答:
利用@绕过限制白名单域名
利用@,当网站限制只能访问 http://www.xxx.com类型的域名时,可以采用http基本身份认证的方式绕过,如: http://[email protected]
绕过限制白名单内网IP
采用短网址绕过
利用特殊域名,http://xip.io可以指向任意域名(原理是DNS解析),即 http://127.0.0.1.xip.io,可以解析为127.0.0.1
采用进制转换,127.0.0.1 八进制:0177.0.0.1;十六进制:0x7f.0.0.1;十进制:2130706433
利用[::],http://[::]:80/ 会解析为 http://127.0.0.1
添加端口号,http://127.0.0.1:8080
利用句号,如127。0。0。1 会解析为 127.0.0.1
采用302跳转
绕过限制请求http协议
采用302跳转
采用短地址
答:
对外网、服务器所在内网、本地进行端口扫描
向内部任意主机的任意端口发送payload来攻击内网服务
DOS攻击(请求大文件,始终保持连接Keep-Alive Always)
攻击内网的web应用,如直接SQL注入、XSS攻击等
利用file、gopher、dict协议读取本地文件、执行命令等
可以无视网站CDN
答:
禁止跳转
过滤返回的信息
如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
统一错误信息
避免用户可以根据错误信息来判断远程服务器的端口状态。
限制请求的端口
比如80,443,8080,8090。
禁止除HTTP和HTTPS外的协议
比如说仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp://请求等引起的问题。
对请求地址设置白名单或者限制内网IP
答:
XML 文件在引用外部实体时候,可以沟通构造恶意内容,可以导致读取任意文件,命令执行和对内网的攻击
答:
1.直接通过DTD外部实体声明
加粗样式
2.通过DTD文档引入外部DTD文档,再引入外部实体声明
3.通过DTD外部实体声明引入外部实体声明
答:
任意文件读取
系统命令执行
执行远程代码
DOS拒绝服务攻击
内网端口探测
攻击内网网站
钓鱼
答:
●禁用外部实体的引入
比如PHP语言中使用libxml_disable_entity_loader(true);等方式。
Python语言中使用
from lxml import etree xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
●过滤如SYSTEM等敏感关键字,防止非正常、攻击性的外部实体引入操作。
答:
Web页面中文件上传功能没有对上传的文件做合理严谨的过滤,导致用户可以利用此功能,上传能被服务端解析执行的文件,并通过此文件获得执行服务端命令的能力。
答:
前端JS禁用绕过
在前端页面禁用JS,当然也有可能影响正常页面显示却没用
简单修改后缀名绕过
如果只是前端页面限制上传的 文件后缀名,那么我们就可以利用burp suite等工具修改文件后缀名绕过。
抓包修改MIME类型
常见图片MIME类型: image/gif, image/png, image/jpeg, image/bmp, image/webp, image/x-icon, image/vnd.microsoft.icon
服务端代码是通过Content-Type的值来判断文件的类型,这样我们可以直接对文件的Content-Type值进行修改来绕过。
后缀名大小写绕过
如果源代码没有对文件后缀名进行大小写转换,那么只要更改文件名后缀大小写即可绕过黑名单
图片马绕过
使用edjpgcom等工具或者命令将图片和WebShell制作成一个图片马
GIF89a图片头文件欺骗
比如GIF89a,在webshell前面加上GIF89a,后台认为是图片,上传后再执行木马,更有效的做法是结合其他绕过方法更有针对性的绕过。
%00,0x00截断
比如修改文件名为 1.php%00.jpg,如果php 版本<5.3.4 在url中%00表示ascll码的0 ,而ascii码的0,表示字符串结束,所以当url中出现%00时就会认为读取已结束,最后会被解析为 1.php,从而实现绕过
.htaccess文件绕过
.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过.htaccess文件,可以帮我们实现:网页 301重定向、自定义 404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
比如说在htaccess文件中有如下内容
AddType application/x-httpd-php .png 那我们随后上传png后缀图片马即可绕过
.user.ini.绕过
.user.ini文件里的意思是:所有的php文件都自动包含指定的文件,比如说某网站限制不允许上传.php文件,你便可以上传一个.user.ini,再上传一个图片马,包含起来进行getshell。不过前提是含有.user.ini的文件夹下需要有正常的php文件,否则也不能包含了。 再比如,你只是想隐藏个后门,这个方式是最方便的。
条件竞争绕过
一些网站上传文件的逻辑是先允许上传任意文件,然后检查上传的文件是否包含webshell脚本,如果包含则删除该文件。这里存在的问题是文件上传成功后和删除文件之间存在一个短的时间差(因为要执行检查文件和删除文件的操作),攻击者可以利用这个短的时间差完成条件竞争的上传漏洞攻击。比如上传一个php文件里面这样写
**:: D A T A 绕过 ∗ ∗ 在 p h p 代码中没有对 : : DATA绕过** 在php代码中没有对:: DATA绕过∗∗在php代码中没有对::DATA进行过滤,在windows中会将文件名:: D A T A 之后的数据当成文件流处理,保持 : : DATA之后的数据当成文件流处理,保持:: DATA之后的数据当成文件流处理,保持::DATA之前的文件名
假设上传的文件为test9.php:: D A T A . j p g ,如果成功上传到服务器就会去掉 : : DATA.jpg,如果成功上传到服务器就会去掉:: DATA.jpg,如果成功上传到服务器就会去掉::DATA.jpg变成test9.php进行保存
但是php代码中还通过strrchr函数获取文件后缀.jpg,并以该后缀作为上传之后的文件后缀
所以test9.php::$DATA.jpg上传到服务器后缀仍然是.jpg
点+空格+点绕过
某些情况下,源代码先是去除文件名前后的空格,再去除文件名最后所有的 .,再通过strrchar函数来寻找 .来确认文件名的后缀,但是最后保存文件的时候没有重命名而使用的原始的文件名,导致可以利用1.php. .(点+空格+点)来绕过
后缀名双写绕过
黑名单过滤,将黑名单里的后缀名替换为空且只替换一次,因此可以用双写绕过,比如1.pphphp,后端源代码过滤掉红色标注部分,剩余1.php。
特殊可解析后缀绕过
源代码有黑名单限制,那么我们就可以修改文件后缀名为根据后端的 脚本语言能够解析的文件后缀,比如源代码是用php语言写的话,1.php1会被解析为1.php
PhP除了可以解析php后缀 还可以解析php1,php2,php3,php4 ,phtml等 Asp可解析 asa,cer,cdx Aspx可解析 ashx,asmx,ascx Jsp可解析jspx、jspf
然而这种绕过方法可能会让我们绕过成功,但服务器默认配置却可能不允许这些后缀的文件执行
1、SQL注入
(1)对sqlmap的判断:若攻击者使用sqlmap且未加 --random-agent参数,则可以通过捕获请求包的user-agent字段来判断攻击者是否在使用sqlmap进行攻击;sqlmap在进行初识监测时会进行一些预检测,第一条语句是对数据库类型和XSS漏洞进行监测,且这句话几乎每次注入都不变,即我们可以通过XSS测试语句判断()
。
(2)出现一些特殊字符:比如单引号括号’(
(3)出现SQL命令或语句:增加、删除、修改、查询
(4)出现注释符号:比如连续两个减号–
(5)url上出现万能密码字段:‘or’1’='1
2、XSS
payload包含标签;
标签的一些事件:比如onclick、ondbclick、onload;
标签的超链接属性:比如href、src。
3、挖矿行为
若存在连续几个数据包中都符合stratum协议的json载荷特征,那么主机存在挖矿,stratum协议是目前主流的矿机和矿池间的TCP通讯协议,也可通过CPU使用率来判断,找到CPU占用高的进程获取PID信息。
1、中国菜刀
请求体中存在eval、base64等特征字符;
连接过程中使用base64编码对发送的指令进行加密;
还有一段以QG开头,7J结尾的固定代码。
2、蚁剑
默认的user-agent请求头是antsword XXX(不过可以修改)
一般将payload进行分段,分别进行base64编码;
一般具有像eval这样的关键字和@ini_set(“display”,“0”);这段代码。
3、冰蝎
PHP代码中可能存在eval、assert等关键词;
jsp代码中可能会有get class(),get class loader()等字符特征。
1、信息泄露
看访问路径中是否存在特殊文件或路径
2、SQL注入
看请求参数、请求头、请求体中是否包含SQL语句或关键字(比如union select)
3、文件上传
看请求体中是否包含代码内容(如果响应体中有success等上传成功的字样,或者有该文件的访问记录,则说明webshell上传成功)
4、XSS
看请求参数或请求体中是否包含JavaScript代码,将响应体的数据复制到文件中执行,如果弹窗,说明攻击成功。
5、代码执行
看请求参数、请求头、请求体中是否包含恶意代码(比如请求体中包含PHP代码,fastjson反序列化攻击,thinkph5远程代码执行)