这是我参与「第四届青训营 」笔记创作活动的第7天、
Web开发安全-攻击篇
Web开发安全是程序开发的重中之重,一不小心,用户隐私就被泄露了,再严重一点,公司直接垮了,程序员也只能跑路了
sql注入
sql注入是一种很常见的数据库攻击,比如多年前,有人在车牌上写了一条删除数据库的sql语句,然后被注入到数据库中,我们就成功的删库的“壮举”。
-
原理 黑客使用sql参数恶意注入,然后请求服务器,然后服务器运行sql代码恶意sql通过一些参数 获取、修改、删除数据等操作。。。
-
sql注入demo 如果我们使用字符串拼接的方式对sql语句进行操作,我们写的sql语句将很容易被注入。
-
代码示例:
public async renderFrom(ctx){
const{name,form_id}=ctx.query;
const result =await sql.query(`SELECT a,b,c FROM table WHERE username =${username} AND form_id =${form_id}`);
ctx.body=renderForm(result);
}
当黑客作为用户,在name中进行sql注入:
- 代码示例:
name: "any ;DROP TABLE table;"
// 我们使用字符串拼接sql后
SELECT XXX FROM XXX;DROP TABLE table;
然后,我们就实现了删库跑路的壮举。
Injection不只是sql
Injection不止于SQL: 还有:
- CLI
- OS command
- Server-Side Request Forgery(SSRF)------服务器伪造请求(并不是Injection,但原理相似)
CLI--执行
public async converVideo(ctx){
const {video,options}=ctx.request.body;
exec(`convert-cli ${video} -o ${options}`);
ctx.body="ok";
}
当黑客输入为: && rm -rf xxx
fetch("/api",{
method:"POST",
body:JSON.stringify({
options:` && rm -rf xxx`
})
});
//注入后语句:
const command=`convert-cli video -o && rm -rf xxx `
Injection ---读取、修改
假如一个大企业不小心暴露了一些重要文件,被黑客读取到,然后把某些文件修改到竞争对手的链接中,然后竞争对手架不住第三方的大流量使得服务器直接挂掉,这样就让竞争对手直接下线了(真刑)。
SSRF
特点:
- 请求【用户自定义】的callback URL
- web server 通常有内网访问权限
- 代码示例:
public async webhook(ctx){
//callback可能是内网url
xtc.body=await fetch(ctx.query.callback);
//访问callback===暴露内网信息
}
Denial of Service(Dos)
通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而产生雪崩效应。