云计算百科
云计算领域专业知识百科平台

《OWASP Top 10-SQL注入漏洞-基础概念》

网络安全技术仅作为教学,请牢记网络安全法,不可在未授权情况下对任何信息系统进行安全测试,本文章仅作教学,不承担任何责任

1. 引言
  • SQL注入概念及其危害
    SQL注入(SQL Injection),是指攻击者通过在Web应用程序的输入字段中插入精心构造的恶意SQL语句,欺骗后台数据库将其当作合法指令执行的一种攻击技术。由于SQL语句本身是纯文本字符串,应用程序如果直接将用户输入拼接到SQL查询中,数据库就无法区分哪些是“代码”,哪些是“数据”,从而让攻击者有机可乘。

    啊!!!!!分不清!!!我真的分不清啊!!!!ok,下面是白话翻译

    想象一下,你开了一家餐厅,顾客通过菜单点菜。正常情况下,顾客会说“我要一份宫保鸡丁”,后厨就照做。但如果有个顾客不按套路出牌,他对你说:“我要一份宫保鸡丁,另外,请把你们家所有顾客的信用卡信息都打印出来给我。” 你如果照做了,那就出大事了。

2. SQL注入的基本原理
  • 用户输入未过滤导致的漏洞
    本系列文章均已PHP代码为示范,本系列文章不做PHP基础教学,可通过AI等方式自行学习
    代码片段来源SQLi-LABS靶场

<?php
// 引入数据库连接参数配置文件(该文件通常包含主机、用户名、密码、数据库名等)
include("../sql-connections/sql-connect.php");

// 关闭 PHP 错误报告(阻止 PHP 将警告、通知等显示在页面上,但不会影响数据库自身的错误输出)
error_reporting(0);

// 检查 URL 查询参数中是否包含 'id' 字段(如 index.php?id=1)
if(isset($_GET['id']))
{
// 获取用户通过 GET 方式传入的 id 参数值,并赋值给变量 $id
$id=$_GET['id'];

// 打开(或创建)当前目录下的 result.txt 文件,以追加写入模式 ('a')
$fp=fopen('result.txt','a');
// 将当前接收到的 id 值写入日志文件,并换行(用于调试或记录分析)
fwrite($fp,'ID:'.$id."\\n");
// 关闭文件句柄,释放资源
fclose($fp);

// ⚠️ 漏洞点:直接将用户输入 $id 拼接到 SQL 查询字符串中,未做任何过滤、转义或参数化处理
// 该 SQL 语句使用单引号包裹 $id,属于字符型注入点,且限制了只返回第一条记录(LIMIT 0,1)
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

// 执行 SQL 查询(使用过时的 mysql_* 扩展,该扩展在 PHP 7.0+ 已被移除,且不支持预处理语句)
$result=mysql_query($sql);

// 从查询结果中取出一行数据(以数组形式)赋给 $row
$row = mysql_fetch_array($result);

// 判断是否有查询结果(即 $row 是否为真,表示找到了匹配的用户)
if($row)
{
// 如果查询成功,开始输出成功信息,设置字体颜色为亮绿色
echo "<font size='5' color= '#99FF00'>";
// 输出查询到的用户名
echo 'Your Login name:'. $row['username'];
echo "<br>"; // 换行
// 输出查询到的密码
echo 'Your Password:' .$row['password'];
echo "</font>"; // 关闭字体标签
}
else
{
// 如果没有查询到任何数据(即 $row 为 false),则进入错误处理分支
echo '<font color= "#FFFF00">';
// ⚠️ 高危漏洞点:将 MySQL 返回的原始错误信息直接打印到页面
// 攻击者可以利用这些错误信息推断数据库结构、表名、字段名,甚至 SQL 语法细节
print_r(mysql_error());
echo "</font>";
}
}
else
{
// 如果 URL 中没有传入 id 参数,则提示用户输入数字类型的 ID 参数
echo "Please input the ID as parameter with numeric value";
}

// 以下为页面底部的 HTML 内容,用于显示一张图片
?>
</font> </div></br></br></br><center>
<img src="../images/Less-1.jpg" /></center>
</body>
</html>

可以注意到,代码中有一个核心的SQL查询语句,这条语句没有做任何的过滤或其他的操作,可以直接查数据库,引用上文,如果我现在让他查ID为1的数据,他会正常返回。如果此时,我是那个不正常的食客,我要求他做宫保鸡丁的时候,把餐厅顾客所有的信用卡信息给我,他也会给我,这就是SQL注入的根本原因,不同的编程语言写法不同,但是漏洞成因是相同,皆是因为未对用户输入的数据进行过滤或其他措施导致的

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

3. SQL注入的危害
  • 数据泄露(脱库):攻击者可以读取数据库中的任何数据,包括管理员账号、用户密码(即使加密也可能被破解)、个人隐私信息、商业机密等。这是最常见也最直接的危害。
  • 身份绕过:无需正确密码即可登录任意账户,甚至直接获取管理员权限,完全掌控后台。
  • 数据篡改:攻击者可以修改、删除数据库中的记录,例如给自己充值、更改商品价格、删除日志等。
  • 拒绝服务:通过执行消耗资源的SQL语句,导致数据库服务器过载,使整个网站瘫痪。
  • 服务器沦陷:在某些数据库配置下,攻击者甚至可以通过数据库执行操作系统命令,进而拿下整个服务器的控制权。

本篇文章为理论篇章,后续会有靶场和步骤拆解教学

赞(0)
未经允许不得转载:网硕互联帮助中心 » 《OWASP Top 10-SQL注入漏洞-基础概念》
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!