初次接触 CTF,被 SQL 注入搞晕了,于是写一发学习笔记。
本文介绍 SQL 注入中的字符型和整数型(目前只会这两种 QAQ)。
以题目[SWPUCTF 2021 新生赛]easy_sql为例。
学习 SQL 注入之前,最好先有一点 SQL 基础。
整数型注入和字符型注入大同小异,区别在于闭合方式,所以第一步是判断闭合方式。
判断闭合方式
为什么要判断闭合方式
举个例子,如果后端的 SQL 语句长这样:
1 | SELECT * FROM users WHERE id='?'; |
其中 ?
是我们提交的参数。
判断字段数时,如果我们直接输 1 oreder by 10086
,会发现返回的是正常的页面(按理来说应该报错),而输入1' order by 10086 --+
则会报错。
(--+
代表注释,下文有解释)
所以,要想我们构造的 SQL 语句正常运行,应知道参数的闭合形式。
原理
MYSQL数据库的包容性比较强,如果你输错了数据的类型,MYSQL数据库会自动将其转换成正确的数据类型,比如输入1)、1”、1-等,只要数字后面的字符不是闭合符的,数据库都会把你输入的错误的数据转换成正确的数据类型。
但是,若输入的数字后面的字符恰好是闭合符,则会形成闭合,若闭合后形成的sql语句是错误的,那么sql语句执行就会错误,从而造成页面显示错误
方法
方法 1.在参数后加闭合符号
SQL 中的闭合方式基本是单引号、双引号、圆括号的排列组合,一个个试,如果报错则说明猜对了。
比如例题中,我们由提示知道参数名为wllm
,输入?wllm=1
,没有报错,?wllm=1'
,报错了,说明单引号是闭合符,由于闭合符可以是多个符号组合,可以输入?wllm=1'--+
验证,如果报错,说明还有闭合符,可在后面加括号继续试。
方法 2.利用\
(转义字符)
报错信息中\
后面的字符就是闭合符号。
输入?wllm=1\
,发现报错,这时候看\
后紧跟着的字符,发现是'
,则闭合方式是单引号闭合。
--+
是什么
见此文章。
判断字段数
为什么要判断字段数
因为我们后面要用到union
执行我们的select
,而 UNION 内部的 SELECT 语句必须拥有相同数量的列,因此我们需要知道前一个select
语句的字段数。
方法
1.order by $num
$num 小于等于字段数时正常,大于则报错。
可以使用二分法。
2.union select 1,2…
原理在上面。
例题字段数为 3。
找回显点
不想写了,请看此文章
从information_schema
库中得到表名,列名。
这步需要了解一下group_concat()
函数和information_schema
库,请自行搜索。