写在前面
最近要做代码审计,事先预习了一下,整理了代码审计需要的基础知识和一些可简单审计的漏洞。
JAVA常用架构
maven
根目录下有pom.xml
MVC
大部分web项目都基于MVC开发,model(模型)+view(视图)+controller(控制器)
dao层,service层,controller层(web),view层
- controller 负责具体业务的模块流程的控制,会调用到下面 Service 层的接口来控制业务流程
- service 主要负责业务模块的应用逻辑应用设计,先设计接口,在设计实现类。这一层,是纯业务逻辑。在使用 Service 层时,会继续调用下面的 DAO 层的接口。
- dao 负责数据持久化,通俗点说就是用来和数据库交互,读写数据的模块。
SSM框架
Spring+SpringMVC+Mbatis
Mybatis
持久层框架,支持定制化sql,sql都写在xml里统一管理
(XML映射文件:Mapper.xml文件)
漏洞类型
XXE
XML解析一般在导入配置、数据传输接口等场景可能会用到,涉及到XML文件处理的场景可留意下XML解析器是否禁用外部实体,从而判断是否存在XXE。部分XML解析接口如下:
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
禁用外部实体的方法
SAXReader
sax.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
sax.setFeature("http://xml.org/sax/features/external-general-entities", false);
sax.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
TransformerFactory
TransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
XMLInputFactory
// This disables DTDs entirely for that factory
xmlInputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
// disable external entities
xmlInputFactory.setProperty("javax.xml.stream.isSupportingExternalEntities", false);
SQL注入
ibatis/Mybatis
定位看Mybatis的配置文件
有两种传参方式$...$
和进行预编译的#...#
(ibatis)或${}``#{}
(Mybatis)
大部分情况下会用#
传参
易产生sql注入的情况,这些参数使用#
会报错,只能用白名单过滤或者几种排序写成if,开发经常忽略。
1.like
Select * from news where title like ‘%${title}%’,
->select * from news where tile like concat(‘%’,#{title}, ‘%’),
2.in
Select * from news where id in (${id}),
->循环指令 select * from news where id in
<foreach collection="ids" item="item" open="("separator="," close=")">#{item} </foreach>
3.order by
Select * from news where title =‘京东’ order by ${time} asc,
->java层做映射,白名单
XSS
web.xml 找过滤器
越权
漏洞代码
@RequestMapping(value="/getUserInfo",method = RequestMethod.GET)
public String getUserInfo(Model model, HttpServletRequest request) throws IOException {
String userid = request.getParameter("userid");
if(!userid.isEmpty()){
String info=userModel.getuserInfoByid(userid);
return info;
}
return "";
}
controller层找请求,看请求资源和操作处是否绑定userid
CSRF
一般会在框架中修复,先熟悉框架中CSRF的防护方案
哪些框架?怎么防护?
查看增删改请求有没有带token
框架,第三方组件
XML文件查找、搜索CVE
URL重定向
【需要根据请求查看】
入参未做限制代码:
String site = request.getParameter("url");
if(!site.isEmpty()){
response.sendRedirect(site);
}
审计函数
sendRedirect
setHeader
forward
...
任意文件操作,SSRF,命令执行
从请求找,结合黑盒测试