一次代码审计练习

这次练习主要针对的是rce方向的两个漏洞,复现的是两个cms上的漏洞。一个是zzzphp,另一个是baijiacms

直接先在本地搭建。

针对zzzphp,我们要复现的是代码执行漏洞。这里有个小tips。针对仅使用mvc架构并且没有对基本方法二次封装的源码,我们可以针对功能点和查找特定函数去测试。但是如果是特殊框架开发的源码,我们就要针对不同框架的特性去进行审计。

这里我们要审计的是代码执行漏洞,我们直接查找相关函数eval

这里可以看到只有最后一个是真正可以执行代码的

我们具体看这个方法的类

这个执行关键在于$ifstr这个字符串,而他取决于

preg_match_all( $pattern, $zcontent, $matches )

我们可以查一查这个函数的用法

就是按照pattern的模式匹配将zcontent分割按顺序放在后面的数组参数里,所以最后ifstr取决于 $zcontent。这里就很清晰了,我们现在的目的就是去找谁调用了这个parseriflabel类。

我们发现parsercommon方法就调用了它,我们再看谁又实例化了ParserTemplate类

我们看到这里有四处调用。我们进入这个类具体分析

这四处的$zcontent值分别为

$user_tpl
load_file($tplfile,$location)
load_file($tplfile,$location)
load_file($tplfile,$location)

第一个我们是不可控制的。这里如果对四个if都分析一遍难度太高。因为我们是复现,所以是确定这里有漏洞的,所以这里的if判断就不那么重要。

关于load_file($tplfile,$location)的值,我们可以不用跟下去分析,我们直接echo出来

发现这就是模板代码

这里我们就基本清晰了这个业务逻辑,实际上它就是在执行模板。而模板代码可以通过登录后台更改

这样就造成了任意代码执行。这里只要我们添加的代码绕过下面两次过滤就可以了

第二个练习是针对baijiacms的命令执行漏洞挖掘

同样,我们从寻找关键词开始

这里我们只能控制$file_full_path,$file_full_path实际来自file_save方法的参数。我们从方法名能猜出它是一个文件操作方法。我们看哪里调用了它

下面是执行代码的要求

这个应该是文件上传的参数

根据路由,我们反推出功能点地址

发现有文件上传功能

文件名做一个小小的绕过就行了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码审计是一种常见的安全漏洞检测方法,可以帮助开发人员找出潜在的安全问题并及时修复。以下是一个基于Java的简单代码审计案例示例: 1. 漏洞描述:在使用Hibernate框架的过程中,如果没有正确使用参数绑定,可能会导致SQL注入漏洞。 2. 漏洞代码: ``` public void login(String username, String password) { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); Transaction tx = session.beginTransaction(); String hql = "from User where username='" + username + "' and password='" + password + "'"; Query query = session.createQuery(hql); List<User> userList = query.list(); tx.commit(); } ``` 3. 漏洞分析:在以上代码中,用户输入的用户名和密码没有使用参数绑定的方式,直接拼接到SQL语句中,这样就容易被攻击者构造恶意输入,从而实现SQL注入攻击。攻击者可以通过输入类似于"admin' or '1'='1"的恶意字符串来绕过验证,从而获取敏感信息或进行非法操作。 4. 修复建议:应该使用参数绑定的方式来替代字符串拼接,这样可以避免SQL注入漏洞。修复代码如下: ``` public void login(String username, String password) { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); Transaction tx = session.beginTransaction(); String hql = "from User where username=:username and password=:password"; Query query = session.createQuery(hql); query.setParameter("username", username); query.setParameter("password", password); List<User> userList = query.list(); tx.commit(); } ``` 在上述修复代码中,使用了参数绑定的方式,将用户输入的用户名和密码作为参数传递给查询语句,避免了SQL注入漏洞。 总之,代码审计是一项非常重要的安全检测工作,对于Java开发人员来说,需要根据实际情况学习并掌握各种安全漏洞的检测和修复方法,以确保应用程序的安全性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值