常用思路

(1)接口排查(“正向追踪”):先找出从外部接口接收的参数 ,并跟踪其传递过程,观察是否有参数校验不严的变量传入号位办法中,或者在传递的过程中是否有点啊逻辑漏洞(为了提高排查的全面性,代码审计人员可以向研发人员索要接口清单)。

(2)危险昂发溯源(”逆向追踪”):检查敏感方法的参数,并查看参数的传递与处理,判断变量是否可控并且经过严严格的过滤。

(3)功能点定向代审:根据经验判断该类应用通常会在哪些2功能中出现漏洞。直接审计该类功能的代码。

(4)第三方组件、中间件版本对比:检查web应用所使用的第三方组件或中间件的版本漏洞。

(5)补丁对比:通过补丁对比,反推漏洞的出处。

(6)黑盒测试+白盒测试。

(7)扫描工具的利用。

包结构以及命名规范

包名为com.公司名.项目名.模块名.……

持久层:dao、persist、mapper

实体类:entity、model、bean、javabean、pojo

业务逻辑:service、biz

控制器:controller、servlet、action、web

过滤器:filter

异常:exception

监听器:listener

在不同的框架下一般包的命名规则不同,但大概如上,不同功能的 Java 文件放在不同的包中,根据 Java 文件的功能统一安放及命名

1.不安全的日志输出

漏洞描述:

直接使用标准输出流输出日志可能会导致控制台存在敏感信息,直接在标准输出流或标准错误流中写入信息通常会作为一种非结构化日志记录形式使用。结构化的日志记录系统会提供各种关键要素,并将日志指向正确位置。

漏洞影响:

攻击者可通过控制台获取到系统运行产生的敏感信息,使用println()而不是专业的日志记录工具,会导致难以监控程序完整运行状况

威胁级别:

低风险

测试过程:

全局搜索System.out.println、System.err.println

修复建议:

建议删除相关代码,使用java日志记录工具进行记录

2.异常信息泄露

漏洞描述:

异常信息泄露是一种通过提交错误请求使系统出现异常处理并报错,导致系统程序、配置等敏感信息泄露

漏洞影响:

攻击者可利用异常报错泄露的信息(处理函数、系统版本、中间件信息等)获得深入和更有目的性的攻击条件

威胁级别:

低危

测试过程:

全局搜索printStackTrace

修复建议:

建议在不影响业务的前提下在系统中设置统一的报错界面,屏蔽错误信息对前端的输出,同时将系统报错信息记入系统日志存储。

3.代码中存在大量测试代码

全局搜void main、测试、test等关键字

漏洞描述:

调试代码未及时删除,可能会导致攻击者通过文件读取、文件下载等漏洞获取到部分代码文件,从而造成信息泄露

漏洞影响:

未删除的测试代码可能造成部分信息泄露

威胁级别:

低风险

测试过程:

在xxx.java,第xx-xx行

修复建议:

删除代码文件中的测试代码

4.敏感信息硬编码在程序中

注意username、password、key、pwd、secret等

漏洞描述:

将敏感信息(包括口令、加密密钥等)硬编码在程序中,可能导致敏感信息暴露给攻击者。密码不应保留在源代码中,源代码可以在企业环境中广泛共享,当然可以在开放源代码中共享。为了安全管理,密码和秘密密钥应存储在单独的配置文件或密钥库中

漏洞影响:

攻击者收集敏感信息便于进一步攻击利用

威胁级别:

低风险

测试过程:

第xx-xx行代码中

修复建议:

建议将敏感信息存放在配置文件或数据库中,并进行加密存储。

5.IP地址伪造

注意getIpAddr

代码片段特征:String ip = request.getHeader(“x-forwarded-for”)

漏洞描述:

X-Forwarded-For是用来识别通过HTTP代理或负载均衡方式连接到web服务器的客户端最原始IP地址的HTTP请求头字段。通常可直接通过修改HTTP头中的X-Forwarded-For字段来伪造请求的最终IP。

漏洞影响:

攻击者可通过该字段伪造请求的IP

威胁级别:

测试过程:

第xx-xx行代码中

修复建议:

建议优先使用request.getRemoteAddr()获取客户端IP。当中间不存在代理或者负载均衡时,可以直接获取客户端真实IP。

