什么是SQL注入?还记得小学语文测验上的填空题吗?标题的意图显著是通过填空来了谜底题者的名字和爱好。
比如:我是_______________,喜欢__________________
假如有同窗填成下面这样?
我是超级蜘蛛池,我可以引蜘蛛快速提高收录,喜欢_______________________
这就是一个注入的范例,当出题者认为他已经定下了句子的主体组织,需要填空的内容是不会阴碍主体组织的,而填空者却通过填写的内容,改动了整句话的组织,这就是注入。
通过精心组成的URL参数,或者表单提交的参数,拼接到预先定义好的SQL形式时,意外地变更了程序员预期的SQL组织时,SQL注入就构成了。执行该SQL语句已超出的程序员的意图。比如,没用用户名或密码可以登陆胜利,或将数据库内容全体dump下来,等等。
第一步、我们先安装测试环境。安装Apache、PHP、MySQL 这里用的LINUX环境
在Ubuntu下安全LAMP非常简朴,只需要一个号召就可以了:
sudo apt-get install apache2 mysql-server mysql-client php5 php5-gd php5-mysql
假如你有Web动态语言开发经历,php是个很容易上手的语言。当然我们选用LAMP的目标不是Web本身,是采用它来写一个demo的数据库利用,测试SQL注入。
在安装MySQL过程中会要求设置root用户的密码,设置成root(后面链接数据库时需要)。
安装完成后,eb 项目根目录默认在var, 为了简朴起来,对LAMP不做任何配置。打开阅读器,输入 localhost 测试安装是否胜利。下是测试胜利的范例。
测试一下php是否任务正常,创造一个testphp文件sudo vim vartestphp输入下面的代码:
?php
phpinfo()
?
在阅读器打开 localhosttestphp,输出结局如下:
PHP测试环境搭建胜利了。
第二步、编写简朴的数据库利用 采用mysql客户端连接MySQL数据,号召如下:#mysql -h localhost -u root -p
Enter passord 这里输入密码:root输入用户root的密码root胜利登录之后的过程:
创造数据库test首先要创造一个数据库,这里将数据名字称为test,在mysql客户端输入如下号召:
mysqlcreate database test;
进入test数据库mysql use test;
创造表userinfo有了数据库,还得有表,才能装下真正的数据。简朴起见,表只有两个字段name和passd,差别保留用户名和密码,其中name为主键。MySQL下的创造语句:
create table userinfo (name char(20) not null primary key, passd char(20) not null);
插入用户数据
为了测试,需要往表里面插入数据。采用mysql语句往userinfo表插入两个用户信息,差别是linyt和ivan,密码和用户名内空一样。
MySQL语句如下:
insert into userinfo values(linyt, linyt);
insert into userinfo values(ivan,ivan);
测试一下数据表内容
在MySQL客户端输入:select * from userinfo;号召可以看到userinfo表中所有纪实。
下面采用php脚本语言编写个简朴的登录系统。代码如下:
原理非常简朴,通过username 和 passd 两个文本框承受用户输入的用户名和密码,然链接数据库,采用select * from userinfo here name=输入的用户名 AND passd=用户输入的密码SQL语句从数据库中查询出用户纪实,假如有该用名,则以表格方式来显示用户信息。
对于没人做过eb开发的朋友可以会问,这里为什么需要单引号,那是由于name字段的类型是字符串,字符串值需要采用单引号括起来。而数值类型是不需的单引号的。
三、SQL注入试验在注入试验之前,我们先呈现正常登录功效:
为了便捷后面验证呈现,每次都会在网页上输出查询的SQL语句内容。
先来观测一下产生了什么事情:差别输入用户名linyt和密码linyt,然后点login
后面php服务中获取用户的输入,并保留在$name和$passd两个变量
采用$name和$passd两变量来拼接生成SQL语句,并进行数据库查询
将从数据库是查询出数据在网页上输出
本例中输入用户名linyt和密码linyt场合,SQL语句的拼接过程如下:假如不知道用户名和密码的场合下,怎么能够登陆胜利呢?假如不知道用户名密码,那么name = ‘$name’ 随意替代成一个用户名如abc,变成name = ‘abc’,这个条件肯定不能为true,为了使得WHERE语句的条件为ture,就得更换它的语句组织。
即然name = ‘abc’ 肯定为false,那么我们在后面增加一个or,再附件一个恒真语句,那整个语句就为ture了。,比如1 = 1,1=1, = ,在差异的高下文抉择合适的就可以了。
留神一下SQL拼接语句中name = ‘$name’,这里是有两个号的。为了终极注入结局为:
select * from userinfo WHERE name = 这里写什么都不重要 or 1=1 AND passd = 这里写什么都不重要 or 1=1
那name和passd应该填什么呢?请看图:
四、SQL注入测试结局:请留心阅读器地址栏的内容:
localhostuerinfophp?name=+or+13D1passd=+or+13D1
阅读器在址址显示时采用了URL编码,与用户输入username和passd内容看起来不彻底一样,实际是一样的。采用+来典型空格,3D来取代=
通过注入,网页显示了userinfo表中的所有纪实。 大家可以再看一下网页上的SQL语句输出:
sql = SELECT * FROM userinfo WHERE name = or 1=1 AND passd = or 1=1
假如你对SQL很在行,那可做更复杂的注入,可以将数据库里面许多东西给偷出来。
?php
phpinfo()
?
差别输入用户名linyt和密码linyt,然后点login
后面php服务中获取用户的输入,并保留在$name和$passd两个变量
采用$name和$passd两变量来拼接生成SQL语句,并进行数据库查询
将从数据库是查询出数据在网页上输出
本例中输入用户名linyt和密码linyt场合,SQL语句的拼接过程如下:
假如不知道用户名和密码的场合下,怎么能够登陆胜利呢?
假如不知道用户名密码,那么name = ‘$name’ 随意替代成一个用户名如abc,变成name = ‘abc’,这个条件肯定不能为true,为了使得WHERE语句的条件为ture,就得更换它的语句组织。
即然name = ‘abc’ 肯定为false,那么我们在后面增加一个or,再附件一个恒真语句,那整个语句就为ture了。,比如1 = 1,1=1, = ,在差异的高下文抉择合适的就可以了。
留神一下SQL拼接语句中name = ‘$name’,这里是有两个号的。为了终极注入结局为:
select * from userinfo WHERE name = 这里写什么都不重要 or 1=1 AND passd = 这里写什么都不重要 or 1=1
那name和passd应该填什么呢?请看图:
四、SQL注入测试结局:
请留心阅读器地址栏的内容:
localhostuerinfophp?name=+or+13D1passd=+or+13D1
阅读器在址址显示时采用了URL编码,与用户输入username和passd内容看起来不彻底一样,实际是一样的。采用+来典型空格,3D来取代=
通过注入,网页显示了userinfo表中的所有纪实。 大家可以再看一下网页上的SQL语句输出:
sql = SELECT * FROM userinfo WHERE name = or 1=1 AND passd = or 1=1
假如你对SQL很在行,那可做更复杂的注入,可以将数据库里面许多东西给偷出来。
在阅读器打开 localhosttestphp,输出结局如下:
PHP测试环境搭建胜利了。
第二步、编写简朴的数据库利用 采用mysql客户端连接MySQL数据,号召如下:#mysql -h localhost -u root -p
Enter passord 这里输入密码:root输入用户root的密码root胜利登录之后的过程:
创造数据库test首先要创造一个数据库,这里将数据名字称为test,在mysql客户端输入如下号召:
mysqlcreate database test;
进入test数据库mysql use test;
创造表userinfo有了数据库,还得有表,才能装下真正的数据。简朴起见,表只有两个字段name和passd,差别保留用户名和密码,其中name为主键。MySQL下的创造语句:
create table userinfo (name char(20) not null primary key, passd char(20) not null);
插入用户数据
为了测试,需要往表里面插入数据。采用mysql语句往userinfo表插入两个用户信息,差别是linyt和ivan,密码和用户名内空一样。
MySQL语句如下:
insert into userinfo values(linyt, linyt);
insert into userinfo values(ivan,ivan);
测试一下数据表内容
在MySQL客户端输入:select * from userinfo;号召可以看到userinfo表中所有纪实。
下面采用php脚本语言编写个简朴的登录系统。代码如下:
原理非常简朴,通过username 和 passd 两个文本框承受用户输入的用户名和密码,然链接数据库,采用select * from userinfo here name=输入的用户名 AND passd=用户输入的密码SQL语句从数据库中查询出用户纪实,假如有该用名,则以表格方式来显示用户信息。
对于没人做过eb开发的朋友可以会问,这里为什么需要单引号,那是由于name字段的类型是字符串,字符串值需要采用单引号括起来。而数值类型是不需的单引号的。
三、SQL注入试验在注入试验之前,我们先呈现正常登录功效:
为了便捷后面验证呈现,每次都会在网页上输出查询的SQL语句内容。
先来观测一下产生了什么事情:
输入用户root的密码root胜利登录之后的过程:
创造数据库test 首先要创造一个数据库,这里将数据名字称为test,在mysql客户端输入如下号召: mysqlcreate database test; 进入test数据库 mysql use test; 创造表userinfo 有了数据库,还得有表,才能装下真正的数据。简朴起见,表只有两个字段name和passd,差别保留用户名和密码,其中name为主键。MySQL下的创造语句: create table userinfo (name char(20) not null primary key, passd char(20) not null); 插入用户数据 为了测试,需要往表里面插入数据。采用mysql语句往userinfo表插入两个用户信息,差别是linyt和ivan,密码和用户名内空一样。 MySQL语句如下: insert into userinfo values(linyt, linyt); insert into userinfo values(ivan,ivan); 测试一下数据表内容 在MySQL客户端输入:select * from userinfo;号召可以看到userinfo表中所有纪实。 下面采用php脚本语言编写个简朴的登录系统。代码如下: 原理非常简朴,通过username 和 passd 两个文本框承受用户输入的用户名和密码,然链接数据库, 采用select * from userinfo here name=输入的用户名 AND passd=用户输入的密码SQL语句从数据库中查询出用户纪实,假如有该用名,则以表格方式来显示用户信息。 对于没人做过eb开发的朋友可以会问,这里为什么需要单引号,那是由于name字段的类型是字符串,字符串值需要采用单引号括起来。而数值类型是不需的单引号的。 在注入试验之前,我们先呈现正常登录功效: 为了便捷后面验证呈现,每次都会在网页上输出查询的SQL语句内容。 先来观测一下产生了什么事情:三、SQL注入试验