浅谈SQL注入(入门版)

浅谈SQL注入

(篇幅较长,包含对SQL注入的分析)

目录

一、SQL注入的原理

解释型语言:程序不需要编译,程序在运行时才翻译成机器语言,每执行一次都要翻译一次。因此效率比较低。比如Basic语言,专门有一个解释器能够直接执行Basic程序,每个语句都是执行的时候才翻译。(在运行程序的时候才翻译,专门有一个解释器去进行翻译,每个语句都是执行的时候才翻译。效率比较低,依赖解释器,跨平台性好。) [1]
——引自《百度百科

这也就意味着解释型语言是在执行时执行一句翻译一句。如果这时用户有交互性输入,那么这个输入将同样被放进代码里进行翻译。

有SQL语言基础的同学都应该见过,

select * from student where name = "张三"

这种类型的查询语句吧。如果我们把 张三 换成一个变量 $ name 并且让这个变量在运行时由用户进行赋值,结果会发生什么呢?答案就是 $ name 会被替换成用户的输入值。

于是我们神奇的黑客 (注:黑客一词最初曾指热心于计算机技术、水平高超的电脑高手,尤其是程序设计人员,而非现在所说的脚本小子和骇客们)大神们想出了一个点子:如果我输入的不是一个常量而是一段SQL命令呢?

SQL注入攻击是通过操作输入来修改SQL语句,用以达到执行代码对WEB服务器进行攻击的方法。简单的说就是在post/getweb表单、输入域名或页面请求的查询字符串中插入SQL命令,最终使web服务器执行恶意命令的过程。

二、SQL注入的探测语句

1、注入点的探测原理

根据原理我们可以分析得到,要想实现注入操作,其注入点首先要满足以下条件:存在动态网页与数据库之间的交互。通常只要带有输入提交的动态网页,并且动态网页访问数据库,就可能存在SQL注入漏洞。

2、注入点探测方式(以下以sqli为例)

常见的探测方式有以下几种:
(1)单引号判断

  • http://127.0.0.1/sqli/Less-1/?id=1’ 在这里插入图片描述

(2)and判断

  • http://127.0.0.1/sqli/Less-1/?id=1’ and 1=1 --+
    单引号判断1
  • http://127.0.0.1/sqli/Less-1/?id=1’ and 1=2 --+
    单引号判断2

(3)or判断
(4)xor判断
(5)加减号数字判断
(6)输入框判断

3、注入探测方式分析

以单引号探测方式为例,将单引号填入ID后得到如下报错语句:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1
(您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第1行的“ 1” LIMIT 0,1’附近使用。)(——翻译软件)

(注:1、其中LIMIT可用作分页,例:

select * from 表名 limit 05

表示下标从0开始是第一个,每5条记录为一页。
2、–+ 表示 --和空格的组合,-- 在SQL语句中起注释作用,可将其后语句进行注释。)

由于是对查询语句的引用,故最外层单引号表示引用,整理后的报错内容为

'1'' LIMIT 0,1

我们可以看到多出了一个单引号,而这个多出的单引号正是我们填入的单引号。也许有人问了,这有什么用,跟注入有什么关系?别着急,往两边看看。如果我们把我们填入的单引号去掉,那么语句就成了

'1' LIMIT 0,1

哇哦,这就是你的查询语句么?抱歉,我收下了。
根据SQL学习的经验(没学的赶紧去研究研究啦),我们可以反推出查询语句形式为

SELECT 字段名 FROM 表名 WHERE id='$id' LIMIT 0,1

也就是说我们探测的目的就是:找出原查询语句的语句形式

(附:sqli原查询语句代码

SELECT * FROM users WHERE id='$id' LIMIT 0,1



三、SQL注入的进一步注入

当我们分析出SQL语句的查询语句形式时,我们就可以利用其特性进行进一步的注入操作。

1、ORDER BY 探测

ORDER BY 语句用于根据指定的列对结果集进行排序。

  • http://127.0.0.1/sqli/Less-1/?id=1’ order by 3 --+
    Order By 3
  • http://127.0.0.1/sqli/Less-1/?id=1’ order by 4 --+
    Order By 4

Order By 后所加数组表示查询列的列号(从1开始),有结果可知,第四列不存在,那么我们假设这个表一共只有三列。

2、UNION 探测

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

  • http://127.0.0.1/sqli/Less-1/?id=0’ union select 1,2,3 --+
    UNION SELECT 1,2,3

首先我们选择一个没有内容的ID页,便于显示数据,接着利用union语句将这个空页的空数据和我们需要查询的数据进行合并,由上述特性可知,我们必须构造一个与原表拥有相同列数的表。
由此选择构造语句为 select 1,2,3 由回显可知第2,3列数据会被显示出来。
(附:select * from studentselect 1,2,3 from student在这里插入图片描述

3、利用GROUP_CONCAT探测

Group_concat 主要将属于同一类的元素归类,通常以group by为分类依据,若group by不存在,则所有数据归为一行。
在这里插入图片描述在这里插入图片描述
利用这种特性进行语句构造。

  • http://127.0.0.1/sqli/Less-1/?id=0’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()–+
    在这里插入图片描述
  • http://127.0.0.1/sqli/Less-1/?id=0’ union select 1,group_concat(column_name),3 from information_schema.columns where table_name=‘users’ --+
    在这里插入图片描述
  • http://127.0.0.1/sqli/Less-1/?id=0’ union select 1,group_concat(username,0x3a,password),3 from users --+
    在这里插入图片描述

至此,我们得到登录表中所有数据。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章