安全要点梳理
2024-03-18 15:55:37 1 举报
AI智能生成
SSRF服务端请求伪造攻击 跨站脚本漏洞XSS 跨站请求伪造攻击漏洞CSRF 跳转漏洞 SQL注入 命令注入漏洞
作者其他创作
大纲/内容
SSRF服务端请求伪造攻击
如果应用程序对用户提供的URL和远端服务器返回的信息没有进行合适的验证和过滤,就可能存在这种服务端请求伪造的缺陷
类型
1.可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;
2.攻击运行在内网或本地的应用程序(比如溢出);
3.对内网web应用进行指纹识别,通过访问默认文件实现;
4.攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);
5.利用file协议读取本地文件等。
防御
1,过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
2, 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
3,限制请求的端口为http常用的端口,比如,80,443,8080,8090。
4,黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。
5,禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。
跨站请求伪造攻击漏洞CSRF
A打开浏览器登录了某网站test.com(此时浏览器已经有test.com的cookie),新建一个浏览器标签,打开黑客的网站hacker.com,hacker.com上有一段JS向test.com的某个CGI发送数据(这个cgi的功能是修改个人资料),由于浏览器的会话机制,它会将test.com的cookie发送出去,test.com会认为这就是用户提交过来修改资料的请求,而执行它。
分类
CSRF写——更改设置
攻击载体只需要发送HTTP请求的情况
Web应用程序在有登录态的情况下更改数据,是第三方站点只需要发送请求而不需要获得返回结果
写和读——获取敏感信息
攻击载体不仅要先发送HTTP请求,还要获取Web应用程序对该请求的返回内容的情况
有登录态的情况下会输出敏感信息,第三方站点需要发送请求并还要获得返回结果
JSON Hijacking和flash装载网页
防御
请求里面有第三方不可预测(或控制)的值
重要操作都输入验证码
在特别关键的操作建议启用,其他操作建议预埋验证码,紧急时刻(如出现CSRF蠕虫)可以临时启用
referer是否为正常页面
referer是可以伪造的
Form Token
在输出表单的地方增加一个隐藏域,值是一个随机数,提交请求时会带上这个数,Web应用程序在后台校验,如果是第三方站点的话是无法获知这个数的
如果输出token的站点本身有XSS,则token就会被黑客拿到
跳转漏洞
服务端未对传入的URL变量进行控制,可以恶意构造一个恶意地址,让用户跳转到恶意网站。跳转漏洞一般用于钓鱼攻击
漏洞检测
修改参数中的合法URL为非法URL,包含检测是否设置过于宽松(如设置为 *.qq.com 是不允许的)
漏洞修复
需要经过验证的页面,可跟踪上一个页面的文件名,只有从上一页面转进来的会话才能读取这个页面。
仅传递一个回调url作为参数是不安全的,增加一个参数签名,保证回调url不被修改
对 url 参数进行校验。进行url跳转时,禁止跳转到其他非相关域名,含非公司域名及公司其他非相关业务域名
验证来源页面合法性、验证待跳转页面是否为公司域名
增加一个对待跳转url的签名参数
跨站脚本漏洞XSS
概念
在客户端发动造成攻击
向网页内容中写入一段恶意的脚本或者HTML代码
传入一段脚本<script>[code]</script>
类型
持久型XSS
Web邮箱、BBS、社区等从数据库读出数据的正常页面
非持久型
每次都要输入
场景
输出在HTML页面
传入的参数中带有“<”和“>”符号会被浏览器解析
http://localhost/test.php?name=lake<script>alert(123456)</script>
输出在HTML属性,传入数据输出到属性
我们提交的数据能够闭合属性标签
<a href="test">Hi</a><script>alert(123456)</script><!—">Enter</a>
输出在JavaScript代码
var yourname = 'a';alert(123456);//';
测试
黑盒
在不知道源代码的情况下通过各种技术手段对Web应用程序进行的探测
常见的出问题的代码是eval、 document.write、document.writeln、window.exeScript、标签的innerHTML属性、标签的src属性
XSS测试手册(XSS Cheat Sheet)
http://ha.ckers.org/xss.html
免费的软件有ProxyStrike、Paros、WebScarab等,商业的扫描器有AppScan、WebInspect
白盒
阅读代码找漏洞
比如PHP,就是检查echo、print函数的参数是否来自外部并且没有经过防跨站处理就直接显示到页面;对ASP来说,就是response.write之类的输出函数。
攻击手法
盗取Cookie
在JavaScript中可以使用document.cookie来获得当前浏览器的Cookie
盗取Cookie升级版——保持会话
实时记录Cookie并不断刷新页面保持Session的程序——SessionKeeper
页面劫持——挂马和钓鱼攻击
防御跨站脚本攻击
处理数据
直接输出在页面的数据需要对“<”、“>”HTML编码: < 编码为 < > 编码为 >
输出在HTML属性中的数据不能让属性值被闭合。
用双引号(")表示的属性需要编码属性值中的双引号: " 编码为"
用单引号(')表示的属性需要编码属性值中的单引号:
' 编码为39;
需要按照JavaScript的语法把单引号转义:
' 转义为 \'
限制img标签的src属性始终以http://或https://开头(白名单匹配)
提高攻击门槛
设置cookie的作用域来减少cookie的暴露面
Set-Cookie: a=123; domain=show.qq.com
限制cookie在某一子域名某个目录下存在,在别的目录将无法访问这个cookie:
Set-Cookie: a=123; path=/test
在设置Cookie的时候,可以附加一个HTTPOnly的属性,这样的话,当浏览器向Web服务器发起请求的时就会带上cookie字段,但是在脚本中却不能访问这个cookie
Set-Cookie: a=123; HTTPOnly;
在客户端防御
firefox
NoScript
IE
把安全级别设置为高,并使用白名单只允许在信任的站点运行脚本、flash和Java小程序
防护方法
输入参数类型或字符的白名单判断
根据场景进行输入/输出转义:& ' " < >等(以OWASP ESAPI组件为例)
Entity标签间:ESAPI.encoder().encodeForHTML()
Html属性:ESAPI.encoder().encodeForHTMLAttribute()
Script代码:ESAPI.encoder().encodeForJavaScript()
CSS style属性:ESAPI.encoder().encodeForCSS()
链接url的参数值:ESAPI.encoder().encodeForURL()
缓解方法
将Cookie设置HttpOnly
对json格式url设置content-type为application/javascript
其他过滤api:
PHP:htmlspecialchars()
java:maven组件,qq-central:xssDefence-service、qq-central:secureAPI、org.owasp.esapi:esapi
SQL注入
注入方式
整数型:select * from [table] where id=10 and 1=1
字符型:select * from [table] where id='10' and '1'=1'
搜索型:select * from [table] where id like '%10%' and 1=1 and '%'='%'
判断方式
通过构造SQL语句,改变SQL语句逻辑,观察页面返回情况来判断数据库内容;
根据不同数据库的特性可以进行从信息刺探到远程执行命令。
漏洞修复
对用户提交的所有表单、参数进行有效的合法性判断和非法字符过滤
一、如果是整数,直接int
二、如果是有规则的字符串,使用正则之类的手段确保是合法的(eg,如果是个md5值,那就判断是否只含有字母和数字)
三、如果是无规律的字符串,则使用mysql_real_escape_string来进行转移。
采用参数化sql的方式
架构上如果web不直连DB,中间加个memcache之类的缓冲层,可以从架构上彻底解决sql注入问题
数据库使用参数化查询,严格定义数据库用户的角色和权限
在服务器端进行判断和验证,禁止仅在客户端以脚本形式对客户端进行合法性判断和参数字符过滤
用户输入都比进行合法性校验;所有数据库SQL操作必须参数化;数据库数据查询要有权限分级和审核。
命令注入漏洞
漏洞
由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令
会允许攻击者在客户端通过改变 $PATH 或程序执行环境来执行一个恶意构造的代码,并在服务器端执行
<?php
$log_string = $_GET[‘log’];
system("echo \"".date("Y-m-d H:i:s ")." ".$log_string."\" >> /logs/".$pre."/".$pre.".".date("Y-m-d").".log");
}
?>
构造xxx.php?log=`id`形式的URL
命令注入攻击中WEB服务器没有过滤类似system(),eval(),exec()等函数是该漏洞攻击成功的最主要原因
漏洞修复
禁止用户直接控制命令的执行,采用权限最小原则控制执行,并通过白名单的方式允许用户输入字符和命令
利用 可依赖的变量在执行赛程中构建绝对路径,防止攻击者通过修改程序运行命令的环境来控制命令的执行
对从配置文件和环境变量中读取出来的命令变量和路径进行校验,检查期合法性、用户及权限,避免资源被恶意篡改的情况下执行
在代码级调用shell的时候对命令行特殊字符进行转义(|、&、;等),防止执行其他非法命令
PHP中可使用escapeshellarg、escapeshellcmd来转义
减少使用系统命令,如通过文件函数获取文件属性,而不是“ls -l <文件名>”
对可输入的字符范围做白名单限制
限制绝对路径,避免被修改PATH等环境变量带来影响
转义:;`|*?~<>^()[]{}$\, \x0A \xFF ' "
转义api:
PHP:escapeshellarg();escapeshellcmd();
0 条评论
下一页