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.可以使用开源工具sqlmap
,SQLninia
检测
代码演示:
创建数据库并插入数据
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) # <script>
old_html = html.unescape(new_html)
print(old_html) # <script>
四、什么是CSRF
?
CSRF
:Cross-site request forgery
(跨站请求伪造)
1.利用网站对已认证用户的权限去执行未授权的命令的一种恶意攻击
2.攻击者会盗用你的登录信息,以你的身份模拟发送请求
3.web
身份认证机制只能识别一个请求是否来自某个用户的浏览器,但是无法保证请求是用户自己或者批准发送的
CSRF
产生条件:
要完成一个CSRF
攻击,需要具备两个条件
1.受害者已经登录到了目标网站并且没有退出(保持登录状态)
2.受害者访问了攻击者发布的链接或者表单
3.二者必须缺一不可。
如何防范CSRF
?
不要在GET
请求里有任何数据修改操作
1.令牌同步(Synchronizer token pattern
,简称STP
):在用户请求的表单中嵌入一个隐藏的csrf_token
,服务端验证其是否与cookie
中的一致(基于同源策略其他网站是无法获取cookie
的csrf_token
,前提是网站本身没有XSS
漏洞)
2.如果是js
提交需要先从cookie
获取csrf_token
作为X-CSRFToken
请求头提交
3.其他:检测来源HTTP Referer
(容易被伪造);验证码方式(安全但是繁琐)
以上是关于9-2 web安全常考点的主要内容,如果未能解决你的问题,请参考以下文章