简单的SQL注入原理

小白学了一点简单的SQL注入,做了点笔记,感觉挺详细,希望能帮助到学习的伙伴。大佬勿喷,有不足多多的指教。

实验原理

SQL注入攻击是通过将恶意的SQL查询或添加语句插入到应用的输入参数中,再在后台SQL服务器上解析执行进行的攻击,它目前是黑客对数据库进行攻击的最常用的手段之一。本课程将带你从介绍web应用运行原理开始,一步一步理解SQL注入的由来,原理和攻击方式。

SQL注入带来的威胁主要有如下几点:
■猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。
■绕过认证,列如绕过验证登录网站后台。
■注入可以借助数据库的存储过程进行提权等操作。

4.sql注入示例一.猜解数据库

简单的SQL注入原理

看看后台中到底执行了什么样的SQL语句呢?点击view-source查看源代码:

简单的SQL注入原理
实际执行的SQL语句是:
select first_name,last_name from users where user_id= ='1';

(这里我建议先学一下MySQL这样会理解的更好一点,这里我推荐一下我在前面学习的mysql笔记:)

我们是通过控制参数id的值来返回我们需要的信息。如果我们不按常理出牌,比如在输入框中输入1‘ order by 1# 实际执行的SQL语句会变成:
select first_name,last_name from users where user_id = '1' order by 1#';(按照Mysql语法,#后面的会被注释掉,使用这种方法屏蔽掉后面的单引号,避免语法错误)
语句的意思就是查询users表中的first_name,last_name中的user_id为1的数据并按第一字段排行(order by 语句用于根据指定的列对结果集进行排序,语句默认是按照升序记录进行排序的)。
输入 1’ order by 1#和1‘ order by 2#时都返回正常:

简单的SQL注入原理

简单的SQL注入原理

当输入1’ order by 3#时,返回出错:

简单的SQL注入原理

由此可知,users表中只有两个字段,数据为两列。接下来我们使用union select 联合查询继续获取信息。union运算符可以将两个或者两个以上select语句的查询结果集合合并成一个结果集显示,即执行联合查询。需要注意在使用union查询的时候需要和主查询的列数相同,而我们之前已经知道了主查询列数为2,接下来就好办了。输入1‘ union select database(),user()#进行查询:
database()将会返回当前网站所使用的数据库名字。
user()将会返回执行当前查询的用户名。

实际执行的SQL语句是:
select first_name,last_name from users where user_id = '1' union sesect database(),user()#';

简单的SQL注入原理

通过上图的返回信息,我们成功获取到:
■当前网站使用的数据库为dvwa。
■当前执行查询用户名为[email protected]
同理我们在输入1’ union select version(),@@version_compile_os#进行查询:
■version()获取当前数据库的版本
■@@version_compile_os获取当前操作系统。

实际执行的SQL语句是:
select first_name,last_name from users where user_id = '1' union select version(),@@version_compile_os#';

简单的SQL注入原理

通过上面的图中返回信息,我们可以知道:

■当前的数据库版本为:5.5.50-0Ubuntu0.14.04.1

■当前的操作系统为:debian-linux-gun

接下来我们尝试获取dvwa数据库中的表名。information_schema是mysql自带的一张表,这张数据表保存了Mysql服务器所有数据库的信息,如数据库名、数据库的表、表栏的数据类型与访问权限等。该数据库拥有一个名为tables的数据表,该表包含两个字段table_name和table_schema,分别记录DBMS中的存储的表名和表名所在的数据库。

我们输入1‘ union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#进行查询:
实际执行的SQL语句是
select first_name,last_name from users where user_id = '1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#';

简单的SQL注入原理


通过上图返回信息,我们可以知道:

■dvwa数据库有两个数据表,分别是guestbook和users。
有些人啊觉得这些信息还是不够,那么我们接下来尝试获取重量级的用户名,密码,有经验的大家可以大胆的猜测users表的字段为user和password,所以输入:1’ union select user,password from users#进行查询:实际执行的SQL语句是:
select first_name,last_name from users where user_id = '1' union select user,password from users#';

简单的SQL注入原理

可以看到成功的爆出用户名,密码,密码采用md5进行加密,可以到www.cmd5.com进行解密。

Sql 注入实例二.验证绕过

接下来我们再试试另一个利用SQL漏洞绕过登录验证的实验。

简单的SQL注入原理

给我的是一个普通的登录页面,只要输入正确的用户名和密码就能登录成功。我们先尝试所以输入用户名123,密码123登录:
嗯,就是随手一试,也就随便给了我一个错误的界面。23333

简单的SQL注入原理

从错误页面中我们无法获取到任何信息。看看后台代码如何做实验的:

简单的SQL注入原理
实际执行的操作时:

select * from users where username='123' and password='123'

当查询到数据表中存在同时满足username和password字段时,会返回登录成功。按照第一个实验的思路,我们尝试在用户名中输入123‘ or 1=1#;

简单的SQL注入原理

为什么能够登录成功呢?因为实际执行的语句是:
 select * from users where username='123' or 1=1 #' and password='123' or 1=1 #'
一样按照Mysql语法,#后面的内容会被忽略,所以以上语句等同于(实际上密码框里不输入任何东西一样):
select * from users where username='123' or 1=1
由于判断语句 or 1=1恒成立,所以结果当然返回真值,登录成功。我们再尝试不用#屏蔽引号,采用手动闭合的方式:我们尝试在用户名中输入123’ or ‘1’=‘1.密码同样输入123’ or ‘1’=‘1(不能少了单引号,否则会有语法错误):
实际执行的SQL语句是:

select * from users where username ='123' or '1' ='1' and password='123' or '1'='1'
看到了吗?两个or语句使and前后两个判断永远恒等与真,这所以能够成功登录。

                                                   欢迎关注微信公众号     

                                                      简单的SQL注入原理

                                                  简单的SQL注入原理