JAVA web网站代码审计--入门
本人还处于代码审计的初级阶段,此文章类似于编码规范,有啥建议,评论给我~
由于刚开始学代码审计的时候,就感觉一团代码,不知道从何下嘴。先从底层开始审计:
底层漏洞:
1. 查看该系统所用框架:
Struts2的相关安全:
    (1)  低版本的struts2,低版本的Struts2存在很多已知的版本漏洞。一经使用,很容易造成比较大的危害。
    (2)  开启 Struts2的动态调用方法,现在发现的如s2-033 ,s2—032等漏洞,都是由于系统开启了动态调用方法,导致远程代码执行.
    (3)  在jsp页面中使用Struts2的ognl表达式传输数据。
    (4)  开启Struts2的devMode,易造成远程代码执行
    (5)  存在Struts2本身自带的ognl页面
    (6)  使用Struts2自带的redirect等方法
Spring的相关安全:
    Spring在jsp中使用el表达式时,注意spring的boot框架版本,因为有些低版本会存在远程命令执行.
mybatis xml相关安全:
    在SQL语句中,使用$进行传参,导致SQL注入;
其他安全:
    在使用java自带的环境时,如weblogic或者jboss,请注意查看版本号,因为此类环境低版本,大部分包含java反序列化漏洞,导致远程代码执行;
    glassfish环境某些版本存在任意文件读取;
 
2. 查SQL注入:
DAO:是否存在拼接的SQL语句
如:String sql = ”select * from user where id="+id;
XML中:是否使用$,因为在xml中,#value#此时value是以参数的形式插入进去,$value$此时value是以字符串的形式直接插入到xml中,会导致sql注入;
〈select id=”abdc" resultMap=”result”〉select * from tb_card_bin where card_length = #cardLength# and instr(bin_no, ’$cardNoFirstNum$’) = 1〈/select>
3。第三方控件漏洞
如:fckeditor,wordpress等等.
查完底层漏洞后,查看系统中相应的action或者do方法。如果用的是ssh框架的话,这些方法的相关配置保存在Struts2的配置文件中。如果用的是springmvc框架的话,这些方法可能保存在l(spring的配置文件),或者采用的是扫描注入的话,建议全局搜索RequestMapping等注入路径的关键字来确定action方法所在。以下,以action方法为例:
4. 文件上传漏洞
文件上传的action有一个比较显著的特征:Spring MVC默认支持两种文件上传操作方式。一种是使用MultipartHttpServletRequest或者MultipartFile作为方法参数,第二种是使用javax.servlet。http。Part作为方法参数。
代码举例:
@RequestMapping(value = "/accounting/voucher/importVoucher.htm”, method = RequestMethod.POST)
@SuppressWarnings(”unchecked”)
public String importBankGlide(@RequestParam("voucherFile”)MultipartFile voucherFile, @
RequestParam("returnFile”) MultipartFile returnFile,ServletRequest request, ModelMap model) {
 if (voucherFile == null || Size() < 1) {
  String errorMessage = ”导入文件为空";
  model.put(ERROR_MESSAGE, errorMessage);
  return ”/accounting/voucher/importVoucher";
 }

 String extFile = "”;

 if (Size() > 0) {//并未对文件进行检查,直接上传
  File file = new File(model。get("path”));
 } else {
  model。put(ERROR_MESSAGE, "上传附件失败,请重新发起:” + ResultMessage());
  return "/accounting/voucher/importVoucher";
 }
 }
文件上传存在的主要原因,一,未对文件名称进行检测直接上传;二,未对传入的文件内容进行检测直接上传;
5。  远程命令执行
在调用本机的shell,去运行特殊的命令时,没有对传入的参数进行检查,导致命令执行;
Runtime().exec此方法用来执行shell
com.opensymphony.xwork2。ognl。OgnlValueStack的protected Object findValue(String expr, String field, String errorMsg)该方法是用来执行ognl表达式。
6.  远程代码执行
第一,通过使用脚本引擎中的eval去执行些特殊的东西,这种地方要着重去看,是否会有用户输入的变量传入。
第二,通过反射来执行代码:Class c=Class。forName("com。wqx。test4.Test”);
//创建这个类的实例,前提是存在这个类,并且存在此种方法
Object wInstance();
//通过class来取得这个方法对象 并且声明 这个类的参数类型
flect。Method method=c。getMethod("sayhello”, Class。forName("java。lang.String"));
//invoke 来执行方法对象 记得参数类型要跟这里的参数匹配
method。invoke(obj, ”wqx”);
7. 越权下载
首先,fileName是用户可以控制的,如下:
String fileName =  "。./。。/.。/。./1.xml";//此处为用户输入内容
springframework远程代码执行漏洞File file = new File("/Users/dly/Desktop/test2/src/main/webapp/upload/” + fileName);
FileInputStream fileInputStream = new FileInputStream(file);
BufferedReader buff= new BufferedReader(new InputStreamReader(fileInputStream));
System.out.println(buff。readLine());

此时,1。xml存在,会导致越权下载。
8. 敏感信息泄漏
第一,代码泄漏,.svn的文件夹和git的文件夹中可能包含代码;
第二,mac中编程会自动生成.DS_Store文件,其中可能包含敏感信息;
第三,代码备份.
9。逻辑漏洞
需要自己去结合传入数据的流程和基本业务去判断。
 
最后说一句,有些神奇的人,会为了方便自己管理服务器,自己给自己写个webshell。别笑~这是非常可能的.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。