XSS(跨站脚本注入)
引入
在表单中嵌入非法HTML代码
如果一个网站有一个表单,类似这样:
1 | <textarea></textarea> |
然后用户往里面填写了这样的信息:
1 | <script>alert(12412412);</script> |
如果在展示页面,直接将用户输入的内容作为 innerHtml
渲染,那么用户打开这个页面就会弹出对话框。
a链接上的href
1 | <template> |
后台返回内容中拼接HTML不过滤
1 |
类型
- 存储型XSS:恶意脚本被存入了数据库
- 反射性XSS:恶意脚本作为一个URL的部分发送给服务器,然后将URL中的信息直接通过
innerHtml
等手段展示给了用户。 - DOM XSS:这和反射型XSS差不多,但区别是DOM XSS 完全是在客户端上执行的。
- 针对浏览器的XSS:利用浏览器渲染DOM的特性
1 | <noscript><p title="</noscript><img src='' onerror=alert(1)>" /></noscript> |
危害
- 恶意脚本能够窃取的信息,然后发送给第三方
- 能够让页面出现弹框等严重BUG
- 可以诱骗用户填写假内容
原理
- 直接使用用户的内容进行渲染
innerHtml=用户内容
或者SSR(用户内容)
解决
- 对于一切传入的用户内容,应当对里面的HTML进行转义和过滤。
- 配置内容安全策略
CSRF(跨站请求伪造)
恶意网站在用户不知情的情况下,窃取用户的Cookie等身份凭证,伪造请求,从而窃取或修改用户信息。
伪造不同的请求
- 通过图片的
src
等方式,可以伪造GET请求 - 通过表单操作,可以伪造POST请求
解决
- Cookie添加Samesite、作用域、
Secure
等属性,避免用户信息被第三方携带。 - 严格权限控制。
- CSRF Token
注入
引入
如果用户提供了一个这样的参数:
1 | let query = { |
后台直接拼接SQL字符串,不做处理:
1 | let sql = `SELECT * from user where id=${query.id}` |
那么合成后:
1 | let sql = `SELECT * from user where id=1;DROP TABLE user;` |
执行后,user
这个表格就没有了。
除了SQL注入,还存在命令注入:
1 | let query = { |
甚至还有服务端请求伪造:
1 | let query = { |
分类
- SQL注入
- 命令注入
- SSRF(服务端请求伪造)
解决
- 不要直接将用户输入的内容填充到SQL、命令等内容,应当做过滤处理
- 做好数据库、后天程序的执行权限管理
DOS和DDOS:拒绝服务攻击
通过一些特定的方式,短时间内制造大量请求,使得服务端资源被耗尽,来不及响应。
TCP SYN 泛洪
利用了TCP三次握手的原理,在第一次握手的时候,制造一个私有的IP地址来发送SYN请求。此时服务器会返回一个ACK-SYN的响应。但是这个IP是私有的,不可达,所以这个响应是无法收到的。这时候服务器也无法收到ACK消息,就会触发超时重传机制。
通过短时间制造大量这样的请求,使得服务器被这些攻击SYN请求占满。
ping 泛洪
短时间发送大量的ICMP消息。
HTTP 泛洪
短时间制造大量的HTTP请求。
解决
- 采用负载均衡、CDN等技术进行流量分发和过滤
- 快速扩容、非核心业务降级
中间人攻击
HTTP协议是明文传输,因此一旦被中间人劫持,中间人就可以窃取修改数据了;或者把正常请求劫持到攻击者的非法网站等。
解决
- 采用HTTPS
- 对敏感内容进行加密