文章目录
第一节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 | '或" | 是否显示数据库错误信息;根据回显内容可以判断是字符型数据还是数字型。 |
3 | and1=1; and1=2 | 回显的页面是否不同(布尔类型的状态) |
4 | and 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