题目构思:一输入点,一输出点,带入执行的命令语句,实现命令注入漏洞。
上代码↓
test.js
const Koa = require('koa');
const Router = require('koa-router');
const app = new Koa();
const router = new Router();
const bodyParser = require('koa-bodyparser');
app.use(bodyParser());
app.use(router.routes());
router.get('/',async ctx => {
let str = "";
if(ctx.request.query.str!=null){
str = ctx.request.query.str;//获取get提交的参数
}
try{
require('fs').writeFileSync('/tmp/flag.txt','xxxxxx');//在目录中写入flag.txt
ctx.body = `
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>
<h1>在下框中输入任意文字</h1>
<form action="/" method="get"><!--form表单,用来提交数据--!>
<input name="str" type="text" />
<button type="submit">提交</button>
</form>
<h1>${require('child_process').execSync('echo '+str+' | xargs -dX').toString()}</h1>
<!--执行命令: echo ${str} | xargs -dX --!>
</body>
</html>
`;
}catch(e){
ctx.throw(400,e.message);
}
});
app.listen(3000)
下面是我在 Runkit 上运行的test
这道题比较简单,但是基本上是所有命令注入题的灵魂
答案在下面
答案在上面
Runkit 用来跑 node.js 的测试页真的超级方便,不用自己安装任何库如何包,想用什么直接调什么。+++下面简单写个教程
先进去注册个帐号 Runkit官网
然后点 “+” 新建一个notebook页
把代码粘贴进去,然后等待左下角显示为 saved 就保存成功了(如果很长时间都没保存好就直接 F5 刷新页面吧)
点击页面上面的 endpoint 就可以打开预览页面了(每次重新编辑都要等左下角的saved保存成功,然后刷新打开的预览界面就可以看到效果了,很方便)
ps:
我有个大胆的想法。。。用 Runkit 写一个单机的 CTF训练营(嘴角逐渐上扬)
end