查看: 14876|回复: 9

对某bbs论坛的简单审计2(跨站和越权漏洞)

[复制链接]
  • TA的每日心情
    开心
    2019-10-8 10:12
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2014-8-8 16:57:45 | 显示全部楼层 |阅读模式
    001x 跨站漏洞

    首先我们说说一下跨站漏洞吧
    [Java] 纯文本查看 复制代码
    	
    //这两个类addBbs和answerBbs主要的作用是发帖和回帖的,当把数据插入数据库时进行了过滤,是Change下的HTMLChange函数
    public ActionForward addBbs(ActionMapping mapping, ActionForm form, httpervletRequest request, httpervletResponse response){
    		httpession session=request.getSession();		
    		session.setAttribute("mainPage","/pages/add/bbsAdd.jsp");
    		
    		String validate=request.getParameter("validate");
    		if(validate==null||validate.equals("")||!validate.equals("yes")){
    			return mapping.findForward("showAddJSP");
    		}
    		else{			
    			BbsForm bbsForm=(BbsForm)form;
    			
    			String	boardId=(String)session.getAttribute("boardId");
    			String 	bbsTitle=Change.HTMLChange(bbsForm.getBbsTitle()); //利用函数过滤
    			String 	bbsContent=Change.HTMLChange(bbsForm.getBbsContent()); //利用函数过滤
    			String 	bbsSender=((UserForm)session.getAttribute("logoner")).getUserName();
    			String 	bbsSendTime=Change.dateTimeChange(new Date());
    			String 	bbsFace=bbsForm.getBbsFace();
    			String 	bbsOpTime=bbsSendTime;
    			String 	bbsIsTop="0";
    			String 	bbsToTopTime="";
    			String 	bbsIsGood="0";
    			String 	bbsToGoodTime="";
    			
    			String sql="insert into tb_bbs values(?,?,?,?,?,?,?,?,?,?,?)";
    			Object[] params={boardId,bbsTitle,bbsContent,bbsSender,bbsSendTime,bbsFace,bbsOpTime,bbsIsTop,bbsToTopTime,bbsIsGood,bbsToGoodTime};
    			
    			ActionMessages messages=new ActionMessages();			
    			OpDB myOp=new OpDB();
    			int i=myOp.OpUpdate(sql,params);
    			if(i<=0){
    				System.out.println("发表帖子失败!");
    				messages.add("userOpR",new ActionMessage("luntan.bbs.add.E"));
    				saveErrors(request,messages);
    				return mapping.findForward("error");				
    			}
    			else{
    				System.out.println("发表帖子成功!");
    				session.setAttribute("currentP","1");
    				messages.add("userOpR",new ActionMessage("luntan.bbs.add.S"));
    				bbsForm.clear();
    				saveErrors(request,messages);
    				return mapping.findForward("success");
    			}			
    		}	
    	}
    	
    	/** 回复帖子 */
    	public ActionForward answerBbs(ActionMapping mapping, ActionForm form, httpervletRequest request, httpervletResponse response){
    		httpession session=request.getSession();		
    		BbsAnswerForm bbsAnswerForm=(BbsAnswerForm)form;
    		
    		String  rootId=(String)session.getAttribute("bbsId");		
    		String 	bbsTitle=Change.HTMLChange(bbsAnswerForm.getBbsAnswerTitle());
    		String 	bbsContent=Change.HTMLChange(bbsAnswerForm.getBbsAnswerContent());
    		String 	bbsSender=((UserForm)session.getAttribute("logoner")).getUserName();
    		String 	bbsSendTime=Change.dateTimeChange(new Date());
    		String 	bbsFace=bbsAnswerForm.getBbsFace();		
    		
    		String sql="insert into tb_bbsAnswer values(?,?,?,?,?,?)";
    		Object[] params=new Object[6];
    		
    		params[0]=rootId;
    		params[1]=bbsTitle;
    		params[2]=bbsContent;
    		params[3]=bbsSender;
    		params[4]=bbsSendTime;
    		params[5]=bbsFace;
    		
    		ActionMessages messages=new ActionMessages();
    		String forwardPath="";
    		
    		OpDB myOp=new OpDB();
    		int i=myOp.OpUpdate(sql, params);
    		if(i<=0){
    			System.out.println("回复帖子失败!");
    			forwardPath="error";
    			messages.add("userOpR",new ActionMessage("luntan.bbs.answerR.E"));
    		}
    		else{
    			System.out.println("回复帖子成功!");
    			forwardPath="success";
    			messages.add("userOpR",new ActionMessage("luntan.bbs.answerR.S"));			
    			bbsAnswerForm.clear();			
    		}		
    		saveErrors(request,messages);
    		return mapping.findForward(forwardPath);
    	}
    

    下面我们看看Chang类的HTMLChange是怎样过滤的
    [Java] 纯文本查看 复制代码
    //过滤了& < >和空格和换行,看到下面几句,又把[和]换成了<和>,我们有了尖括号就可以绕过了
    public class Change {
    	public static String HTMLChange(String source){
    		String changeStr="";
    		changeStr=source.replace("&","&amp;");
    		changeStr=changeStr.replace(" ","&nbsp;");
    		changeStr=changeStr.replace("<","&lt;");
    		changeStr=changeStr.replace(">","&gt;");		
    		changeStr=changeStr.replace("\r\n","<br>");
    		
    		changeStr=changeStr.replace("[F","<font ");
    		changeStr=changeStr.replace("[","<");
    		changeStr=changeStr.replace("]",">"); 
    		return changeStr;
    	}
    


    [HTML] 纯文本查看 复制代码
    由于作者有一个很重要的反斜杠没有过滤导致可以绕过
    <svg/onload=alert(document.cookie)>改为[svg/onload=alert(document.cookie)]就可以触发代码了,下面的两个就不演示了,都是一样的
    <script>alert(888);</script>
    <img/src/onerror=alert(19)>
      

    测试过程
    xss3PNG.PNG
    xss1.PNG
    成功触发,代码插入
    xss2.PNG

    002x 越权漏洞
    [Java] 纯文本查看 复制代码
    //有if的条件可知,当为管理员或帖子的发布者才可以提前帖子。由于发布者bbsSender可以有客户端伪造,当发布者和登陆名相同,从而提前任意帖子
    	if(lognerAble.equals("2")||lognerName.equals(master)||lognerName.equals(bbsSender)){ 
                      //当登陆名和发送者相当时可以提前帖子,bbsSender可以伪造
    			if(bbsId!=null&&!bbsId.equals("")){
    				Object[] params={time,bbsId};
    				String sql="update tb_bbs set bbs_opTime=? where bbs_id=?";
    				OpDB myOp=new OpDB();
    				int i=myOp.OpUpdate(sql,params);
    				if(i<=0){
    					System.out.println("提前帖子失败");
    					forwardPath="error";
    					messages.add("userOpR",new ActionMessage("luntan.bbs.first.E"));					
    				}
    				else{
    					System.out.println("提前帖子成功!");
    					forwardPath="success";
    					messages.add("userOpR",new ActionMessage("luntan.bbs.first.S"));					
    				}				
    			}
    			else{
    				forwardPath="error";
    			}
    		}
    		else{
    			System.out.println("您没有权限提前该帖子!");
    			forwardPath="error";
    			messages.add("userOpR",new ActionMessage("luntan.bbs.first.N"));
    		}
    		saveErrors(request,messages);
    		return mapping.findForward(forwardPath);
    	}
    

    下面这个是任意帖子删除的漏洞,和上面的同源,不在过多的讲解
    [Java] 纯文本查看 复制代码
    	
    public ActionForward deleteRootBbs(ActionMapping mapping, ActionForm form, httpervletRequest request, httpervletResponse response) throws UnsupportedEncodingException{		
    		httpession session=request.getSession();		
    		UserForm logoner=(UserForm)session.getAttribute("logoner");
    		
    		String bbsId=request.getParameter("bbsId");						//获取要删除帖子的ID	
    		String bbsSender=request.getParameter("bbsSender");				//获取要删除帖子的发布者
    		bbsSender=new String(bbsSender.getBytes("ISO-8859-1"));
    		String lognerAble=logoner.getUserAble();						//获取当前登录用户的权限
    		String lognerName=logoner.getUserName();						//获取当前登录用户的用户名
    		String master=(String)session.getAttribute("boardMaster");		//获取当前斑竹
    		
    		if(bbsId==null)
    			bbsId="-1";
    		if(bbsSender==null)
    			bbsSender="";		
    		
    		ActionMessages messages=new ActionMessages();
    		
        	//如果当前登录的用户是帖子的发表者、帖子所属版面的斑竹、管理员
    		if(lognerAble.equals("2")||lognerName.equals(master)||lognerName.equals(bbsSender)){ //更改bbsSender的值和登陆者相同可以删除任意帖子
    			if(bbsId!=null&&!bbsId.equals("")){						
    				String sql="delete tb_bbs where bbs_id=?";				
    				Object[] params={bbsId};
    				
    				OpDB myOp=new OpDB();
    				int i=myOp.OpUpdate(sql,params);
    				if(i<=0){
    					System.out.println("删除出错!");
    					messages.add("userOpR",new ActionMessage("luntan.bbs.deleteRoot.E"));
    					saveErrors(request,messages);					
    				}
    				else{							//删除成功后,要返回列表显示根帖的页面,该页面有:查看某版面下所有根帖的页面、查看我的帖子的页面、查看精华帖子的页面
    					System.out.println("删除成功!");
    					messages.add("userOpR",new ActionMessage("luntan.bbs.deleteRoot.S"));
    					saveErrors(request,messages);
    					ActionForward forward=new ActionForward("/"+session.getAttribute("servletPath")+"?method="+session.getAttribute("method"));		//因为返回的页面存在以上三种情况,所以返回的视图要在程序中动态指定
    					return forward;
    				}				
    			}
    			return mapping.findForward("error");
    		}
    		else{
    			System.out.println("您没有权限删除该帖子!");			
    			messages.add("userOpR",new ActionMessage("luntan.bbs.deleteRoot.N"));
    			saveErrors(request,messages);
    			return mapping.findForward("error");
    		}		
    	}
    


    下面是利用过程
    修改bbsSender的值
    yuequan.PNG
    帖子提前成功
    yuequan2.PNG

    评分

    参与人数 2i币 +20 贡献 +2 收起 理由
    Diana + 10 感谢分享
    管理01 + 10 + 2 支持原创

    查看全部评分

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-10-8 10:12
  • 签到天数: 15 天

    [LV.4]偶尔看看III

     楼主| 发表于 2014-8-8 17:06:36 | 显示全部楼层
    又要几天没网上了,明天就回家,再来一贴
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2014-8-8 17:52:48 | 显示全部楼层
    好贴~。学习了。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2016-5-2 22:33
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-8-8 17:57:38 | 显示全部楼层
    本地搭建的么?

    点评

    嗯 ,是的  详情 回复 发表于 2014-8-8 18:02
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-10-8 10:12
  • 签到天数: 15 天

    [LV.4]偶尔看看III

     楼主| 发表于 2014-8-8 18:02:00 | 显示全部楼层
    lyrric 发表于 2014-8-8 17:57
    本地搭建的么?

    嗯 ,是的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2016-8-26 14:36
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2014-8-8 21:17:58 | 显示全部楼层
    XSS大牛给跪了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2021-9-9 23:35
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2014-8-9 15:19:51 | 显示全部楼层
    给审计牛跪了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2014-8-11 21:02:11 | 显示全部楼层
    谢谢分享
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-8-21 09:22
  • 签到天数: 181 天

    [LV.7]常住居民III

    发表于 2014-8-12 15:43:59 | 显示全部楼层
    会审计的就是好啊
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2014-8-15 11:06:58 | 显示全部楼层
    跪拜代码审计大牛
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    指导单位

    江苏省公安厅

    江苏省通信管理局

    浙江省台州刑侦支队

    DEFCON GROUP 86025

    旗下站点

    邮箱系统

    应急响应中心

    红盟安全

    联系我们

    官方QQ群:112851260

    官方邮箱:security#ihonker.org(#改成@)

    官方核心成员

    Archiver|手机版|小黑屋| ( 苏ICP备2021031567号 )

    GMT+8, 2025-1-23 13:46 , Processed in 0.049762 second(s), 20 queries , Gzip On, MemCache On.

    Powered by ihonker.com

    Copyright © 2015-现在.

  • 返回顶部