Pikachu靶场实战:GET请求下的字符型SQL注入全流程解析

Pikachu靶场实战:GET请求下的字符型SQL注入全流程解析 1. 环境准备与工具配置在开始实战之前我们需要准备好实验环境。Pikachu靶场是一个专门为Web安全学习设计的漏洞演练平台它模拟了各种常见的Web漏洞场景包括我们今天要重点分析的字符型SQL注入。我建议使用Firefox浏览器进行操作因为它有丰富的安全插件生态配合Burp Suite这个神器能让我们更清晰地观察和修改HTTP请求。Burp Suite的配置有几个关键点需要注意首先要在Proxy→Options里确保本地8080端口的监听处于开启状态然后在浏览器网络设置中配置手动代理地址为127.0.0.1端口8080。这里有个小技巧 - 我习惯在开始前先关闭Intercept功能Proxy→Intercept→Intercept is off这样可以让请求先正常通过等需要时再开启拦截。很多新手刚开始用Burp时经常因为忘记关闭拦截而导致页面一直加载这个小细节能帮你省去不少麻烦。2. 注入点探测与初步验证打开Pikachu靶场的字符型注入页面你会看到一个简单的用户查询表单。我们先输入一个普通用户名比如allen试试水。页面返回了uid和email两个字段同时注意到URL变成了类似http://target/vul/sqli/sqli_str.php?nameallensubmit查询的形式。这个细节很重要 - 它告诉我们这是一个典型的GET请求所有参数都直接暴露在URL中。为了确认这里是否存在注入漏洞我通常会先尝试输入一个单引号。如果页面返回数据库错误信息那基本可以确定存在SQL注入漏洞。在实际测试中我发现Pikachu靶场对这个输入做了友好化处理不会直接报错但这不代表漏洞不存在。更稳妥的方法是使用布尔型测试payloadallen and 11#和allen and 12#。如果第一个返回正常结果而第二个返回空那就确认存在注入了。3. 确定查询字段数量接下来我们需要确定原始SQL查询返回的字段数这是后续使用UNION查询的基础。虽然页面显示只有uid和email两个字段但实际SQL查询可能包含更多字段。我常用的方法是使用order by子句逐步测试allen order by 1# -- 正常 allen order by 2# -- 正常 allen order by 3# -- 报错从测试结果可以确认查询只涉及2个字段。这里有个经验之谈很多新手会忽略order by测试直接进行UNION注入这可能导致构造的payload不匹配而失败。记住order by的数字要逐步增加直到出现错误为止最后一个成功的数字就是字段总数。4. 构造基础注入Payload理解了字段数量后我们可以构造更复杂的payload。先尝试一个简单的永真条件x or 11#这个payload的工作原理是原始SQL可能是SELECT uid,email FROM users WHERE name[输入]我们的输入将其变成了SELECT uid,email FROM users WHERE namex or 11#。由于11永远为真#又注释掉了后面的内容所以这个查询会返回users表中的所有记录。在实际渗透测试中这种查询可能会返回大量数据容易引起管理员注意。我通常会加上limit子句来控制返回行数比如x or 11 limit 1,1#这样更隐蔽。5. 使用UNION查询提取数据库信息UNION注入是我们获取数据库信息的主要手段。首先获取当前数据库名和用户x union select database(),user()#这个payload会返回两个字段第一个显示数据库名称(pikachu)第二个显示当前数据库用户(rootlocalhost)。知道数据库名后我们可以进一步查询表结构x union select TABLE_SCHEMA,TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMApikachu#这个查询会列出pikachu数据库中的所有表。在我的测试中发现了users、member等敏感表名。接下来针对users表查询其列结构x union select TABLE_NAME,COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMApikachu and TABLE_NAMEusers#结果显示users表有id、username、password、level等关键字段。至此我们已经完全掌握了目标数据库的结构。6. 提取敏感数据与密码破解有了表结构信息现在可以直接查询敏感数据了x union select username,password from users#这个查询会返回所有用户名和密码的MD5哈希值。以pikachu用户为例其密码哈希是670b14728ad9902aecba32e22fa4f6bd。我们可以使用hash-identifier工具识别哈希类型hash-identifier 670b14728ad9902aecba32e22fa4f6bd确认是MD5哈希后可以使用在线破解网站如cmd5.com进行解密。实测发现这个哈希对应的明文是000000。很多系统使用弱默认密码这也是为什么密码破解在渗透测试中成功率很高的原因之一。7. 防御措施与安全建议作为开发者防范SQL注入有几个关键点首先所有用户输入都应该参数化处理使用预处理语句(Prepared Statements)其次实施最小权限原则数据库用户只应被授予必要的最低权限最后对输入进行严格的过滤和验证。我在代码审计时发现很多SQL注入漏洞都是因为开发者在拼接SQL时直接使用了用户输入。正确的做法应该是$stmt $pdo-prepare(SELECT uid,email FROM users WHERE name?); $stmt-execute([$name]);这种参数化查询能从根本上防止SQL注入。此外Web应用防火墙(WAF)可以作为第二道防线但它不应该被视为主要的防护手段。