web安全、XSS、CSRF、注入攻击、文件上传漏洞

作者:汪娇娇

时间:2017年8月15日

当时也是看了一本书《白帽子讲web安全》,简单的摘录然后做了个技术分享,文章不是很详细,建议大家结合着这本书看哈。

web安全

一、世界观安全

1、黑帽子、白帽子

2、安全三要素:

  • 机密性
  • 完整性
  • 可用性

3、如何实施安全评估

  • 资产等级划分
  • 威胁分析(STRIDE) image
  • 风险分析(DREAD) image
  • 设计安全方案

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请求

<script src="1.js"></script>
<img src="1.jpg"/>
<link rel="stylesheet" href="1.css"/>

(3)XMLHttpRequest

2. 浏览器沙箱

image

3. 恶意网址拦截

image

三、XSS(跨站脚本攻击)

1、XSS简介

通常指黑客通过“HTML注入”篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。

正常demo:test1

xss后:test1

分类:

  • 反射性XSS:简单的把用户输入的数据“反射”给浏览器。
  • 存储型XSS:会把用户输入的数据“存储”在服务端。
  • DOM Based XSS:修改DOM节点形成的xss。demo:test2

2、XSS攻击

(1)cookie劫持demo:test3

(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)识别用户安装的软件

try{
    var Obj = new ActiveXObject('XunLeiBHO.ThunderIEHElper');
}catch(e){
    //异常,不存在该软件
}
  • Flash:system.capabilities

(6)CSS History Hack

通过css发现一个用户曾经访问过的网站:style的visited属性。 demo:test3-2

(7)获取用户的真实IP地址

借助第三方软件:例如,Java环境的Java Applet接口 image

3、XSS构造技巧

(1)利用字符编码

系统转义了双引号:

var redirectUrl = "\";alert(/xss/);";

GBK/GB2312编码

Firefox中:"%C1"被认为是1个字符 %C1",alert(/xss/);//

(2)绕过长度限制

<input type="text" value="$var" />
"><script>alert(/xss/)<script>
" onclick=alert(1)//

(3)使用<base>标签 demo:test4

(4)window.name demo:test5-1

window.name = "alert(document.cookie)";
location.href = "http://www.xssedsite.com/xssed.php";

evel(name);

4、XSS防御

(1)HttpOnly

现在很多浏览器都禁止JS访问带有HttpOnly的cookie。

Set-Cookie时标记: demo:test6

(2)输入检查(必须放在服务端)

  • XSS Filter:特殊字符,但语境理解并不完整。

例:1+1<3

(3)输出检查:编码或转义 demo:test7

php中:htmlspecialchars()和htmlentities()

JS中:escape()

(4)正确防御XSS

  • 在HTML标签中输出:对变量HtmlEncode demo:test8 image
<div>$var</div>
<div><script>alert(/xss)</script></div>
  • 在HTML属性中输出:HtmlEncode
<div id="abc" name="$var"></div>
<div id="abc" name=""><script>alert(/xss/)</script><""></div>

OWASP ESAPI  

String safe = ESAPI.encode().encodeForHTMLAttribute(request.getParameter("input"));
  • 在<script>标签中输出:JavascriptEncode
<script>
    var x = "$var";
</script>
<script>
    var x = "",alert(/xss);//";
</script>
  • 在事件中输出:JavascriptEncode
<a href="#" onclick="funcA('$var')">test</a>
<a href="#" onclick="funcA('');alert(/xss/);//'>test</a>
  • 在CSS中输出:尽可能禁止用户控制,或用OWASP ESAPI中的encodeForCSS()
<style>@import 'http://ha.ckers.org/xss.css';</style>
  • 在地址中输出:URLEncode

四、CSRF(跨站点请求伪造)

1、CSRF简介

攻击者诱使用户访问一个恶意网址,并以该用户身份在第三方站点里执行一次操作。 例:删除博客文章:http://blog.sohu.com/menage/entry.do?m=delete&id=123456

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=123
http://host/path/delete?username=md5(salt+abc)&item=123
http://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=2
SELECT title,description,body FROM items WHERE ID = 2
http://newspaper.com/items.php?id=2 and 1=2
SELECT 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 admin
id=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上传到数据库能访问到的路径下。 image

  • 攻击存储过程

使用CALL或EXCUTE来执行。

xp_cmdshell

EXE master.dbo.xp_cmdshell 'cmd.exe dir c'
  • 编码问题:宽字符集

0xbf27 or 1=1 image统一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
  • 病毒、木马文件
  • 钓鱼图片或包含脚本 image

2、功能还是漏洞

  • Apache文件解析问题

从后往前解析

Phpshell.pgp.rar.rar.rar.rar

  • IIS文件解析问题

截断字符:分号

adc.asp;xx.jpg

  • PHP CGI路径解析问题

jpg -> php

cgi.fix_pathinfo

  • 利用上传文件钓鱼

图片里实际内容是代码

3、设计安全的文件上传功能

  • 文件上传的目录设置为不可执行
  • 判断文件类型:MINME Type、后缀检查
  • 使用随机数改写文件名和文件路径:能上传不能访问
  • 单独设置文件服务器的域名:同源策略

猜你喜欢

转载自my.oschina.net/u/2941696/blog/1510745