9-2 web安全常考点

Posted WinvenChang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9-2 web安全常考点相关的知识,希望对你有一定的参考价值。

一、考点聚焦

常见的web安全问题,原理和防范措施。安全意识
1.SQL注入
2.XSS(跨站脚本攻击,Cross-Site Scripting)
3.CSRF(跨站请求伪造,Cross-Site request forgery)

二、什么是SQL注入?

SQL注入与防范
1.通过构造特殊的输入参数传入web应用,导致后端执行了恶意SQL
2.通常由于程序员未对输入进行过滤,直接动态拼接SQL产生
3.可以使用开源工具sqlmapSQLninia检测

代码演示:

创建数据库并插入数据

CREATE TABLE `users`(
	`id` INT NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(45) NULL,
	`email` VARCHAR(45) NULL,
	`password` VARCHAR(45) NULL,
	PRIMARY KEY (`id`)
);

insert into users(name, email, password) values ('laowang', 'laowang@qq.com', md5('laowang123'));
insert into users(name, email, password) values ('zhangsan', 'zhangsan@qq.com', md5('zhangsan123'));
insert into users(name, email, password) values ('lisi', 'lisi@qq.com', md5('lisi123'));

生成数据库表和数据如下 :

sql 注入演示代码

import os
import mysqldb   # pip install mysqlclient

db = MySQLdb.connect(
	host='localhost',
	user='root',
	password=os.getenv('MYSQL_PASS'),
	db='test'
)

cur = db.cursor()

name = input('Enter name: ')
print(f'您输入的用户 name 是:name')
password = input('Enter password: ')
print(f'您输入的密码是:password')

# 直接拼接 sql 参数
sql = " SELECT * FROM users WHERE name='" + name + "'" + " AND password=md5('" + password + "')"   # 有 sql 注入危险的语句
sql = "SELECT * FROM users WHERE name=%s and password=md5(%s)"   # 用占位符,防止 sql 注入
print(sql)
cur.execute(sql)   # 没用点位符时的执行
cur.execute(sql, (name, password))   # 用占位符时的执行,代码会在底层做一个转义操作,可以防止 sql 注入
for row in cur.fetchall():
	print(row)

db.close()

正常的运行过程:

sql注入的运行过程:
这里的密码随便输入,还是输出了查询结果,是sql注入

如何防范SQL注入?
web安全一大原则:永远不要相信用户的任何输入
1.对输入参数做好检查(类型和范围);过滤和转义特殊字符
2.不要直接拼接sql,使用 ORM可以大大降低sql注入风险
3.数据库层:做好权限管理配置;为要明文存储大敏感信息

三、什么是XSS?

XSS(Cross Site Scripting),跨站脚本攻击
1.恶意用户将代码植入到提供给其他用户使用的页面中,未经转义的恶意代码输出到其他用户的浏览器被执行
2.用户浏览页面的时候嵌入页面中的脚本(js)会被执行,攻击用户。
3.主要分为两类:反射型(非持久型,一般会把脚本放url参数里),存储型(持久型,一般会让脚本存储到网站数据库中)

XXS危害:

xss可以利用js实现很多危害巨大的操作
1.盗用用户 cookie,获取敏感信息
2.利用用户私人帐号执行一些违法操作,比如盗取个人或者商业资料,执行一些隐私操作
3.甚至可以在一些访问量很大的网站上实现DDos攻击

如何防范XSS
不要相信用户的任何输入:
1.过滤(输入和参数)。对敏感标签<script> <img> <a>等进行过滤
2.转义。对常见符号("&", “<”, and “>”)转义(python3 html.escape
3.设置HttpOnly禁止浏览器访问和操作Document.cookie

转义代码示例:

import html

new_html = html.escape('script>')
print(new_html)   #  &lt;script&gt;

old_html = html.unescape(new_html)
print(old_html)   # <script>

四、什么是CSRF?

CSRFCross-site request forgery(跨站请求伪造)
1.利用网站对已认证用户的权限去执行未授权的命令的一种恶意攻击
2.攻击者会盗用你的登录信息,以你的身份模拟发送请求
3.web身份认证机制只能识别一个请求是否来自某个用户的浏览器,但是无法保证请求是用户自己或者批准发送的

CSRF产生条件:
要完成一个CSRF攻击,需要具备两个条件
1.受害者已经登录到了目标网站并且没有退出(保持登录状态)
2.受害者访问了攻击者发布的链接或者表单
3.二者必须缺一不可。

如何防范CSRF
不要在GET请求里有任何数据修改操作
1.令牌同步(Synchronizer token pattern,简称STP):在用户请求的表单中嵌入一个隐藏的csrf_token,服务端验证其是否与cookie中的一致(基于同源策略其他网站是无法获取cookiecsrf_token,前提是网站本身没有XSS漏洞)
2.如果是js提交需要先从cookie获取csrf_token作为X-CSRFToken请求头提交
3.其他:检测来源HTTP Referer(容易被伪造);验证码方式(安全但是繁琐)

以上是关于9-2 web安全常考点的主要内容,如果未能解决你的问题,请参考以下文章

9-2 web安全常考点

面试常考点:http和https的区别与联系

目录遍历攻击详解

网络安全-常见面试题(Web渗透测试密码学等)

网络安全-常见面试题(Web渗透测试密码学Linux等)

web安全与防范