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) {
});
}
});
然后我们似乎找到了其他的页面吧!
访问一下可以看到
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) {