作者:汪娇娇
时间:2017年8月15日
当时也是看了一本书《白帽子讲web安全》,简单的摘录然后做了个技术分享,文章不是很详细,建议大家结合着这本书看哈。
web安全
一、世界观安全
1、黑帽子、白帽子
2、安全三要素:
- 机密性
- 完整性
- 可用性
3、如何实施安全评估
- 资产等级划分
- 威胁分析(STRIDE)
- 风险分析(DREAD)
- 设计安全方案
4、白帽子兵法
- Secure By Default原则(白名单黑名单、最小权限)
- 纵深防御原则(各个层面、对症下药)
- 数据与代码分离原则(漏洞成因,注入)
- 不可预测性原则(克服攻击方法,各个算法)
二、客户端脚本安全
第一章、浏览器安全
1. 同源策略
(1)影响“源”的因素:
- host(域名或IP地址)
- 子域名
- 端口
- 协议
"http://store.company.com/dir/phther.html""http://customer.com/dir/phther.html""http://news.company.com/dir/phther.html""http://store.company.com:81/dir/phther.html""https://store.company.com/dir/phther.html"
(2)对当前页面来说,页面内存放JS文件的域并不重要,重要的是加载JS所在的域是什么。
(3)<script>、<img>、<iframe>、<link>等都可以跨域加载资源。=> get请求
(3)
2. 浏览器沙箱
3. 恶意网址拦截
三、XSS(跨站脚本攻击)
1、XSS简介
通常指黑客通过“HTML注入”篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。
分类:
- 反射性XSS:简单的把用户输入的数据“反射”给浏览器。
- 存储型XSS:会把用户输入的数据“存储”在服务端。
- DOM Based XSS:修改DOM节点形成的xss。
2、XSS攻击
(1)cookie劫持:
(2)构造GET和POST请求
(1)GET:
例:正确删除谋篇文章的链接是:
http://blog.sohu.com/menage/entry.do?m=delete&id=123456
攻击者通过插入一张图片发起一个GET请求:
var img = document.createElement("img");img.src = "http://blog.sohu.com/menage/entry.do?m=delete&id=123456";document.body.appendChild(img);
(2)POST:
- 构造表单自动提交
- XMLHttpRequest
(3)xss钓鱼
窃取密码:伪造一个登录框
(4)识别用户浏览器
-
navigator.userAgent
-
window.opera(Opera)、window.netscape(Mizilla)、document.adoptNode(IE 8+)等
(5)识别用户安装的软件
- IE:判断ActiveX控件的classid
try{ var Obj = new ActiveXObject('XunLeiBHO.ThunderIEHElper');}catch(e){ //异常,不存在该软件}
- Flash:system.capabilities
(6)CSS History Hack
通过css发现一个用户曾经访问过的网站:style的visited属性。
(7)获取用户的真实IP地址
借助第三方软件:例如,Java环境的Java Applet接口
3、XSS构造技巧
(1)利用字符编码
系统转义了双引号:
var redirectUrl = "\";alert(/xss/);";
GBK/GB2312编码
Firefox中:"%C1"被认为是1个字符 %C1",alert(/xss/);//
(2)绕过长度限制
">
" onclick=alert(1)//
(3)使用<base>标签
(4)
window.name = "alert(document.cookie)";location.href = "http://www.xssedsite.com/xssed.php";
evel(name);
4、XSS防御
(1)HttpOnly
现在很多浏览器都禁止JS访问带有HttpOnly的cookie。
Set-Cookie时标记:
(2)输入检查(必须放在服务端)
- XSS Filter:特殊字符,但语境理解并不完整。
例:1+1<3
(3)输出检查:编码或转义
php中:htmlspecialchars()和htmlentities()
JS中:escape()
(4)正确防御XSS
- 在HTML标签中输出:对变量HtmlEncode
$var
- 在HTML属性中输出:HtmlEncode
<"">
String safe = ESAPI.encode().encodeForHTMLAttribute(request.getParameter("input"));
- 在<script>标签中输出:JavascriptEncode
- 在事件中输出:JavascriptEncode
test
- 在CSS中输出:尽可能禁止用户控制,或用OWASP ESAPI中的encodeForCSS()
- 在地址中输出:URLEncode
四、CSRF(跨站点请求伪造)
1、CSRF简介
攻击者诱使用户访问一个恶意网址,并以该用户身份在第三方站点里执行一次操作。 例:删除博客文章:
2、CSRF进阶
- 浏览器的cookie策略
Session Cookie
Third-party Cookie:IE、Safari禁止发送,FireFox、Opera、Chrome、Andriod允许
- P3P头的副作用(Platform for Privacy Preferences)
P3P头是W3C制定的一项关于隐私的标准,如果网站返给浏览器的HTTP头中包含P3P头,将允许浏览器发送第三方Cookie
- GET和POST(表单)
3、CSRF防御
-
验证码:强制用户必须与应用进行交互。
-
Referer Check:检查请求是否来自合法的“源”。
-
Anti CSRF Token
CSRF本质:重要操作的所有参数都可以被攻击者猜到
http://host/path/delete?username=abc&item=123http://host/path/delete?username=md5(salt+abc)&item=123http://host/path/delete?username=abc&item=123&token=[random(seed)]
问题:
(1)多页面问题:多个有效的token
(2)保密性:尽量把token放在表单中,post请求
五、注入攻击
条件:
(1)用户能够控住输入
(2)原本程序要执行的代码,拼接了用户输入的数据
1、SQL注入
var ShipCity;ShipCity = Request.form("ShipCity");var sql = "select * from OrdersTable where ShipCity = '"+ ShipCity +"'";
Beijing
Beijing',drop table OrdersTable--
错误回显
- 盲注:构造简单的条件语句,看页面是否发生变化
http://newspaper.com/items.php?id=2SELECT title,description,body FROM items WHERE ID = 2
http://newspaper.com/items.php?id=2 and 1=2SELECT title,description,body FROM items WHERE ID = 2 and 1=2
- Timing Attack
MYSQL:BENCHMARK()函数,BENCHMARK(count,expr)
2、数据库攻击技巧
- 常见攻击技巧
(1)猜版本:
http://www.site.com/new.php?id=5 and substring(@@version,1,1)=4
(2)确认表名admin,列名passwd是否存在
id=5 union all select 1,2,3 from adminid=5 union all select 1,2,passwd from admin
(3)猜username和password具体的值
id=5 and ascii(substring((select concat(username,0x3a,passwd) from users limit 0,1),1,1)) > 64 /*ret true*/
- 命令执行:UDF
lib_mysqludf_sys.so上传到数据库能访问到的路径下。
- 攻击存储过程
使用CALL或EXCUTE来执行。
xp_cmdshell
EXE master.dbo.xp_cmdshell 'cmd.exe dir c'
- 编码问题:宽字符集
0xbf27 or 1=1 统一UTF-8
3、正确防御SQL注入
找到漏洞,修改漏洞
- 使用预编译语句:数据与代码分离
String custname = request.getParameter("customerName");String query = "SELECT account_balance FROM user_data WHERE user_name = ? ";PreparedStatement pstmt = connection.prepareStatement(query);pstmt.setString(1,custname);ResultSet results = pstmt.executeQUery();
- 使用存储过程
尽量避免使用动态的语句,对用户的输入数据进行严格过滤或编码函数来处理。
- 检查数据类型
interger
4、其他注入攻击
- XML注入
- 代码注入
eval()、PHP的动态include、system()
- CRLF注入 \r\n
六、文件上传漏洞
1、问题:
- 上传文件是Web脚本语言
- Flash策略文件crossdomain.xml
- 病毒、木马文件
- 钓鱼图片或包含脚本
2、功能还是漏洞
- Apache文件解析问题
从后往前解析
Phpshell.pgp.rar.rar.rar.rar
- IIS文件解析问题
截断字符:分号
adc.asp;xx.jpg
- PHP CGI路径解析问题
jpg -> php
cgi.fix_pathinfo
- 利用上传文件钓鱼
图片里实际内容是代码
3、设计安全的文件上传功能
- 文件上传的目录设置为不可执行
- 判断文件类型:MINME Type、后缀检查
- 使用随机数改写文件名和文件路径:能上传不能访问
- 单独设置文件服务器的域名:同源策略