我使用的是“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就轻而易举了
好的,今天的学习分享就到这里,谢谢大家的观看。