搜索公众号:白帽子左一,领配套练手靶场,全套安全课程及工具
一、SSJI简介
ssji,为服务器端的javascript注入,可分为sql注入和代码注入
运行于服务端的javascript常用的有node.js
node.js 是运行于服务端的javascript
把javascript变为服务器端的脚本语言
二、SSJI代码注入
SSJI代码注入原理
SSJI 代码注入是一个存在于javascript端的代码注入,存在于运行于服务端的js代码注入,当传入的参数可控且没有过滤时,就会产生漏洞,攻击者可以利用js函数执行恶意js代码
SSJI代码注入常用函数
node.js 常用的命令执行函数,由于它是运行于服务端的javascript,因此它使用的函数和javascript的相似
常用函数如下
eval() settimeout() setinterval() function()
首先看下这里的eval函数
eval
函数格式eval(string)
javascript的eval作用就是计算某个字符串,并执行其中的js代码
测试代码
var express = require("express");
var app = express();
app.get('/',function(req,res){
res.send(eval(req.query.a));
console.log(req.query.a);
})
app.listen(3002);
console.log('Server runing at http://127.0.0.1:3002/');
这里的参数a通过get传参的方式传入运行,我们传入参数会被当作代码去执行
这里传入一个console.log()的查看效果,console.log的作用是在控制台查看回显
看到这里能在控制台回显数据
function()
函数用法
function(string)()
这里的string就是我们传入的参数
这里的function用法类似于php里的create_function
这里用一个简单的测试代码测试下function是否可以执行代码
var express = require("express");
var app = express();
var aaa=Function("console.log('Hello world')")();
var server = app.listen(3088, function() {
console.log("应用实例,访问地址为 http://127.0.0.1:3088/");
})
实际测试时,当传入参数可控时,可能造成代码执行漏洞
settimeout()
函数格式
settimeout(function,time)
该函数作用是两秒后执行函数
function处为我们可控的参数
测试代码
var express = require("express");
var app = express();
setTimeout(() => {
console.log("console.log('Hello world')");
}, 2000);
var server = app.listen(8888, function() {
console.log("应用实例,访问地址为 http://127.0.0.1:8888/");
})
两秒后执行
函数测试效果如下
当这里为一个可控的传参时,漏洞就可能触发
setInterval() 函数
函数格式(function,time)
该函数的作用是每个两秒执行一次代码
测试代码
var express = require("express");
var app = express();
setInterval(() => {
console.log("console.log('Hello world')");
}, 2000);
var server = app.listen(8866, function() {
console.log("