这个cms功能比较少,测试点也不算很多,主要还是想通过读一些jsp源码来认识整个java web的架构!
整个审计流程比较简单,,重在流程和思路!
cms简介: 团队CMS网站是一个以jsp+mysql进行开发的jsp企业建站系统。
cms下载地址:http://down.admin5.com/jsp/139114.html
从页面功能其实就可以整理出这套代码的审计流程,我还是很提倡由功能去溯源代码,因此这样做可能是最直接的办法,效率上也不会太差~
0x01 sql注入
谈到任意一套cms,我们随便打开一个页面,,除纯静态不谈外,几乎所有的cms都一定会涉及到sql语句
这个其实也不例外
那对于其他类语言,,这里就体现了java web的一个特性,,一个就是filter特性
这里我们找下url的重定向filter
1
2
3
4
5
6
7
8
|
<filter–mapping>
<filter–name>loadFilter</filter–name>
<url–pattern>/load/*</url–pattern>
</filter–mapping>
<filter–mapping>
<filter–name>loadFilter</filter–name>
<url–pattern>/form/*</url–pattern>
</filter–mapping>
|
这里就是匹配任意后缀,因此我们可以自行修改后缀
因此这里的利用的spring来使url后缀重定向,,跟php,asp都有点不一样
下面跟进这个id参数,,会不会有注入呢?
这里由于用到了spring mvc的框架,因此我们需要到class文件中去看看,而不是单纯的jsp页面,在运用了spring框架后,,jsp页面只能担负起前端的功能,对于后端的一些功能映射可能就需要xml文件或是class文件了
这里是整个网站的class文件,,下面我们需要找到new这个class文件
这里面整个网站的sql语句全部放在xml文件里,这个找的话一找就能找到,不是很复杂(我这里翻看了所有跟new相关的文件,,基本看语句就能猜到各个文件的功能)
首先是这里sql语句,其实拼接下来就是
1
|
select * from cc_users where user_id=#{user_id}
|
那么#{user_id}如果读了java web相关的应用,就可以知道这里#{parm}传入的数据都当成一个字符串,会对自动传入的数据加一个单引号
也就是说相当于
1
|
select * from cc_users where user_id=‘user_id’
|
仿佛有注入的可能?
那么这里报错400,根本原因就是前段和后端的参数类型不一致,,说到及就是这里的id参数只支持int类型,不支持string类型
在model里可以看到参数模型的设置,这里id为int类型,因此这里不存在注入!
这里多说几句,java web的代码审计大多会用mvc的框架,因此对于一些函数功能点的寻找还是非常非常方便的,像struct2这种框架,,甚至还会列出一个xml文件来记录功能点的映射关系,这对于我们代码审计人员来说又是一大遍历,再也不用像php那样函数一层层的跟进!
0x02 后台登录相关
这里前台没什么功能,就一个简单的新闻展示,也没有用户等功能,因此只能移步到后台的登录,来看看登录函数怎么写的,以及后续的session怎么设置的
连找回密码功能都没有。。功能真的少之又少!
这里其实找函数我倾向先找controller函数,然后再从controller函数里一步步的去递归看怎么定义这个函数
可以看到这里对POST过来的username和password传进了mapping里,这里其实就是存放的整个cms的sql语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<select id=“find” resultType=“CcUsers” parameterType=“CcUsers”>
select * from cc_users
<where>
1=1
<if test=“user_id !=null”>
and user_id=#{user_id}
</if>
<if test=“username !=null”>
and username LIKE #{username}
</if>
<if test=“password !=null”>
and password =#{password}
</if>
</where>
|
如果这里#{}不表示预编译,,那么这里又不存在过滤,并且类型一定为string,存在注入?
这里可以看到username后面传进来的值会进行一次单引号转义,而post函数是spring自带的函数org.springframework.web.bind.annotation.RequestMethod,还有一种可能就是web.xml里配置了全局过滤!
但是这里都没有找到,,重新回到参数最开始的地方,想到java web还有一个很重要的特性就是一些第三方组件的利用,这里sql语句采用的是mybatis,配合上这个#{}这样的定义,就可以做到防止注入漏洞的产生,因此前面表述其实是错误的,这里作下更正!
那么这里后台登录其实也是不存在漏洞的~
1
2
|
HttpSession session = request.getSession();
session.setAttribute(“admin”, ccUser);
|
另外当登录进去,赋给用户一个admin权限的session,不是利用一个明文来作为凭证,因此这里session的问题也是不存在的!
0x03 后台任意文件上传
如果一个漏洞没找到写篇文章,,会不会太牵强,,所幸这里的后台文件上传出现了问题!
这里还好用的自己定义的文件上传函数,如果采用下面的ueditor,,可能就不存在漏洞了。
那么问题来了,,怎么找这个上传函数?
我这里用的土办法,,就是抓包来看看参数定义,因为java web的特性,,函数是一些class文件包装好的,因此不像php一样,直接定位到函数,然后慢慢的审计,这里知道了函数名可能还是要找一找
/load/addwork,那么下面八九不离十,,load是一个类名,然后addwork是下面的函数名
这里本以为就是controller里的loadindex,但是无果,最后在work里找到了,,这里面其实都是mvc框架的映射关系,,这里面还没有认真研究,上次看了一个struct2的映射,,直接一个xml文件,,找起来非常方便!
下面附上文件上传的关键代码
1
2
3
|
System.out.println(“图片名称” + wrok_image.getOriginalFilename());
String imagename = new java.util.Date().getTime() + wrok_image.getOriginalFilename().substring(wrok_image.getOriginalFilename().lastIndexOf(“.”));
System.out.println(imagename);
|
这里可以看到是怎么生成文件的,首先是自带的gettime函数,这里一般就是日常见到的以随机的时间函数,然后加上lastindexof,这里面没有看到对后缀的一个黑名单,或是白名单,直接去出后缀,然后进行拼接,这里就出现了一个典型的文件上传漏洞!
这里直接修改后缀得了。。(修改为adog)
可以看到已经上传成功。
上述如有不当之处,敬请指出~
前言 本文从笔者自己对同源策略的理解来谈谈与之相关的JSONP劫持和CORS错误配置这两类安全问题。 同源策略(SOP) 同源策略限制从一个源加载的文档或脚本与来自另一个源的资源进行交互,这是一个用于隔离潜在恶意文件的关键的安全机制.简单说就是浏览器的一种安全…
请登录后发表评论
注册