前言:Web是互联网上最为典型的应用模式,几乎涉及人们生活的各个方面,因此其安全问题备受关注。本章我们首先聚焦Web应用本身的安全问题,包括:Web应用体系的脆弱性分析,典型Web应用安全漏洞攻击(SQL注入、XSS、Cookie欺骗、CSRF、目录遍历、操作系统命令注入、HTTP消息头注入等)及其防范措施,然后简要介绍安全的HTTP协议HTTPS。
Web应用程序功能与安全隐患的对应关系
HTTP协议是一种简单的、无状态的应用层协议(RFC1945、RFC2616)
常见安全问题:
端到端通信中危险的中间盒子:祝福还是诅咒?
为什么需要Cookie?
Cookie的生成与维护:
Cookie的一般格式如下:
NAME= VALUE; expires= DATE; path= PATH;
domain= DOMAIN_NAME; secure
示例
autolog = bWlrzTpteXMxy3IzdA%3D%3D;
expires=Sat, 01-Jan-2018 00:00:00 GMT; path=/;
domain=victim.com
Cookie中包含了一些敏感信息,如用户名、计算机名、使用的浏览器和曾经访问的网站等,攻击者可以利用它来进行窃密和欺骗攻击
OWASP(开放式Web应用程序安全项目)是一个开放的社区,由非营利组织 OWASP基金会支持的项目。对所有致力于改进应用程序安全的人士开放,旨在提高对应用程序安全性的认识。
其最具权威的就是“10项最严重的Web 应用程序安全风险列表” ,总结并更新Web应用程序中最可能、最常见、最危险的十大漏洞,是开发、测试、服务、咨询人员应知应会的知识。
定义:注入漏洞,特别是SQL注入,在Web应用程序中很常见。注入发生在用户提供的数据作为命令或查询的一部分发送到解释器时。攻击者的恶意数据欺骗解释器执行意外的命令或更改数据。
最普遍的注入漏洞包括:
例子:
"SELECT * FROM USERS WHERE SSN=‘" + ssn + "’“
SSN参数来自于用户的输入:
1234’ OR ‘1’=‘1
应用程序构造查询语句:
SELECT * FROM USERS WHERE SSN=‘1234’ OR ‘1’=‘1’
(永真逻辑)说明:SSL、防火墙等安全措施对于此类攻击完全没用。
实战: IBM所提供的Web安全漏洞演示网站
System.Text.StringBuilder.query = new System.Text.String.Builder(“SELECT * from Users WHERE login =“).Append(txtLogin Text).Append(“'AND password=“').Append(txtPassword.Text).Append(“”)
'or'1'='1
的内容SELECT * from Users WHERE login = ‘or '1'='1' AND password ‘or '1'='1'
DVWA靶场——下载与安装
sqlmap详细使用教程
防御注入漏洞:
如何判断是字符型注入还是数字型注入
使用合天网安实验室进入WEB渗透测试实验平台,并进入SQL注入进阶实验
$sql = "SELECT * FROM users where name='";
$sql .= $_GET ["name"]."'";
$result = mysql_query ($sgl);
获取该网络后台数据库的数据库名
实例2、节约是种美德,少用空格
关键代码:
if (preg_match ( '/ /', $_GET ["name"])){
die("ERROR NO SPACE");
}
$sql = "SELECT * FROM users where name='";
$sql .= $_GET ["name"]."'";
$result = mysql_query ($sql);
上述步骤与实例1基本相同,提示:URL中%20表示空格,可替代成%a0,%a0在Mysql中为换行符。注释指令可用#并用%23编码进行替代。
定义:跨站脚本(XSS)漏洞发生在应用使用用户提供的数据并发送给web浏览器而未经第一次验证或编码的时候。XSS允许攻击者在受害者的浏览器中执行脚本,这可以劫持用户会话、篡改网站、可能引入蠕虫等。
原理:输入插入包含有JavaScript或其它恶意脚本的HTML标签代码。
<script>alert(XSS)</script>
问题根源:不当的服务器端输入检查,从而允许用户输入可被客户端浏览器解释的脚本命令。
XSS是最普遍的Web程序安全问题。
DOM,文件对象模型,Document Object Model.是给HTML和xml文件使用的一组API,是建立网页与Script语言沟通的桥梁,比如table对象代表HTML中的表格,可以由JavaScript脚本取用
例子:
(1) Alice经常浏览Bob建立的网站。Bob的站点运行Alice使用用户名/密码进行登录,并存储敏感信息(比如银行帐户信息);
(2) Charly发现Bob的站点包含反射性的XSS漏洞;
(3) Charly编写一个利用漏洞的URL,并将其冒充为来自Bob的邮件发送给Alice;
(4) Alice在登录到Bob的站点后,浏览Charly提供的URL;
(5) 嵌入到URL中的恶意脚本在Alice的浏览器中执行,就像它直接来自Bob的服务器一样。此脚本盗窃敏感信息(授权、信用卡、帐号信息等),然后在Alice完全不知情的情况下将这些信息发送到Charly的Web站点。
储存式跨站脚本攻击,也称为持久性跨站脚本攻击。如果Web程序允许存储用户数据,并且存储的输入数据没有经过正确的过滤,就有可能发生这类攻击。
在这种攻击模式下,攻击者并不需要利用一个恶意链接,只要用户访问了储存式跨站脚本网页,那么恶意数据就将显示为网站的一部分并以受害者身份执行。
DOM式XSS 攻击并不是按照“数据是否保存在服务端”划分的,它是反射式XSS 的一种特例,只是由于DOM式XSS的形成原因比较特殊,因此把它单独作为一个分类。
DOM式XSS 攻击是通过修改页面DOM节点数据信息而形成的。看下面的代码。
<script
function test(){
var str = document.getElementById("input").value;
document.getElementById("output").innerHTML="+str+"">test</a>";
}
</script>
<div id="output"></div>
<input type="text" id="input" size=50 value=""/>
<input type="button" value="提交" onclick="test()"/>
如果构造数据“‘ onclick=’javascript:alert(/xss/)”
,那么最后添加的html代码就变成了“test”
,插入一个onclick事件,点击提交按键,那么就会发生一次DOM式xss攻击。
对Web应用程序的所有输入进行过滤,对危险的HTML字符进行编码:
‘<’ , ‘>’ → ‘<’ , ‘>’
‘(‘ , ‘)’ → ‘(’ , ‘)’
‘#‘ , ‘&’ → ‘#’ , ‘&‘
对用户,谨防不明链接;
防止访问已知的恶意网站;
执行手工或自动化代码扫描,确定并消除潜在的XSS漏洞。
尝试构造语句使浏览器执行弹出对话框的脚本。
实例一、热身运动,不设防
关键代码:
echo $_GET["name"];
?>
实例二、小写不行,就大写吧
关键代码:
$name = $_GET["name"];
$name = preg_replace("/"
response.end
else
if Request.Cookies("power')<500 then
response.write""
response.redirect"http://cnc.cookun.com"
response.end
endif
endif
只要Cookie中的power值不小于500,任意用户都可以删除任意帖子。同样可以利用上面介绍的方法进行Cookie欺骗攻击面
上面介绍的两个攻击例子之所以成功,是因为在Cookie中保存了用户名、口令以及权限信息而留下了安全隐患。
如果Cookie中没有设置安全属性secure”,则Cookie内容在网络中用明文传输,攻击者监听到Cookie内容后可以轻松实现会话劫持
Q:为什么会不设置安全属性?
A:不设置Cookie安全属性的原因主要有两种:一种是Web应用开发者不知道安全属性或不愿意使用安全属性;第二种是设置安全属性后应用无法运行。
定义:CSRF(跨站请求伪造)攻击迫使已登录的受害者浏览器向易受攻击的Web应用程序发送预先验证的请求,然后强制受害者浏览器执行对攻击者有利的恶意操作。
现有银行的网银交易流程要比例子复杂得多,同时还需要USB key、验证码、登录密码和支付密码等一系列安全信息,一般并不存在CSRF安全漏洞,安全是有保障的。
重大的差别:
XSS攻击是实施CSRF攻击前的一个重要步骤:
防御CSRF攻击:
嵌入机密信息(令牌) | 再次认证(输入密码) | 检查Referer | |
---|---|---|---|
工作原理 | 在访问需防范CSRF的页面(登录、订单确认、密码修改确认页面等)时需要提供第三方无法知晓的机密信息(令牌,token)。假设请求通过POST方式提交,则可以在相应表单中增加一个隐藏域: token值由服务端生成,表单提交后token的值通过POST请求与参数一同带到服务端,并在服务端进行token校验,如果请求中没有token或者token内容不正确,则认为是CSRF攻击而拒绝该请求。每次会话可以使用相同的token,会话过期,则token失效,攻击者因无法获取到token,也就无法伪造请求 |
执行操作前让用户再次进行认证(如输入密码),以确认请求是否由用户自愿发起的 | 在通常情况下,访问一个安全受限页面的请求都来自于同一个网站。Referer 记录了HTTP请求的来源地址,检查Referer值是否是执行页面的上一个页面(输入页面或确认页面等),如果不是则很可能是CSRF攻击 |
许多Web应用支持外界以参数的形式来指定服务器上的文件名,如果服务器在处理用户请求时不对文件名进行充分校验,就可能出问题,如:
一般来说,如果Web应用满足以下3个条件时,就有可能产生目录遍历漏洞
define('TMPLDIR',‘/var/www/example/tmp1');
$tmp1 -$_GET( 'template');
?>
); ?>
</body>
http://example.cn/example/ex.php?template=../../../../etc/hosts%00
将显示/etc/hosts文件内容
防御:
/、\、:
等downfile.jsp?filename= %66%61%6E%2E%70%64%66
很多Web应用编程语言支持应用通过Shell执行操作系统(OS)命令。通过Shell执行OS命令,或开发中用到的某个方法在其内部使用了Shell,就有可能出现恶意利用Shell提供的功能来任意执行OS命令的情况,这就是OS命令注入。
// 页面功能是发送电子邮件( sendmai1.htm1)
<body>
<form action ="send.php" method="POST">
请输入您的邮箱地址<br>
邮箱地址<input type ="text" name ="mail"<br>
邮件内容<textarea name ="con" cols = "20" rows = "3"></textarea><br>
<input type = "submit" value ="发送”>
</form>
</body> // sendmail.html结束
// 接收页面的处理脚本(send.php)
<?php
$mail = $_POST['mail'];
// 调用OS命令sendmail将邮件发送到表单中填入的邮件地址$mail
// 邮件信息保存在template.txt中
system("/usr/sbin/sendmail -I $mail ");
// 省略代码
<body>
邮件已发送
<body> //send.php结束
如果用户在邮箱地址处输入的是正常的邮箱地址,该页面将给该邮箱发送一封正常的电子邮件。但是,如果攻击者在邮箱地址处输入的是以下内容:
[email protected]; cat /etc/passwd
则在页面上点击“发送”按钮后,页面上将显示的是系统口令文件/etc/passwd 的内容。此处攻击者只是用cat命令显示文件内容,他也完全可以用Web应用的用户权限执行任何操作系统命令,如删除文件、下载文件、执行下载来的恶意软件等。
上述攻击成功的主要原因是Shell支持连续执行多条命令,如Unix操作系统Shell中使用分号;
或管道|
等字符支持连续执行多条命令,Windows操作系统cmd.exe使用&
符号来连接多条命令。这些符号一般称为Shell的元字符,如果OS命令参数中混入了元字符,就会使攻击者添加的操作系统命令被执行,这就是OS注入漏洞产生的原因
OS命令注入攻击的一般流程为:
OS命令注入攻击防御策略:
指在重定向或生成Cookie时,基于外部传入的参数生成HTTP响应头:
看下面的例子
http://example.com/web/in.cfg?url=http://example.com/%0D%0ALocation: + http://trap. com /web/attack.php
执行之后,浏览器会跳转到恶意网站trap.com/web/attack.php
,而不是期望的正常网站http://example.com。造成这一结果的主要原因是,CGI脚本里使用的查询字符串url中包含了换行符(%0D%0A)。出两个消息头:
Location: http://example.com
Location: http://trap.com/web/attack.php
采用类似方法可以生成任意Cookie,看下面例子
http://example.com/web/in.cfg?url=http://example.com/web/exampple.php%0D%0ASet-Cookie: + SESSID=ac13rkd90
执行之后,两个消息头:
Set-Cookie: SESSID=ac13rkd90
Location: http://example.com/web/exampple.php
防御:
定义:易受远程文件包含(RFI)攻击的代码允许攻击者包含恶意代码和数据,从而导致毁灭性的攻击,如服务器完全被攻陷。恶意文件执行攻击会影响 PHP、XML 和任何接受用户文件名或文件的框架。
防御:
定义:当开发人员将内部实现对象的引用(例如文件、目录、数据库记录或键)暴露为URL或表单参数时,就会发生直接对象引用。攻击者可以操作这些引用,未经授权访问其他对象。
防御:
http://www.example.com/application?file=1
定义:应用程序可能会无意间泄露关于其配置、内部工作原理或违反隐私的信息,这可能是由于应用程序存在各种问题。攻击者利用这些弱点来窃取敏感数据或进行更严重的攻击。
敏感信息泄露常常细微难以察觉
常见的脆弱点:
示例1:
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC Microsoft Access 97 Driver] Can't open database ‘VDPROD'.
示例2:
java.sql.SQLException: ORA-00600: internal error code,
arguments: [ttcgnd-1], [0], [], [], [],
at oracle.jdbc.dbaccess.DBError.throwSqlException (DBError.java:169)
at oracle.jdbc.ttc7.TTIoer.processError (TTIoer.java:208)
错误处理信息对于Debug非常有用,但是为攻击者提供了太多潜在可用的攻击信息!
防御:
定义:账户凭据和会话令牌通常没有得到适当的保护。攻击者通过窃取密码、密钥或身份验证令牌来冒充其他用户的身份。
会话(Session)管理
会话管理:Session ID
会话管理:Session Hijacking
防御:
定义:Web程序很少正确使用加密功能来保护数据和凭据。攻击者利用弱保护的数据进行身份盗窃和其他犯罪活动,例如信用卡欺诈。
常见的问题:
防御:
定义:通常,应用程序仅通过防止向未经授权的用户显示链接或URL来保护敏感功能。攻击者可以利用此弱点直接访问这些URL并执行未经授权的操作。
当Web应用缺少对某些URL的访问限制,攻击者可以直接在浏览器中输入URL来访问。
比如:
Add_account_form.php
在显示这个表单页时要先对用户的管理员角色进行验证;add_acct.php
执行添加帐号的功能;add_acct.php
的直接访问,攻击者直接在浏览器中访问该页面,就绕过了权限检查。防御:
定义:当需要保护敏感通信时,应用程序经常无法加密网络流量。
存在的问题:
保证所有用来认证和传输敏感信息的连接都使用基于SSL/TLS的HTTPS
超文本传输安全协议(Hypertext Transfer Protocol Secure,HTTPS),是一种将HTTP和SSL(或TLS)结合来实现Web浏览器和服务器之间的安全通信协议,也称为HTTP over TLS,HTTP over SSL或HTTP Secure。基于SSL或TLS的HTTP并没有本质区别,都被称为HTTPS
【PPT分享】清华大学郑晓峰: 端到端安全协议的威胁、演进和部署
从用户使用的角度看,HTTP和HTTPS的主要区别是URL地址开始于http://还是https://
当使用HTTPS时,下述通信内容被加密:请求的文件的URL,文件的内容,浏览器表单的内容(由浏览器使用者填写),从浏览器发送到服务器或从服务器发送给浏览器的Cookie,HTTP标题的内容
连接建立:
作为HTTP用户的代理程序(也是TLS的用户)首先向服务器的指定端口(443)发起TCP连接请求。成功建立TCP连接后,向服务器发送TLS ClientHello,开始TLS握手过程。当TLS握手过程完成后,用户将发起第一次HTTP请求。此时,所有HTTP协议数据都要以TLS应用数据的形式通过TLS记录协议加密传输。在此过程中,要遵守HTTP协议规范,包括保留连接。
Q:HTTP连接的含义?
A:HTTPS连接具体多个层面的意思。在HTTP层面,一个HTTP用户通过向下一层(TCP或SSL/TLS)发送一个连接请求来向服务器请求建立一条连接;在TLS层面,一个会话建立在一个TLS用户和一个TLS服务器之间,可以在任何时间支持一条或多条TLS连接。一条TLS连接请求的开始总是伴随着一条TCP连接的建立。
连接关闭:
关闭一条HTTPS连接要求关闭TLS与其对应的对端实体之间的连接,这意味着也要关闭TLS的下层TCP连接。在TLS层面,关闭连接的最好方式是两端都用TLS告警协议发出一个“close_notify”告警。在发出“close_notify”后,一个TLS实体会立即关闭该连接,而不会等待它的对等实体发来“close_notify”告警,从而可能造成“不完整的关闭”。
HSTS (HTTP Strict Transport Security)
判断一个域名是否支持HTTPS: Internet.nl
有了HTTPS,即使被中间人攻击,也能防止攻击
国内部分地区网络出现中间人攻击:GitHub、京东等被劫持
域名注册商GoDaddy客服被钓鱼攻击,多家公司域名解析被篡改
HTTPS 劫持漫谈:代理劫持与透明劫持
简答题:小王某次出差住宿,利用酒店提供的Wi-Fi来上网,当他开始访问一个自己经常访问的网站时,浏览器却弹出类似“你的连接不是专用连接”,将鼠标放在浏览器地址栏的证书风险处,下拉显示“证书无效之类的信息”,如下图所示。浏览器提示用户“继续访问”还是“返回”。而自己平时在办公室访问该网站却没有出现该提示。请分析可能的原因。
答:最可能的原因是酒店在监听用户的上网,酒店使用自签名证书或浏览器不信任的CA颁发的证书作为中间人分别与浏览器与目标网站进行加密通信,解密、加密用户浏览器与目标网站之间的通信。
OK,以上就是本期知识点“Web应用安全”的知识啦~~ ,感谢友友们的阅读。后续还会继续更新,欢迎持续关注哟~
如果有错误❌,欢迎批评指正呀~让我们一起相互进步
如果觉得收获满满,可以点点赞支持一下哟~
❗ 转载请注明出处
作者:HinsCoder
博客链接: 作者博客主页