web攻击总结
由于会经常浏览一些安全的帖子,觉得有用的就会收藏起来,时间久了,收藏的网页越来越多,浏览起来特别方便,于是想了想,觉得还是基于自己的理解以及其他人的经验,尽量总结到一块,也方便自己做归纳总结,对于同一类的问题,也能及时发现。本次主要总结的内容为web攻击相关的知识。
一、XSS注入
基本介绍
可在浏览器侧执行某些特定的攻击代码片段。本质是js代码执行。例如获取cookie并发送到自己的网站(跨站),故也称跨站脚本攻击。可分为反射型、持久型、DOM型。
反射型:不存储代码片段,常见如直接出现在URL中。一般只影响访问这个URL的用户
持久型:需要存储在特定地方,常见如数据库,cookie,redis等。一般会影响所有能访问这个存储资源的用户。
DOM型:针对用户输入来动态构建页面的DOM节点。(它也可能是反射型,也可能是持久型),所以影响面不确定。
常见的攻击标签
#a标签
#herf属性
<a href="javascript:confirm('a')" >1</a>
#onmouseover标签
<a onmouseover="javascript:alert('a_onmouseover')">12</a>
#img、video、audio、svg、body标签
#onerror、onload属性
<img src="#" onclick="javascript:alert('img:onclick')" onerror="javascript:alert('img:onerror')" onload="javascript:alert('img:onload')" />
#iframe标签
#src属性
<iframe src="javascript:alert('iframe')" width= "0" height= "0"/>
#form标签
#action标签
<form action="Javascript:alert('from_action0')" />
#input标签
#formaction标签
<input type="submit" formaction="JaVaScript:alert('from_action2')"/>
常见的注入点
- 富文本框
常见解决方案
1.输入校验 2.输出转码 3.前端过滤
二、CRLF注入
CR回车、LF换行。主要针对注入回车换行符,导致系统或者页面呈现完全不一样的效果,成为CRLF注入,换行符注入。
日志注入
日志注入是比较常见的CRLF注入,通过注入回车换行符,达到注入一条新的日志,从而达到日志伪造的目的。
举例说明:其中红线框起来的就是注入点,其中userName受用户控制,下面其他的日志,都是用户构造,通过注入换行符,看起来就像是一条正常的日志
HTTP响应头CRLF注入
// todo待补充相关知识
防御措施
一般分为:
1.手动过滤特殊字符。
2.使用日志框架的能力进行过滤
换行符
操作系统 | 文件换行符 |
Windows | \r\n |
Linux | \n |
Mac | \r\n |
三、SQL注入(mysql)
这里主要针对mysql类似的数据库,主要针对sql拼接字符的情况。
SQL注入主要指的是,用户可控制执行的SQL,达到执行预期以外的SQL命令,即SQL注入。
会造成SQL注入,主要分成两种情况:
- 手动拼接SQL
- 未使用预编译
手动拼接SQL
// 以下代码,若tableName、username、password能够受到用户控制,则会导致SQL注入
String tableName = "users";
String username = "John";
String password = "password";
// 拼接sql
String sql = "insert into " + tableName + " (username,password) values('"+username+"','" +password + "')";
Connection connection = DatabaseConnector.getConnection();
Statement statment = connection.createStatement();
statement.executeUpdate(sql);
// 例如SQL中,拼接字符。就会导致 用户表插入了一条新的admin用户,达到了注入的目的。
tableName = "users (username,password) values('admin','123456') --";
未使用预编译
我们实际开发过程中,很少拼接SQL,更多的是使用mybatis进行开发,其中就涉及到预编译。
mybatis.xml中一般有两种占位符 #{} 和 ${}。
#{}预编译
拼接字符时,会将整个占位符按照一整块处理,默认是字符串类型,则不会导致SQL的结构进行改变。
${}静态拼接
拼接字符时,会直接使用字符拼接的方式进行拼接,跟手动拼接一模一样。
SQL防御措施
这个比较简单。
- 无脑使用#{}
- 非得使用拼接SQL的情况。使用白名单限制字符
- 点赞
- 收藏
- 关注作者
评论(0)