声明
本文作者:CloudStrife(玄螭安全实验室-核心成员)
玄螭安全实验室拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明,文章来源等全部内容。未经玄螭安全实验室允许,不得修改文章内容,不能以任何方式将其用于商业目的。
Sqli-labs教程序章
目录:
1.SQL注入简介
2.SQL注入原理
3.SQL注入分类
4.MySQL相关知识点
4.1MySql注释符
4.2MySql信息数据库
4.3Union查询
1.SQL注入简介
接下来的教程,准备利用sqli-labs教程,来讲解SQL注入的手段,这里用到的是开源的SQL注入平台,sqli-Labs,它的代码托管在Github上,地址:https://github.com/Audi-1/sqli-labs。可以通过搭建php环境,然后部署代码,即可进行实验。Sqli-labs一共有75个例子,每个例子都针对特定的SQL注入场景进行设置,如图。
那么,接着来讲解什么是SQL注入。所谓SQL注入,是指Web应用程序没有对用户输入的数据的合法性进行判断,导致攻击者可以构造特殊的输入数据,实现对数据库的任意操作。例如该后台登录框,在用户名处输入“' or 1=1--”,密码可以为空或者任意内容,如果程序代码没有对其进行SQL注入严格验证的话,那么你就可以登录到后台了,接下来,我们来讲解一下原理
2.SQL注入原理
下面以PHP代码为例,来讲解SQL注入原理。首先最常见的是登录常见,它在后台查询的SQL语句如下。
select * from users where username ='$username' and password = '$password' |
如果传入的username和password为“admin”和“password”,SQL语句如下。
select * from users where username ='admin' and password = 'password' |
正常情况下,该语句会查询数据库,如果用户名和密码都正确的话,就返回对应结果给用户。
但是,如果传入的username和password为“' or 1=1--”和“123”时候,我们看一下SQL语句会变成什么样,如下。
select * from users where username =' ' or 1=1--' and password = '123' |
现在我们会发现,代码存在严重问题,因为“and password”这个部分完全不起作用,它被注释掉了,现在的SQL语句username=' ' or 1=1,右边横为真,所以该SQL语句最终执行的如下。
select * from users |
这样攻击者获得了users表所有信息。所以本质上说,SQL注入,是用户输入的数据被Web应用程序没有对用户输入的数据的合法性进行判断,导致攻击者可以构造特殊的输入数据,实现对数据库的任意操作。
3.SQL注入分类
常见SQL注入主要就分为两类,一类是数字型注入,一类是字符型注入。先来看一下数字型注入。
数字型注入是指,输入的参数为整型时,例如ID,页码等,则认为是数字型注入,假设一则新闻的URL为http://www.123.com/a.php?id=2,那么它的SQL语句可能为
select * from table where id = 2 |
a)如果现在输入URL为http://www.123.com/a.php?id=2',它的SQL语句则变为
select * from table where id = 2' |
这样情况下,肯定查询不到数据。
b) 如果现在输入URL为http://www.123.com/a.php?id=2 and 1=1,它的SQL语句则变为
select * from table where id = 2 and 1=1 |
这种情况下,页面现在正常,和原来的内容一致。
c)如果现在输入URL为http://www.123.com/a.php?id=2 and 1=2,它的SQL语句则变为
select * from table where id = 2 and 1=2 |
这种情况下,SQL语句有误,页面返回的数据肯定有问题。
假如满足以上三个步骤,那么就可以认定存在数字型注入。
那么字符型注入,顾名思义,就是需要单引号来闭合字符,同样,假设现在是在登录框中,那么输入用户名和密码,它的SQL语句可能为
select * from table where username = 'admin' and password = 'password' |
如果攻击者输入用户名为admin' and 1=1 --,则SQL语句为
select * from table where username = 'admin' and 1=1 --' password = 'password' |
所以字符型注入,需要单引号来闭合,完成SQL注入攻击。
4.MySQL相关知识点
4.1 MySQL注释符
MySQL有三种注释符,分别是:--+,#,/**/,其中,--+和#是单行注释符,/**/是多行注释符。例如,SQL语句
http://192.168.85.137/sqli-labs-master/Less-1/?id=1--+ |
4.2 MySQL信息数据库
MySQL在5.0版本后多出了一张系统数据库(information_schema),在这里面记录了所有数据库的元数据,包括数据库的库名,表名,字段名等信息,全部都可以在这里查到。通常使用这个数据库的tables表和columns表。
假如现在在MySQL中建立了一个数据库名为test,包含一个表tab,表里有四个字段Id、user、age、pass,结构如下:
这时,在information_schema数据库的tables表,使用SQL语句,可以查到表名和数据库名称。
select * from information_schema.tables where table_name = 'tab' |
使用SQL语句,可以查到字段名。
select * from information_schema.columns where table_name = 'tab' |
4.3 Union查询
SQL注入过程中,经常会用到Union查询,通过多次查询结果合并起来,得到一个新的查询结果集。
例如:
http://192.168.85.137/sqli-labs-master/Less-1/?id=-1' union select 1,database(),3--+ |
界面会显示出数据库名称。
原文始发于微信公众号(玄螭安全实验室):sqli-labs教程序章
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论