String ip = request.getHeader(“x-forwarded-for”) 改为 String ip = request.getRemoteAddr()

6.间接或直接使用存在漏洞的开源组件

注意pom.xml和.properties、.xml、iml等配置文件

漏洞描述:

低版本的xx组件存在xx漏洞。

漏洞影响:

低版本xx组件存在xx漏洞,有被利用的风险

威胁级别:

风险提示

测试过程:

第xx-xx行代码中

修复建议:

xx组件推荐使用版本:xxx,目前最新版本xxx

建议在不影响业务的前提下,将组件升级到最新版本或安全版本。

7.readline()函数导致dos问题(一般不提)

注意readline()

漏洞描述:

readline()函数可能会造成程序崩溃。

漏洞影响:

攻击者可能通过应用程序发送大量请求,从而造成拒绝服务,影响合法用户正常使用

威胁级别:

低风险

测试过程:

第xx-xx行代码中

修复建议:

建议在不影响业务的前提下限制读取行的大小或限制读取时间,例如:使用socket.setsotimeout(int)来限制超时时间。

8.存在csrf风险

查看有没有token或者检查http header的referer字段

漏洞描述:

csrf(跨站请求伪造)是一种网络攻击方式,可利用页面元素强迫受害者浏览器向web应用服务器发送一个改变用户信息的http请求。

漏洞影响:

攻击者可在用户不知情的情况下,以用户的身份伪造请求发给受攻击站点,从而在未授权情况下执行在权限保护下的操作。

威胁级别:

低风险

测试过程:

第xx-xx行代码中

修复建议:

1.建议检测HTTP header中的referer字段并正确设置。

2.在重要请求(查询、登录、修改密码等关键功能)中的每个请求和所有表单添加token

9.任意文件上传

上传功能的java文件,寻找上传的文件名参数,有无相应的校验代码

定位文件上传代码
1、可以通过搜索multipart/form-data,定位前端上传页面,找到对应的上传接口
2、通过关键字检索,定位到后端上传代码,常见关键字:
DiskFileItemFactory、@MultipartConfig、MultipartFile、File、upload、InputStreamwrite、fileNam、filePath

漏洞描述:

由于开发人员在设计文件上传功能点的代码时,没有考虑文件格式后缀的合法性校验或仅在前端进行后缀校验导致攻击者可上传脚本文件。

漏洞影响:

攻击者可上传恶意脚本至服务器,如果能够正确解析使脚本执行,将会影响服务器安全,可能会导致攻击者通过上传恶意脚本并执行从而完全控制服务器。

威胁级别:

高风险

测试过程:

第xx-xx行代码中

使用阿里云oss的情况:如果阿里云oss接口存在文件校验功能,且校验功能完整,则可忽略该漏洞

若有上传过滤,查看函数过滤规则

indexOf(“.”)是从前往后取第一个点后的内容,如果攻击者上传的文件名后缀为test.png.jsp可以绕过

通常我们取后缀名所用的函数lastIndexOf(),但是也存在,对于后缀名大小写也要有所区别,所以攻击者使用大小写也可以绕过。

相关函数

  1. File
  2. lastIndexOf
  3. indexOf #是从前往后取第一个点后的内容
  4. FileUpload #可返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索
  5. getRealPath #绝对路径
  6. getContentType
  7. equalsIgnoreCase # 方法用于将字符串与指定的对象比较,不考虑大小写。
  8. FileUntils
  9. MulitipartFile
  10. MulipartRequestEntify
  11. UploadHandleServlet
  12. FileLoadServlet
  13. FileOutputStream
  14. getInputSream
  15. DiskFileItemFactory
  16. getOriginalFilename() 从前端获取文件名 ``````````
  1. <a name="8733370e-8"></a>
  2. ## 修复建议:
  3. 1.建议检查上传文件扩展名白名单,不允许上传非白名单内的文件。
  4. 2.建议上传目录设置为不可执行权限
  5. <a name="d6d0f854"></a>
  6. # 10.XML解析漏洞
  7. 一般在xml util类,主要看xml解析器是否禁用了外部实体引用
  8. 以下为常见的一些xml解析器

