Webhacking-Write-Up/Dreamhack

[Dreamhack] NoSQL-CouchDB

SlowTurtle_ 2023. 1. 11. 07:42
728x90

[Dreamhack] NoSQL-CouchDB

우선 코드를 보자.

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
const nano = require('nano')(`http://${process.env.COUCHDB_USER}:${process.env.COUCHDB_PASSWORD}@couchdb:5984`);
const users = nano.db.use('users');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
/* GET home page. */
app.get('/', function(req, res, next) {
  res.render('index');
});
/* POST auth */
app.post('/auth', function(req, res) {
    users.get(req.body.uid, function(err, result) {
        if (err) {
            console.log(err);
            res.send('error');
            return;
        }
        if (result.upw === req.body.upw) {
            res.send(`FLAG: ${process.env.FLAG}`);
        } else {
            res.send('fail');
        }
    });
});
// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};
  // render the error page
  res.status(err.status || 500);
  res.render('error');
});
module.exports = app;

app.post 부분을 보면 /auth경로에 post요청이 오면 코드가 실행된다. get함수로 uid를 받고 입력받은 uid로 데이터베이스를 조회하여 uid가 있다면 upw와 입력받은 upw를 비교하여 일치하면 플래그를 출력해주는 것을 알 수 있다.(만약 일치하는 uid가 없다면 error를 띄운다.)

upw일치 X

uid는 있지만 upw가 일치하지 않으면 fail을 띄운다. 

/auth를 보면 이용자가 uid를 입력하여 보내면 해당하는 데이터 조회한 후 에러와 조회 결과를 err와 result변수에 저장을 한다. 그 후 result.upw값과 이용자가 보낸 upw값이 일치하는지 비교한 후 만약 일치하면 flag값이 나오고 일치하지 않으면 result.upw의 값은 undefined가 된다. 우리는 Couch DB의 특수 구성 요소를 이용하여 공격할 것인데 현재 입력값을 아무런 검사를 하지 않기 때문에 특수 구성 요소를 사용할 수 있다. 여기서 우리는 _all_docs라는 특수 구성 요소를 사용할 것이다. _all_docs란 Couch DB에서 사용할 수 있는 특수 구성 요소 중 하나로 데이터베이스의 모든 정보를 보여준다.

현재 폼에서는 upw를 입력하지 않고 전송할 수 없기 때문에 curl을 이용해야한다.

음.. 맞게 작성한 것 같은데 틀렸다.. 그것도 }로 마무리 짓고 끝났다. 그래서 '(작은따옴표)에 문제가 있나 해서 구글링을 좀 해봤는데(좀..?많이..) '를 사용할 수 없는 것 같았다. 그래서 "로 변경하여 실행해주었더니?

flag값을 획득할 수 있었다.

728x90