在准备省技能大赛的时候,老师又给推荐了一个新一代信息技术创新应用大赛的安全赛道的省赛,于是便和队员一起报名了比赛,初赛是线上赛,真可谓是一波三折,第一天晚上还没有进入比赛,主办方的服务器便因为并发太高宕机了,于是在等待了一个多小时之后终于……主办方决定延期😂第二天下午又一个紧急通知,决定晚上开赛,这次主办方终于把服务器问题解决了,开始了愉快的比赛,结果到最后半小时,主办方服务器又被D了(心疼主办方三秒钟😥),我们队伍也是顺利进入决赛,这次初赛碰到两道代码审计题还是挺有意思的决定记录一下

完全OK

题目地址:http://47.105.128.249:31722

这道题的代码可以分为三部分,我们从下往上看第一段代码是一个判断语句

1
2
3
4
5
6
7
if($_GET["action"]){ 
$action = $_GET["action"]; //GET传参action
}
if($action=='login'){ admin_login(); } //当action=login时,执行admin_login函数
elseif($action=='repass'){ admin_change_password(); } //当action=repass时,执行admin_change_password()函数
else{ echo '<div align="center"><img src="img/timg.jpg" /></div>';
highlight_file(__file__); }

看到主代码之后,我们查看admin_login与**admin_change_password()**两个函数分别执行了什么内容;

1
2
3
4
function admin_login(){  
$username = stripslashes(trim($_POST['name'])); $password = stripslashes(trim($_POST['password'])); $query = mysqli_query($GLOBALS['conn'],"select u_id from user where u_name='$username' and u_password ='".md5($password)."'"); //使用POST传参对username与password分别赋值,使其满足$query中的sql语句
if(!! $row = mysqli_fetch_array($query)){ echo("<script>alert('login succeess!!')</script>"); include("/flag"); } //if语句进行判断查询是否有结果,有的话输出弹窗login success,并输出flag
else{ echo("<script>alert('login error!!')</script>"); } }

stripslashes函数可用于清理从数据库中或者从 HTML 表单中取回的数据,删除 / 符号;

trim函数用于删除两边空格;

我们可以看到在进行sql查找时没有使用任何过滤函数,可以使用万能密码直接绕过,获取flag;

Ping

题目地址:http://47.105.128.249:35002/

1
2
3
4
5
<?php
$target = $_GET['target']; //GET传参target
$cmd = shell_exec('ping -c 2 '.$target); //shell_exec — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
echo $cmd;
highlight_file(__FILE__);

发现shell_exec函数,进行命令注入,而且没有任何过滤字符先构造payload寻找flag文件地址

发现根目录下存在ffffflaggggggg文件,构造payload读取文件内容,获得flag