Java代码审计,高手就是这样“硬看”的

   

前言


本文作者是360特邀讲师,每月开讲一堂代码审计课,曾在2017年中国互联网安全大会上作为白帽大咖的嘉宾身份参加并在沙龙上担当讲师。在补天众测平台上,他有一个响当当的ID:jkgh006。接下来我们来看看高手是如何通过“硬看”来进行代码安全审计的。

                                                                                           

      大多数人问我是怎么看代码并且在没有本地环境的情况下审计出来漏洞的,我一般都是两个字 “硬看”,今天我们要说的就是怎么在几百M甚至上G的程序中剥茧抽丝,审计出来我们希望的结果。

       首先查看web.xml,看看全局的配置以及路由,这个非常重要;


     这里是一个全局的filter,按照开发者的习惯来说,一般都是做一些登录验证或者授权之类的东西。继续跟进


这里可以看出来系统只接收GET和POST的请求,重点看webServiceCheck请求的内容

看到这个我们就明白了,采用的是黑白名单的形式决定是否校验登录


这几类都不会进行登录校验


通过全局的分析,有以下可以利用的两个path,分别为/login/ 和 /ycsbBjWss/


继续再分析web.xml


可以看到这个是一个webservice的请求,我们访问一下某网站看看


还是有很多接口可以利用的,看看最后一个接口


这里调用的就是auth,直接跟进分析看看



我们分析一下这个xmltobean


在解析xmlSource的时候

这里没有进行实体禁用,存在一个xxe,当然了这个不是我们这次关心的内容


重点看看这个xmlTobean,很多人看到这个的时候就放弃了,因为太复杂,跳来跳去,但是要继续往下走还必须得了解这个的逻辑,通常这里的做法是不用去读懂它干什么,可以自己写一个test,然后去跑这一段代码,前提是要删除掉web上下文的东西。


此时你就可以调试代码了,这里就不操作了,直接解释一下这段代码的逻辑,意思就是把你传递进来的xml中的内容通过xpath解析出来,然后通过BeanUtils.populate(model,var18),把var18里面对应的键值对赋给model对象的属性。

这个xml的结构可以看出来


里面分为两大部分,大家都知道java里面的变量定义是区分大小写的,所以它这里在Head里面定义的会被转化为小写,然后拼接一个H就是类的属性,例如


到时候就会在model对象里面,如果它存在abcH属性,这个值就会被赋为123,我们看看model的基类属性都有那些


其中框起来的这些比较特殊,属性本身存在大小写,根据它代码的意思,比如nsrdjNoH我们只需要写123


       头部的语法已经完全解开,剩下的就是body里面的语法,body是不做任何转换的,基本上你写什么到时候就是什么,继续跟进程序逻辑

       checkMethod 校验头部里面是否包含method, 对应到xml里面就是123

       继续往下走看看service.check(model),这里就是进行了每一个参数的校验


我们调用的是YcsbWebService,所以选择下面那个

这里面就是对xml头部的校验,缺少一项都不可以。

函数有以下几个

  1. checkCpcode()         不为空即可

  2. checkMethod()         不为空即可

  3. checkTranToken()      

  4. checkConf()            内置校验不用关心

  5. loginForm()        

  6. checkCpcodeWhitelist()  内置校验不用关心

  7. checkLegalCpcode()     内置校验不用关心


重点分析第三个和第五个

分析可以看出这个是可以绕过的,因为没有秘钥,但是这个类似于请求的token有一个超时的限制,从代码中可以看出来,肯定会有加密部分


直接都不用分析,写入test即可根据CpcodeP加密出来一个token



这里是一个登陆的验证,通过上下文分析,这里采用map映射方式查询数据库,只要这个通过即可以


这里可以看出来,没有密码的限制,其实对于这个应用来说,cpcode就是税号,天眼查是可以查到的,等于再次绕过


InnerStrategyService service = StrategyFactory.getInstance().creator(model.getMethodpre(), StrategyFtConst.YCSB.fact);


这一段代码要依赖web上下文,所以只能硬看,跟进分析一下


这里可以看出来所有的对应关系,继续往下分析

ex1 = service.execute(model);


跟我们分析的映射关系一模一样


此时所有的校验都通过,流程从一个小水管慢慢变成一片开阔地,各种各样的接口从而暴露出来,我们主要分析一下这个YcsbWbxxServiceImpl



当method为WBXX_FP_CZ_LIST的时候


看到这里进行了一次复杂的解析,通过读上下文,没有web上下依赖,直接代码调试并且我们打印出来customViewSQLStr


这里就输出来一个sql语句,其中可以进行拼接,对应的xml为


我们访问一下看看


返回的东西居然是加密的,这个不用怕,相信解密的东西也能找到

回头再看看

最终输出的时候进行了加密,zKey就是秘钥,所有代码都是写死的,所以加解密其实没有什么意义,看看有没有解密的代码


直接test调试一下


这个就是我们刚才说的那个token失效了,重新做一个,去天眼查找一个税号,例如

91**********087




然后再次请求



这时候响应的内容已经发生了变化,我们解开看看

说明整个验证过程已经通过了,分析到这里,至于怎么构造SQL造成注入就不再做分析。

本文来源:杭州敏信科技有限公司

公众号内回复“1”带你进粉丝群

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java代码审计中常见的问题包括: 1. SQL注入:当程序没有对输入数据进行验证或过滤时,攻击者可以通过输入恶意SQL语句来执行非法的数据库操作,例如删除、修改、查询等。在Java代码审计中,需要检查程序是否正确的进行输入验证和SQL语句过滤。 2. XSS攻击:当程序没有对输出数据进行转义或过滤时,攻击者可以通过在网页中注入恶意脚本来获取用户的敏感信息或执行非法操作。在Java代码审计中,需要检查程序是否正确的进行输出数据过滤和转义。 3. CSRF攻击:当程序没有正确的进行CSRF攻击防护时,攻击者可以通过伪造用户的请求来执行非法操作,例如修改用户密码、发送恶意邮件等。在Java代码审计中,需要检查程序是否正确的进行CSRF攻击防护。 4. 权限控制:当程序没有正确的进行权限控制时,攻击者可以通过越权访问来获取敏感信息或执行非法操作。在Java代码审计中,需要检查程序是否正确的进行权限控制。 5. 密码管理:当程序没有正确的处理密码时,攻击者可以通过猜测、撞库等方式来获取用户的密码。在Java代码审计中,需要检查程序是否正确的处理密码,包括密码的存储、传输、重置等。 6. 不安全的函数调用:当程序使用不安全的函数时,攻击者可以利用这些函数来执行非法操作,例如执行任意命令、读取敏感文件等。在Java代码审计中,需要检查程序是否使用了不安全的函数调用。 7. 日志记录:当程序没有正确的记录日志时,攻击者可以利用这些漏洞来进行攻击或隐藏攻击痕迹。在Java代码审计中,需要检查程序是否正确的记录了日志。 8. 安全设置:当程序没有正确的进行安全设置时,攻击者可以利用这些漏洞来进行攻击或绕过安全控制。在Java代码审计中,需要检查程序的安全设置,确保程序的安全策略符合最佳实践。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值