javax.xml.parsers.DocumentBuilderFactory; javax.xml.parsers.SAXParser javax.xml.transform.TransformerFactory javax.xml.validation.Validator javax.xml.validation.SchemaFactory javax.xml.transform.sax.SAXTransformerFactory javax.xml.transform.sax.SAXSource org.xml.sax.XMLReader org.xml.sax.helpers.XMLReaderFactory org.dom4j.io.SAXReader org.jdom.input.SAXBuilder org.jdom2.input.SAXBuilder javax.xml.bind.Unmarshaller javax.xml.xpath.XpathExpression javax.xml.stream.XMLStreamReader org.apache.commons.digester3.Digester

  1. <a name="c73a8232-9"></a>
  2. ## 漏洞描述:
  3. 在解析XML之前,未对SoapXmlUtil.java中的getXMLStringValue()方法进行校验。
  4. <a name="482d928b-9"></a>
  5. ## 漏洞影响:
  6. SoapXmlUtil.java中配置的解析器未预防和限制外部实体进行解析,可能导致XML外部实体注入,威胁系统安全。
  7. <a name="44ba32c3-9"></a>
  8. ## 威胁级别:
  9. 高风险
  10. <a name="e65da4e3-9"></a>
  11. ## 测试过程:
  12. 存在于SoapXmlUtil.java第57行代码中
  13. ![](images/image-20220322135327135.png#alt=image-20220322135327135)
  14. <a name="8733370e-9"></a>
  15. ## 修复建议:
  16. 本质上XXE就是XML解析器配置不当导致的
  17. 1.建议对XML解析器进行安全配置,禁用外部实体
  18. 2.过滤用户提交的XML数据,防止出现非法内容(一般禁用外部实体即可)
  19. <a name="f0db56d3"></a>
  20. # 11.命令执行风险
  21. 关键词:Runtime StringBuilder ScriptEngineManager Yaml GroovyShell Process ProcessBuilder.start()
  22. 重点是找到执行系统命令的函数,看命令是否可控
  23. 命令执行关键函数:Runtime.exec Process GroovyShell.evaluate ProcessBuilder.start() engine.eval()
  24. 找到执行系统命令的特征函数后,回推参数的传递过程,看传入参数是否可控
  25. <a name="c73a8232-10"></a>
  26. ## 漏洞描述:
  27. 由于未对关键参数进行过滤,导致攻击者可能通过控制该参数的传入从而执行恶意代码或系统命令。
  28. <a name="482d928b-10"></a>
  29. ## 漏洞影响:
  30. 如果参数可控,攻击者可通过构造利用链,控制参数的传入,从而执行系统命令。
  31. <a name="44ba32c3-10"></a>
  32. ## 威胁级别:
  33. 高风险
  34. <a name="e65da4e3-10"></a>
  35. ## 测试过程:
  36. 第xx-xx行代码中
  37. <a name="8733370e-10"></a>
  38. ## 修复建议:
  39. 命令执行所处的场景不同,修复的方式要根据实际场景来。总的来说,需要注意以下几点:
  40. 1、禁止用户控制由程序执行的命令。如果用户的输入会影响程序原本的命令执行,那么应该设置一个安全白名单,使用户的输入变成从预定的安全命令集合中进行选择。若在用户的输入中检测出了非白名单中的命令,那么默认从安全命令集合中选择合适的命令给予替换,或者直接拒绝执行该命令。
  41. 2、如果需要将用户的输入用作程序命令中的参数,那么需要对用户输入做严格校验,过滤如&、 |、 ;等。
  42. 3、有时候攻击可以通过修改环境中的命令指令来达到攻击的效果,因此应该设置绝对路径来执行命令。
  43. 4、严格设置权限,有的时候我们所需执行命令仅需要很小的权限。
  44. <a name="a1514dcc"></a>
  45. # 12.存在ssrf风险
  46. 注意发起远程请求的地方,可能存在SSRF漏洞。
  47. 服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
  48. 在java中ssrf会分比较多的场景,不同的写法有不同的限制,java的SSRF利用比较有限
  49. 下面是一些http请求操作的函数

HttpClient.execute() HttpClients.execute() HttpClient.executeMethod() HttpURLConnection.connect() URLConnection.getInputStream() HttpURLConnection.getInputStream() URL.openStream() URL.openStervletRequest() BasicHttpEntityEnclosingRequest() DefaultBHttpClientConnection() BasicHttpRequest() ImageIO.read() HttpServletRequest() getParameter() URI URL Request.Get.execute() Request.Post.execute() OkHttpClient.newCall.execute()

  1. ...
  2. <a name="c73a8232-11"></a>
  3. ## 漏洞描述:
  4. 服务端提供了从其他服务器应用获取数据的功能且没有对目标地址和协议等做过滤与限制,导致攻击者利用存在缺陷的Web应用作为代理攻击远程和本地的服务器
  5. <a name="482d928b-11"></a>
  6. ## 漏洞影响:
  7. 攻击者可以通过构造恶意的url来访问原本访问不到的内网信息,探测端口信息等。
  8. <a name="44ba32c3-11"></a>
  9. ## 威胁级别:
  10. 高风险
  11. <a name="e65da4e3-11"></a>
  12. ## 测试过程:
  13. xx-xx行代码中
  14. <a name="8733370e-11"></a>
  15. ## 修复建议:
  16. 1. 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
  17. 2. 限制请求的端口为http常用的端口,比如,80,443,8080,8090等。
  18. 3. 禁用不需要的协议,仅仅允许httphttps请求。
  19. 4. 根据业务需求,判定所需的域名是否是常用的几个,若是,将这几个特定的域名加入到白名单,拒绝白名单域名之外的请求。
  20. 5. 根据请求来源,判定请求地址是否是固定请求来源,若是,将这几个特定的域名/IP加入到白名单,拒绝白名单域名/IP之外的请求。
  21. <a name="de7b72ff"></a>
  22. # 13.存在xss风险
  23. 全局搜索request.setAttributeresponse.getWriter(),查看相关的上下文环境,对传入参数是否做了过滤。传出到页面的参数是否做过滤或转义。最后在Controller中定位漏洞路径位置(有filter过滤类且过滤严格,可忽略该漏洞)
  24. jsp的话如果有直接将传入的数据返回到页面,也可能导致xss。例如:${参数}
  25. Java里面会将接收到的未经过滤的参数共享到request域中,在jsp的页面里面使用EL表达式进行输出。
  26. <a name="c73a8232-12"></a>
  27. ## 漏洞描述:
  28. 对于和后端有交互的地方没有做参数的接收和输入输出过滤,导致恶意攻击者可以插入一些恶意的 js 语句<br />
  29. 来获取应用的敏感信息
  30. <a name="482d928b-12"></a>
  31. ## 漏洞影响:
  32. 后台未对用户输入进行检查或过滤,直接把用户输入返回至前端,导致javascript代码在客户端任意执行。
  33. <a name="44ba32c3-12"></a>
  34. ## 威胁级别:
  35. 高风险
  36. <a name="e65da4e3-12"></a>
  37. ## 测试过程:
  38. xx-xx行代码中
  39. <a name="8733370e-12"></a>
  40. ## 修复建议:
  41. 总体修复方式:验证所有输入数据,进行合法性校验;对所有输出数据进行适当的编码,以防止任何已成功注入的脚本在浏览器端运行。具体如下
  42. 1)输入验证:某个数据被接受为可被显示或存储之前,使用标准输入验证机制,验证所有输入数据的长度、类型、语法以及业务规则。
  43. 2)输出编码:数据输出前,确保用户提交的数据已被正确进行entity编码,建议对所有字符进行编码而不仅局限于某个子集。
  44. 3)明确指定输出的编码方式:不要允许攻击者为你的用户选择编码方式(如ISO 8859-1 UTF 8)。
  45. 4)注意黑名单验证方式的局限性:仅仅查找或替换一些字符(如"<" ">"或类似"script"的关键字),很容易被XSS变种攻击绕过验证机制。
  46. 5)警惕规范化错误:验证输入之前,必须进行解码及规范化以符合应用程序当前的内部表示方法。请确定应用程序对同一输入不做两次解码。对客户端提交的数据进行过滤,一般建议过滤掉双引号(”)、尖括号(<、>)等特殊字符,或者对客户端提交的数据中包含的特殊字符进行实体转换,比如将双引号(”)转换成其实体形式",<对应的实体形式是<,<对应的实体形式是> 。
  47. 6)对参数中的特殊字符进行转义或者编码,如:“’、”、<、>、(、=、.”等特殊字符。
  48. 7)通过Http only对cookie进行限制,使攻击者无法通过xss获取到用户cookie
  49. <a name="3df46932"></a>
  50. # 14.存在sql注入风险
  51. 全局搜索$关键字,找dao层java文件,**查看与其相关的上下文,检查是否存在拼接sql**。sql语句直接拼接的参数是否在传入前和传入时进行了过滤。
  52. ```java
  53. 1.DAO: 存在拼接的SQL语句
  54. String sql="select * from user where id="+id
  55. 2.Hibernate框架(createQuery)
  56. 错误写法:Query<User> query = session.createQuery("from User where name='"+queryString+"'"); //HQL语句拼接
  57. 正确写法:使用setString填充占位符进行sql语句的拼接
  58. 名称绑定:List<User> res =(List<User>)session.createQuery("select u from User u where name like :name").setParameter("name", "%"+sqlString).list();
  59. 位置绑定:Query<User> query = session.createQuery("from User where Name=?");
  60. query.setParameter(0, "tkswifty");//HQL是从0开始的
  61. 3. Mybatis框架(没有用#,而是用了$ like语句 order by语句)
  62. 错误写法:Select * from news where title like ‘%${title}%’
  63. 正确写法:
  64. mysql:select * from news where title like concat('%',#{title},'%')
  65. oracle:select * from news where title like '%'||#{title}||'%'
  66. sqlserver:select * from news where title like '%'+#{title}+'%'
  67. 错误写法:Select * from news where id in (${id})
  68. 正确写法:
  69. id in
  70. <foreach collection="ids" item="item" open="("separatosr="," close=")">
  71. #{ids}
  72. </foreach>
  73. 错误写法:Select * from news where title =‘java’ order by ${time} asc

常见代审问题 - 图1{ew.sqlsegment},虽然是$符拼接,但是已进行预编译处理,不存在注入

由于xml文件很多特殊符号都会被转义,可以写进CDATA,CDATA中的内容都会被解析器忽略

即使使用了#,也可能在like、in和order by语句中存在注入。

like和in直接使用#会报错,一般开发可能会在这两个地方直接用$

order by是无法使用预编译的,但可以通过在java层面做映射修复

mybatis——>mapper

controller—->service—->dao方法(操作数据库)(mybaits mapper)

allDirector——->类 方法名

  1. ##先定位框架
  2. Hibernate框架
  3. 全局搜索createQuery()、createSQLQuerycriteriacreateNativeQuery()、Restrictions.sqlRestriction,查看是否存在直接拼接sql
  4. Mybatis框架
  5. 关注likeinorder by关键字,注意使用$参数的是否存在直接拼接sql
  6. Mybatisplus框架
  7. ${ew.customsqlsegment}相当于<where>${ew.sqlsegment}</where>,虽然是$符拼接,但是已进行预编译处理,不存在注入
  8. ###快速搜索(全局搜索以下关键字):
  9. Order by ${
  10. Like ‘%${
  11. From ${
  12. In ${
  13. In (${
  14. } as
  15. And ${
  16. Select ${

SQL注入的根本原因在于SQL语句的拼接构造

1.JDBC字符串拼接

JDBC有两种方式执行SQL语句,分别为PreparedStatement和Statement

Statement方法,我从执行时都需要编译

  1. ep: String sql = "select * from user where id = "rep.getParameter(s: id)
  2. out.println("Statement");
  3. PreparedStatement会对SQL语句进行预编译,后续无需要重新编译
  4. ep: String sql = "select * from user where id = "rep.getParameter(s: id)
  5. out.println("Statement");

理论上PreparedStatement的效率和安全性会比Statement要好

(预编译防控SQL注入String sql = “select * from user where id = ?” )

2.框架使用不当造成的SQL注入

如今的JAVA项目或多或少会使用JDBC进行更抽象封装的持久化框架,MyBatis和Hihernate。

Mybatis

/ # 的$ 的的区别

  1. #会对语句进行预编译
  2. ${}只是进行string 替换,动态解析SQL的时候会进行变量替换

使用#{Parameter}构造SQL:

  1. <select id = "getUsername" resultType="com.demo.bean.User">
  2. select id,name,age from user where name = #{name}
  3. </select>

使用${Parameter}构造的SQL:

  1. <select id = "getUsername" resultType="com.demo.bean.User">
  2. select id,name,age from user where name = ${name}
  3. </select>

Hibernate

HQL的几种正确用法

位置参数(Positional parameter)

  1. String parameter = "z1ng";
  2. Query<User>query = session.createQuery("from com.demo.bean.User where name= ?1",User.class);
  3. query.setParameter("name".parameter);

命名参数(named parameter)

  1. Query<User>query = session.createQuery("from com.demo.bean.User where name= ?1",User.class);String parameter = "z1ng";
  2. Query<User>query = session.createQuery("from com.bean.User where name=:name ",User.class);
  3. query.setParameter("name",parameter);

命名参数列表(named parameter list)

  1. List<String>names = Arrays:asLsit("z1ng","z2ng");
  2. Query<User>query = session.createQuery("from com.bean.User where name in (:name) ",User.class);
  3. query.setParameter("name",names);

类实例化(JavaBean)

  1. user1.setName("z1ng");
  2. Query<User>query = session.createQuery("from com.bean.User where name = :name ",User.class);
  3. query.setProperties(user1);

Native SQL注入

Hibernate支持原生的SQL语句执行,与JDBC的SQL注入相同

拼接构造:

  1. Query<User>query = session.createNativeQuery("select * from user where name = '"+parameter+"'")

参数绑定:

  1. Query<User>query = session.createNativeQuery("select * from user where name = :name");
  2. query.setParameter("name",parameter);

预编译一些场景下的局限

表名作为变量时,需要使用拼接

  1. select * from `name`
  2. select * from 'name' # 报错

order by 后使用拼接

  1. select * from user or by name
  2. select * from user or by 'name' # 语义不对

漏洞描述:

由于直接使用字符拼接sql语句或使用$字符将变量直接拼接到sql语句,容易导致sql注入漏洞的发生。

漏洞影响:

攻击者可通过sql注入获取数据库敏感信息,dba权限下有被获取服务器权限的风险。

威胁级别:

高风险

测试过程:

第xx-xx行代码中

修复建议:

1.建议采用PrepareStatement预处理机制,使用参数化查询,避免将未经过滤的输入直接拼接到SQL查询语句中

2.建议在web.xml中配置过滤器,验证用户的输入,确认所有请求在访问前,全部经过过滤器(由于框架问题做不了的应该在java层面做好参数检查,对用户输入的特殊字符进行严格过滤,如’、”、<、>、/、*、;、+、-、&、|、(、)、and、or、select、union。

3.设置Web应用中用于连接数据库的用户对Web目录不允许有写权限

4.建议严格区分Web应用中用于连接数据库的用户与数据库的系统管理员用户的权限(如不能执行drop等)

5.在编写mybatis的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止sql注入攻击

15.存在redis未授权访问

全局搜索.yml文件和redis关键字,并查看数据源配置中password这一项是否为空密码,host是否为公网地址

漏洞描述:

redis服务对外开放,且未设置密码

漏洞影响:

攻击者可未授权访问redis,严重危害系统安全

威胁级别:

高风险

测试过程:

第xx-xx行代码中

修复建议:

1.非必要,避免redis数据库对外开放

2.设置强口令

16.存在任意文件下载风险

定位文件下载业务,常见业务关键字:Download、Filename、Filepath、WritegetFile、getPath、getWriter

相关操作类:InputStream、File、OutputStream、BufferedInputStream、FileInputStream、FileUtil、IOUtil

  1. 路径相关参数是否可控
  2. 是否限定了可下载的文件目录范围
  3. 是否配置了全局过滤器或者额外进行了路径处理(例如过滤../)
  4. 上传文件后缀名,是否设置了白名单,是否仅通过ContentType判断文件类型

漏洞描述:

由于对下载的文件没有做限制,导致恶意用户可以利用这种方式下载服务器的敏感文件,对服务器进行进一步的威胁和攻击

漏洞影响:

攻击者通过任意文件下载,可以下载服务器的任意文件,web业务的代码,服务器和系统的具体配置信息,也可以下载数据库的配置信息等等

威胁级别:

高风险

测试过程:

第xx-xx行代码中

修复建议:

  1. 使用getCanonicalPath()、getAbsolutePath()等方法获取规范路径
  2. 通过文件头判断来限制文件类型,而不是通过文件后缀来判断
  3. 服务器安全配置策略文件。将所能读取的文件限定在特定的目录下
  4. 对文件下载进行过滤,过滤掉“./”、“../”、“%”等

17.URL跳转漏洞

漏洞描述:

url跳转漏洞场景比较集中,通常发生在用户登录、统一身份认证处。

漏洞影响:

被钓鱼

威胁级别:

低风险

测试过程:

常见参数名

  1. url
  2. site
  3. host
  4. redirect_to
  5. redirect_url
  6. returnUrl
  7. domain
  8. domains
  9. junp_to
  10. target
  11. link
  12. links
  13. linkto

常见函数

  1. sendRedirect
  2. hetHost
  3. redirect
  4. setHeader
  5. forward

修复建议:

1.若跳转的url可以事先去的,设置还白名单,并且采用全匹配的方式去检索关键字/域名

2.若事先无法确定跳转的url,并且不是由用户通过参数传入的,那么可以首先生成跳转链接,然后进行签名,只有通过验证签名才能进行跳转。

3.若挑战的URL事先无法确定,并且是由用户通过参数传入的,则必须在跳转时对传入的URL进行详细校验,包括但不限于:是否白名单内的URL,是否包含特殊字符,是否处理好不规则协议,不规则的地址请求等。

18.越权漏洞

水平、垂直越权不需关注特定函数,只要在处理用户操作请求时查看是否有对当前登陆用户权限做校验从而确定是否存在漏洞

漏洞描述:

可获得高权限或信息泄露

漏洞影响:

威胁级别:

高风险

测试过程:

全局搜索id,uuid,userid等,判断是否与当前获取session进行校验

@RequestMapping(value=”/getUserInfo”,method = RequestMethod.GET)
public String getUserInfo(Model model, HttpServletRequest request) throws IOException {
String userid = request.getParameter(“userid”);
if(!userid.isEmpty()){
//进行了userid是否为空的操作,然后通过Userid进行获取身份,并未验证是否是当前用户的userid,应该从session中获取相应的Userid进行比对
String info=userModel.getuserInfoByid(userid);
return info;
}
return “”;

权限控制流程

通过阅读web.xml

  1. <servlet-mapping>
  2. <servlet-name>springmvc</servlet-name>
  3. <url-pattern>/</url-pattern>
  4. </servlet-mapping>

后续继续跟进查看是否存在相关校验

修复建议:

1.添加session 校验

19.文件包含漏洞

漏洞描述:

文件包含,导致被包含文件被解析,被恶意利用

漏洞影响:

XXXXXX

威胁级别:

高风险

测试过程:

JSP文件包含。(动态包含)

  1. <jsp:include page="<%=file%>"></jsp:include>
  2. <c:impore url="<%=url%>"></c:import>

修复建议:

20.Spring Boot Actuator

漏洞描述:

Actuator是Spring Boot提供的服务监控和管理中间件,默认配置会出现接口未授权访问,部分接口会泄露网站流量信息和内存信息等,使用Jolokia库特性甚至可以远程执行任意代码,获取服务器权限。

漏洞影响:

XXXXXX

威胁级别:

高风险

测试过程:

Springboot Actuator
Management:
Endpoints:
Web:
Exposure:
Include: ‘*’
Security:
Enabled: false

  1. /dump - 显示线程转储(包括堆栈跟踪)
  2. /autoconfig - 显示自动配置报告
  3. /configprops - 显示配置属性
  4. /trace - 显示最后几条HTTP消息(可能包含会话标识符)
  5. /logfile - 输出日志文件的内容
  6. /shutdown - 关闭应用程序
  7. /info - 显示应用信息
  8. /metrics - 显示当前应用的’指标’信息
  9. /health - 显示应用程序的健康指标
  10. /beans - 显示Spring Beans的完整列表
  11. /mappings - 显示所有MVC控制器映射
  12. /env - 提供对配置环境的访问
  13. /restart - 重新启动应用程序

修复建议:

  • 禁用所有接口,将配置改成:endpoints.enabled = false
  • 或者引入spring-boot-starter-security依赖: