0%

SQL 注入学习笔记(一)

初次接触 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库,请自行搜索。