AWD靶机实战第一天:读php源码找漏洞

我使用的是“2019 年 5 月 11 日防灾科技学院 “应急挑战杯” 大学生网络安全邀请赛 AWD 靶机"题目,需要的朋友可以下载。

项目目录预览 - 20190511_awd_docker - GitCode

搭建过程我就不说了,因为有大佬的文章讲过,非常详细,大家可以去搜一下。我使用的是b4题目,我们可以看到里面的文件非常的多啊,所以一个个的去看肯定费劲,所以直接丢进源代码审计工具一起看。

我们进入靶场环境之后可以看到是这样的

登录使用常见的弱口令进不去,所以我们注册进去看看,进来之后是这样

我们能看到url上面有参数,那可能就有漏洞,所以我们现在来到index.php的源文件看看

发现有两个传参,然后传参之后给了两个函数,这两个函数是包含在function.php里面的,这时我们来到代码审计的软件,发现正好审出来这个函数的漏洞。

那现在我们就来看看这个函数有什么问题

function run_c($class){
    
    if ( !preg_match('/^\w+$/', $class) or (!file_exists(ROOTDRI."/lib/".$class.".php")) ){
    //preg_match是进行正则匹配的函数,第一个参数是正则表达式,第二个参数是要匹配的字符串
    ///^是正则开始标志,$/是正则结尾标志,\w是匹配字符和数字加下划线,\w+表示不止匹配一个
        exit('hack');
    //!file_exists(ROOTDRI."/lib/".$class.".php")是检查根目录下的lib文件夹下是否有传入的参数拼接上php的文件,如果没有就返回false
    }else{
        // echo 1111;
        include "./lib/".$class.".php";
        return new $class;
    }
}

首先是一个条件语句,判断输入的c参数的值是否是只由字母数字和下划线组成,或者,如果根目录下的/lib/文件夹下没有输入的参数与.php拼接起来的文件,满足其中一个都会退出并输出hack.如果不满足if的条件,那么else就会包含这个新的文件名,并且返回这个实例化的类。这里没有什么问题,我们再来看下面这个函数。

function run_a($obj,$action){
    if ( !preg_match('/^[\w\W].*$/', $action)){
        exit('hack');
    //\w表示匹配字符数字和下划线,\W表示匹配除字符下划线数字之外的全部字符,所以说这个条件语句永远为假,所以说只会执行else
    }else{
        eval('$obj->'.$action.'();');
    }
}

这个条件语句接受一个类,就是刚刚上一个函数返回的$class,index.php文件里写了

然后执行if语句,由于if语句里面的正则匹配永远为真,加一个!,那就是永远为假,所以说只会执行else,else里面有一个执行php代码的函数eval,所以这个函数将会执行$obj类里面的传入的方法,url上面写的是c=user&a=home

所以拼接起来这个eval函数就是:eval(&obj->home()),所以就可以调用User.php里面的home()方法,我们再去看看User.php里面的home()方法是什么。

这个方法很长,也没什么用,但是在审计工具中我们可以看到,在这个文件的下面有一个另外的方法

也就是这个方法,因为里面有system()函数,所以可能有任意命令执行,所以我们只需要将调用的home方法变为ping方法,就可以执行任意命令。

然后你url到这个目录下,将a的值变成ping

再post请求一个参数,但是主要要使用;进行联合查询

我们可以看到,已经查出来了

现在读取flag就轻而易举了

好的,今天的学习分享就到这里,谢谢大家的观看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值