less 2

检测注入点

首先,先用单引号,检测注入点。首先我们需要知道我们在 id=1 后面加东西的目的是什么?是为了判断系统是否会混淆数据与代码,将我们输入的在某种情况下本可以作为代码执行的符号怎么处理?

当然处理方式不外乎两种

  1. 通过转义、检测关键字等手段将代码转换为无害的数据
  2. 处理不当,还有一部分可以被当做代码执行,我们 sql 注入便是源自于此。

为什么很多人都说先用单引号判断注入点呢,我认为是因为 id=1 、id= '1' 、id=('1')的开发语句用的比较多,通过单引号以及报错可以明确地区分它们。

比如三种报错:

1
2
3
' LIMIT 0,1
'1'' LIMIT 0,1
'1'') LIMIT 0,1

如果使用左括号呢?id=('1)')

id=1 、id= '1' 、id=('1') 分别报错:) LIMIT 0,1、'1)' LIMIT 0,1、Unknown column 'id' in 'where clause'.

这样也比较容易区分, 但是,(在 less 3 中使用有引号竟然正常返回,我要吐了..)经过一阵折腾,我发现这样一条语句: SELECT * FROM users WHERE id=('1)') LIMIT 0,1;

在我物理环境 mysql 8.0 时报错的,然而,在 less 2 处的环境(mysql 5.3)确实可以正常执行的。不同版本对 () 的处理不尽相同呀。

嗯,想必大神们也是知道这个,所以才不会用右括号什么的检测注入点吧。

在这里探讨这个,主要是想解决一下从入门学习以来的一个疑问:为什么使用单引号探测注入点的疑问。(不知道解决没有,对我来说,目前是解决了。)

回显:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' LIMIT 0,1' at line 1

可以看出报错:' LIMIT 0,1,第一个单引号显然是我们输入的那个。

由此可以猜测 sql 查询语句不是 id ='1' 的形式,因为根据 less1 我们知道如果是 id = '1',即:一般认为的字符型注入,报错应该是:'1'' LIMIT 0,1,即:mysql 会把前面的 '1' 也报出来,因为我们输入的单引号和它一起影响了它。

但是实际 sql 语句因该是什么样子的呢?

根据我目前的知识,我有以下两种猜测:

select * from tbl_name where id = 1

select * from tbl_name where id = ("1")

因为:

select * from tbl_name where id = ('1')

select * from tbl_name where id = (1)

如果加了单引号,这两种报错一定不是它,报错中得有个右括号才行。

这里我也不行区分什么是字符注入、什么是数字注入。根据具体情况猜测开发者用的语句,并逐一验证(或许根据经验,你知道哪种比较常用,就先验证那一种),直到证实自己的猜想为准。

或者说如果它不影响我们后面的联合查询,我们不用在乎它是什么,我们只需要知道这里存在注入点(注:要知道有注入点,别测试了半天,都没报过错,你就往后进行,哪怕是个傻子喽...),而且不用加单引号闭合前面的单引号(因为前面没有奇数个单引号),此外,还有 where 子句后面还有个 limit 子句,我们需要注释掉它。

less 3

检测注入点

首先先用单引号,检测注入点。回显报错:'1'') LIMIT 0,1

猜测 sql 查询语句:select * from tbl_name where id = ('1') LIMIT 0,1;

于是构造:?id=1') order by 4--+ 进行猜字段数

less 4

检测注入点

首先先用单引号,检测注入点。没有报错。这里我们要学习一个新的手法:使用双引号包裹: id = "1"

基于猜测,我们使用双引号再检测注入点,回显报错:"1"") LIMIT 0,1

猜想 sql 查询语句:select * from tbl_name where id = ("1") LIMIT 0,1;

构造:?id=1") order by 4 --+ 此字段

知道存在注入点后,下面就开始猜字段,爆版本、库名,然后爆所有的库,然后爆库中的表,然后爆表的字段名,然后爆数据。操作就和 less-1 的一样的,这里不再细讲。

总结

检测注入点

先使用单引号,看报错与否,

  • 如果报错,存在注入点,根据报错回显语句构造后续
  • 如果不报错,换双引号,看报错与否 - 如果报错,存在注入点,根据报错回显语句构造后续 - 如果不报错,换') 或 ')) 或 ") 或 ")) 尝试。

至于为什么检测这几个闭合方式呢?因为这几个开发人员用的多,当然也不排除有些奇葩的程序员,用别的,那样如果会报错的话,根据报错提示也可以猜测。