Bugku SQL注入实战:绕过黑名单与联合注入技巧
1. 初识Bugku SQL注入挑战第一次接触Bugku的SQL注入关卡时我完全被这个看似简单却暗藏玄机的登录界面难住了。页面上只有一个普通的用户名密码输入框但F12查看源码后发现了隐藏提示——/?pls_help路径。这个细节告诉我们做渗透测试时永远不要相信表面看到的东西。访问隐藏路径后我们拿到了关键的PHP源码。这段代码做了三件重要的事首先用error_reporting(0)关闭了错误提示这招很常见但也很致命相当于给攻击者关上了一扇信息泄露的窗户。其次引入了flag.php文件这就是我们要拿到的终极目标。最有趣的是那个is_trying_to_hak_me()函数它就像个尽职的门卫拿着黑名单一个个检查来访者。2. 破解黑名单的巧妙思路这个黑名单函数的设计很有意思它主要防范两种攻击一种是检测单引号的使用要求单引号前后必须是数字或字母/[0-9a-zA-Z][0-9a-zA-Z]/另一种是检查常见SQL关键词如union、select等。但经过反复测试我发现这个防护存在致命漏洞。关键在于如何构造一个既不被黑名单拦截又能实现SQL注入的语句。经过多次尝试我发现用adminxxx这样的格式就能轻松绕过单引号检测。更妙的是代码中的黑名单检查只针对原始输入而不会处理经过编码的语句。这就给了我们可乘之机——用/**/代替空格用十六进制编码绕过关键词过滤。3. 深入分析登录验证机制要成功利用这个漏洞我们必须先理解系统的登录验证流程。整个过程分为五个关键步骤系统根据username查询users表将查询结果的password字段按$符号分割前半部分是哈希值后半部分是盐值把用户输入的密码和查询到的盐值拼接对拼接字符串做sha256哈希比较生成的哈希和数据库存储的是否一致这里有个关键突破口系统完全信任数据库返回的password字段格式。如果我们能通过注入控制这个字段就能伪造任意密码的验证结果。4. 构造联合注入攻击链经过前面的分析我们的攻击思路就很清晰了准备一个已知密码比如1和盐值比如1的组合计算对应的sha256哈希值hash(sha256,1.1)构造password字段格式哈希值$盐值通过联合查询伪造这个字段具体注入语句如下1union/**/select/**/1,4fc82b26aecb47d2868c4efbe3581732a3e7cbcc6c2efb32062c08170a05eeb8$1这个语句的精妙之处在于用1开头满足单引号检测规则使用/**/代替空格绕过关键词检测通过union select伪造出包含我们预先计算好的哈希值的记录在密码框输入1就能完美匹配我们伪造的密码哈希成功登录获取flag。5. 防御措施与思考虽然我们成功绕过了防护但从防御角度来说这个系统可以改进的地方很多参数化查询是根本解决方案能彻底杜绝SQL注入密码存储应该使用专门的密码哈希函数如password_hash()黑名单机制需要更全面地覆盖各种编码和变体错误信息处理可以更友好而不是简单关闭在实际开发中我建议永远不要自己实现安全机制而是使用成熟的框架和库。安全是个系统工程靠几个简单的过滤函数是防不住专业攻击的。