sqli-labs教程序章

admin 2022年10月8日14:28:44评论38 views字数 2689阅读8分57秒阅读模式

sqli-labs教程序章




声明




本文作者: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注入场景进行设置,如图。

sqli-labs教程序章

那么,接着来讲解什么是SQL注入。所谓SQL注入,是指Web应用程序没有对用户输入的数据的合法性进行判断,导致攻击者可以构造特殊的输入数据,实现对数据库的任意操作。例如该后台登录框,在用户名处输入' or 1=1--”,密码可以为空或者任意内容,如果程序代码没有对其进行SQL注入严格验证的话,那么你就可以登录到后台了,接下来,我们来讲解一下原理

sqli-labs教程序章


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,结构如下:

sqli-labs教程序章

这时,在information_schema数据库的tables表,使用SQL语句,可以查到表名和数据库名称。

select * from information_schema.tables where table_name = 'tab'

sqli-labs教程序章

使用SQL语句,可以查到字段名。

select * from information_schema.columns where table_name = 'tab'

sqli-labs教程序章


4.3 Union查询

SQL注入过程中,经常会用到Union查询,通过多次查询结果合并起来,得到一个新的查询结果集。

例如:

http://192.168.85.137/sqli-labs-master/Less-1/?id=-1' union select 1,database(),3--+

界面会显示出数据库名称。


看完了右下角点个赞噢   更多安全资料等你拿

sqli-labs教程序章

原文始发于微信公众号(玄螭安全实验室):sqli-labs教程序章

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年10月8日14:28:44
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   sqli-labs教程序章http://cn-sec.com/archives/1299977.html

发表评论

匿名网友 填写信息