Web安全原理剖析(十)——Base64注入攻击

本文详细介绍了Base64注入攻击的实例,通过URL参数进行编码与解码,展示了如何利用Base64编码绕过WAF检测,实现SQL注入。同时,分析了存在注入漏洞的PHP代码,说明了$id直接拼接到SQL语句导致的安全问题,并提出了利用Union查询获取数据库数据的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


2.11 Base64注入攻击

  Base64攻击的测试地址:http://127.0.0.1/sqli/base64.php?id=MQ%3d%3d。

  从URL中可以看出,ID参数经过Base64编码(%3d是=的URL编码格式),解码后发现ID为1,尝试加上一个单引号并一起转换成Base64编码,如图59所示。


图59 对1'进行Base64编码

  当访问id=1’编码后的网址时(http://127.0.0.1/sqli/base64.php?id=MSc%3d),页面返回错误。1 and 1=1和1 and 1=2的Base64编码分别为MSBhbmQgMT0x和MSBhbmQgMT0y,再次访问id=MSBhbmQgMT0x和id=MSBhbmQgMT0y,返回结果如图60和图61所示。


图60 访问id=MSBhbmQgMT0x的结果
图61 访问id=MSBhbmQgMT0y的结果

  从返回结果可以看到,访问od=1 and 1=1时,页面返回与id=1相同的结果,而访问od=1 and 1=2时,页面返回与id=1不同的结果,所以该网页存在SQL注入漏洞。

  接着,使用order by查询字段,使用union方法完成此次注入。


2.12 Base64注入代码分析

  在Base64注入页面中,程序获取GET参数ID,利用base_decode()对参数ID进行Base64解码,然后直接将解码后的$id拼接到select语句中进行查询。通过while循环将查询结果输出到页面,代码如下所示。

<?php
$id = base64_decode(@$_GET['id']);
$con = mysqli_connect("localhost","root","root","test");
// 检测连接
if (mysqli_connect_errno())
{
    echo "连接失败: " . mysqli_connect_error();
}
mysqli_select_db($con,'test');

$sql = "select * from users where id=$id";
$result = mysqli_query($con,$sql);

if (!$result)
{
    exit("error");
}

while($row = mysqli_fetch_array($result))
{
    echo "ID:".$row['id']."<br >";
    echo "user:".$row['username']."<br >";	
    echo "pass:".$row['password']."<br >";
    echo "<hr>";
}

mysqli_close($con);
echo "now use ".$sql."<hr>";
?>

  由于代码没有过滤解码后的$id,且将$id直接拼接到SQl语句中,所以存在SQL注入漏洞。当访问id=1 union select 1,2,3--+(访问时,先进行Base64编码)时,执行的SQL语句为:

select * from users where `id`=1 union select 1,2,3--+

  此时SQL语句可以分为select * from users where `id`=1和union select 1,2,3两条,利用第二条语句(Union查询)就可以获取数据库中的数据。

  这种攻击方式还有其他利用场景,例如,如果有WAF,则WAF会对传输中的参数ID进行检查,但由于传输中的ID经过Base64编码,所以此时WAF很有可能检测不到危险代码,进而绕过了WAF检测。


### 实验环境准备 为了进行DVWA SQL注入攻击实验,需先搭建好测试平台。确保已安装并配置了DVWA(Damn Vulnerable Web Application),并将安全级别设置为低以便于初次学习[^1]。 ```bash # 启动DVWA服务 service apache2 start ``` ### 测试SQL注入漏洞 当安全等级设为`Low`时,可直接输入恶意字符串进入ID参数框中提交请求。例如,在URL栏里修改`id`值为`' or '1'='1`,这将绕过正常的查询条件使所有记录都符合条件从而被显示出来[^4]。 对于更复杂的场景如`Medium`及以上难度,则可能需要用到自动化工具辅助分析。比如使用Sqlmap这款强大的开源渗透测试工具来探测以及利用SQL注入缺陷: ```python import os os.system(''' python sqlmap.py \ -u "http://192.168.171.10/vulnerabilities/sqli/?id=1&Submit=Submit#" \ --cookie="security_level=0; PHPSESSID=ho05i9sr7evr6chgqs3d0d3n50; security=low" \ -D dvwa --tables ''') ``` 上述命令指定了目标网址、会话Cookie,并告诉sqlmap去枚举指定数据库中的表格名称[^2]。 ### 构造有效载荷 了解如何构建特定的有效载荷是掌握SQL注入技术的关键部分之一。考虑如下情况:假设存在一个简单的SELECT查询语句用于检索给定ID对应的数据条目;此时可以通过附加额外的逻辑表达式改变原有意图达到控制输出的目的。像这样的一句话就可以实现这一点:`select * from users where user_id = 1 OR 1=1 /*`[^3]。 ### 验证结果反馈机制 值得注意的是,不同应用对于异常状况有不同的处理方式——有的可能会抛出详细的错误提示帮助调试程序同时也暴露了内部结构信息;而另一些则仅给出模糊的消息或者根本没有回应。因此,在实际操作过程中要善于观察页面变化规律以推测背后发生的交互过程。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Phanton03167

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

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

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

打赏作者

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

抵扣说明:

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

余额充值