-
angstromctf2019#04. 잡다한것들 2019. 4. 27. 23:21
1. WControl You
이상하고 머리아픈 홈페이지다.
소스코드를 확인하고 <Script>태그를 보면 된다.
Stop이란 함수 내부에 falg.value가 actf{control_u_so_we_can't_control_you) 라는 문장일 경우 Background를 빨간색으로 바꿔준다.
해당 문장이 Flag이다.
2. no Sequels
HINT: MongoDB is a safer alternative to SQL, right?
123456789101112131415161718192021222324252627282930app.use(bodyParser.json());app.use(bodyParser.urlencoded({ extended: false }));...router.post('/login', verifyJwt, function (req, res) {// monk instancevar db = req.db;// 공격자의 입력값이 들어가는 부분var user = req.body.username;var pass = req.body.password;// 둘중 하나를 입력하지 않았을 경우 문구 출력if (!user || !pass){res.send("One or more fields were not provided.");}// 쿼리 Bind 하는 부분var query = {username: user,password: pass}db.collection('users').findOne(query, function (err, user) {if (!user){res.send("Wrong username or password");return}res.cookie('token', jwt.sign({name: user.username, authenticated: true}, secret));res.redirect("/site");});});/cs 위와같은 소스코드가 주어지고 Username과 Password를 입력하는 공간이 있다.현재는 아래와같이 문법이 구성되어 있다.db.collection('users').findOne({username: INPUT1, password: INPUT2},function (err,user){~~위의 부분을 수정하여 공격을 해보자.특수문자
설명
{}[]()
관계 묶음
'"
문자열 처리
:
관계 연결
$ne
!=
$exist
해당 키 존재여부
$lt, $gt, $lte, $gte
<, >, <=, >=
$regex
정규식을 사용한 일치여부
위의 구문들이 MongoDB에서 자주쓰는 문자들이라고 한다.
password: {$ne:"haha"}와 같은 식으로 사용하면 pw가 "haha"라는 문자열이 아닐 경우 참을 반환하게 된다.
다만 ID와 PW가 모두 정확해야 하니 두부분을 참으로 만들어주자.
username과 password 부분에 {$ne:"haha"}를 입력하였을 경우 인증이 성공될 것이라 생각했지만 되지 않는다.
다시 살펴보자. query 내부에는 username과 password라는 키값이 존재하고 2개의 키값이니 AND 연산을 하게된다.
또한 IF문에는 쿼리의 결과값이 없을 때 들어가 Wrong username or password라는 문자열을 출력한다.
별다른 필터링도 없는데 뭐지..
롸업이 추가된 후에 확인해보니 Content-Type 헤더를 'application / json'으로 변경한 후 페이로드를 전송해야 한다고 한다.
버프수트 인증서를 등록해두자.
3. no Sequels2
이번 Nosql injection의 경우 Blind형태로 비밀번호를 탈취하여야 한다.
123456789101112131415161718192021222324252627282930app.use(bodyParser.json());app.use(bodyParser.urlencoded({ extended: false }));...router.post('/login', verifyJwt, function (req, res) {// monk instancevar db = req.db;var user = req.body.username;var pass = req.body.password;if (!user || !pass){res.send("One or more fields were not provided.");}var query = {username: user,password: pass}db.collection('users').findOne(query, function (err, user) {if (!user){res.send("Wrong username or password");return}res.cookie('token', jwt.sign({name: user.username, authenticated: true}, secret));res.redirect("/site");});cs 해당 문제는 다른 Writeup들이 많이 있다. 정규식과 스크립를 통해 PW를 도출해보자.
3. DOM Validator
HINT: X
소스코드와 실 페이지 두가지 링크가 주어진다.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677<!----------AREA1------------>var express = require('express')var app = express()app.use(express.urlencoded({ extended: false }))app.use(express.static('public'))app.get('/', function (req, res) {res.send(`<!doctype html><!----------AREA2------------><html><head><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css"></head><body style="background-color: black; text-align: center;"><h1 style="color: white; margin-top: 2em;">Create Post</h1><form action='/posts' method='POST'><input name='title' placeholder='Post title'><br><textarea name='content' placeholder='Post content'></textarea><br><button type='submit' style="color: white">Create Post</button></form><h1 style="color: white">Report Post</h1><form action='/report' method='POST'><input name='url' placeholder='Post URL'><br><button type='submit' style="color: white">Report Post</button></form></body></html>`)})<!----------AREA3------------>var fs = require('fs')app.post('/posts', function (req, res) {// title must be a valid filenameif (!(/^[\w\-. ]+$/.test(req.body.title)) || req.body.title.indexOf('..') !== -1) return res.sendStatus(400)if (fs.existsSync('public/posts/' + req.body.title + '.html')) return res.sendStatus(409)fs.writeFileSync('public/posts/' + req.body.title + '.html', `<!DOCTYPE html SYSTEM "3b16c602b53a3e4fc22f0d25cddb0fc4d1478e0233c83172c36d0a6cf46c171ed5811fbffc3cb9c3705b7258179ef11362760d105fb483937607dd46a6abcffc"><!----------AREA4------------><html><head><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css"><script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/sha512.js"></script><script src="../scripts/DOMValidator.js"></script></head><body><h1>${req.body.title}</h1><p>${req.body.content}</p></body></html>`)<!----------AREA5------------>res.redirect('/posts/' + req.body.title + '.html')})// admin visiting pagevar puppeteer = require('puppeteer')app.post('/report', async function (req, res) {res.sendStatus(200)try {var browser = await puppeteer.launch({args: ['--no-sandbox']})var page = await browser.newPage()await page.setCookie({name: 'flag',value: process.env.FLAG,domain: req.get('host')})await page.goto(req.body.url, {'waitUntil': 'networkidle0'})} catch (e) {console.log(e)}})app.listen(3002)cs '#04. 잡다한것들' 카테고리의 다른 글
보안기사 끝 (0) 2019.05.28 [보안기사]네트워크 (0) 2019.05.06 [영화]스틸라이프 (0) 2019.04.25 CPPG 개인정보 관리사 합격! (0) 2019.04.24 리눅스 마스터 2급 합격! (0) 2019.04.24