NJCTF2017 线上赛 web 题解 By Assassin

本文详细介绍了NJCTF2017线上赛的Web题目解题过程,涉及MySQL变量名截断、Bash通配符利用、Node.js缓冲区溢出、HMAC绕过、SQLite注入等多个技术点,通过实际操作演示了解题思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Login

打开以后出现一个登陆页面,下面有一个注册用户的链接。

这里写图片描述

打开申请界面

这里写图片描述

看着申请的密码还有要求不知道是不是题目的关键点。
我们先申请一个账号登陆一下看看,发现是这样的

这里写图片描述

尝试申请一下admin发现已经存在了

这里写图片描述

那么本题的知识点是mysql变量名在输入太长的时候会被截断!!那么我们就可以构造不是admin但是阶段后是admin的用户名

payload:
username=admin                                                                  a
pass=123QWEasd

这是登陆的截断,就相当于我们修改了admin的密码一样,然后用账号admin和密码123QWEasd登陆就可以成功了!

Get Flag

开始是上传一个文件比如1.jpg可以得到一个图片,然后我们随便输入一个东西,比如说123,然后我们可以得到如下的东西

这里写图片描述

然后是一个base64解码嘛,然后解密一下发现是这样的

cat: images/123: No such file or directory

然后我们发现就是cat查询,中间使用bash的通配符!然后可以控制命令行。有什么; * ,等都被过滤了,但是&没有被过滤,所以可以通过这个加入命令,不断用ls得到目录,当前没有,向上目录搜索,在构造11.jpg&ls ../../../ 解码时时候发现如下:

cat: images/11.jpg: No such file or directory
9iZM2qTEmq67SOdJp%!oJm2%M4!nhS_thi5_flag
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

估计就是第一个了,于是我们构造11.jpg&cat ../../../9iZM2qTEmq67SOdJp%!oJm2%M4!nhS_thi5_flag 在解码后得到答案!

这里写图片描述

值得一提的是,学习一发bash的通配符吧
bash之通配符


Chall I

google真是个好东西,搜索一下hack nodejs就找到了一篇思路相似的文章快来学习吧! 基本上思路完全相同,真是学习到了!

首先线下的网址是http://218.2.197.235:23729/ 看到的就是两个页面而已,然后我们观察源码根本什么都没有。然后打开F12看一下返回值。既然是讲js的,我们可以看到有angular.js和main.js,打开看一看第一个似乎是配置文件,和我们登陆的系列流程没有什么关系,但是我们再看main.js如下

var passwordApp = angular.module('passwordApp', []);

passwordApp.controller('PasswordCtrl', function ($scope, $http, $window) {
   
  $scope.password = '';
  $scope.login = {};

  $scope.enter_password = function() {
   
    $http.post('/login', {password: $scope.password}).then(function(response) {
   
            console.log(response.data);
            if(response.data.status === 'ok') {
                $window.location.href = "/admin";
            }
            $scope.login = response.data;
        }, function(response) {
   
            console.log(response.data);
            $scope.login = response.data;
        });
    }

    $scope.logout = function() {
   
        $http.get('/logout').then(function(response) {
   
            if(response.data.status === 'ok') {
                $window.location.href = "/admin";
            }
        }, function(response) {
    });
    }



});

然后我们似乎找到了其他的页面吧!

1

访问一下可以看到

这里写图片描述

admin是可以访问的,其他两个访问不到。
尝试登陆一下看看效果,登陆后network中多了一个login,打开看一下

这里写图片描述

这里有个东西很有意思

这里写图片描述

eyJhZG1pbiI6Im5vIn0=解码为{“admin”:”no”},好像改成yes就行了?但是这里是不行的!所以还是想想其他办法。

然后干啥???居然是网上找源码,在github上找,搜索请登录,bibibibibibibibibibibibibibi~找到一个代码!还真是老司机

这里写图片描述

到处看看其实最主要的代码在app/routes/index.js上

var express = require('express');
var config = require('../config');
var escape = require('escape-html');  
var crypto = require('crypto');
var reg = /^[0-9]*$/;
var router = express.Router();

router.get('/', function(req, res, next) {
   
    res.render('index', { title: 'index', admin: req.session.admin });
});

router.get('/admin', function(req, res, next) {
   
    res.render('admin', { title: 'admin', admin: req.session.admin, flag: config.secret_password });
});

router.get('/logout', function(req, res, next) {
   
    req.session = null;
    res.json({
  'status': 'ok'});
});

router.post('/login', function(req, res, next) {
   
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值