Web-CTF-SQL注入刷题总结

本文最后更新于:2024年5月13日 晚上

1. 区分数字型注入和字符型注入

了解数值型注入和字符型注入 - 知乎 (zhihu.com)

数字型注入:

输入的参数为整形,输入参数一般为ID值,年龄,页码等,一般不需要单引号闭合。

字符型注入:

输入的参数为整形,将输入值作为字符串进行传递,一般需要单引号闭合。

区分SQL注入漏洞类型:

1
2
3
4
5
6
7
输入 8 and 1=1
HTTP://www.xxser.com/test.php?id=8 and 1=1
数字型:select * from table where id=8 and 1=1
语句执行正常,返回数据与原始请求无任何差异

字符型:select * from table where id= '8 and 1=1'
语句执行异常,无法返回正确值

数字型注入判断

使用经典的and 1=1 and 1=2

?id=1 and 1=1 显示正常

?id=1 and 1=2 显示错误

说明存在数字型注入

字符型注入(需闭合)判断:

?id=1' and 1=1 --+ 回显正确

?id=1' and 1=2 --+ 回显错误

说明存在字符型注入

判断的时候直接把上面的四个都试一遍,看符合哪个

1
2
3
--+ :注释,是为了注释多余的 '),若不注释掉,则还会报错
即:select * from users where id=('')
select * from users where id=('1') and 1=1 --+')

2. --和#在sql有什么区别

在字符型注入中,会用到下面的语句,?wllm=1' order by 3--+

在SQL中, --# 都用作单行注释,但它们的使⽤环境和数据库系统兼容性有些不同。

- :这是SQL标准的单行注释符号。大多数SQL数据库,包括SQL Server、PostgreSQL和MySQL,都⽀持使⽤ - 进⾏单⾏注释。通常, - 后⾯需要跟⼀个空格。

1
SELECT * FROM table -- 这是⼀个注释

# :这是MySQL特有的单⾏注释符号。它不是SQL标准的⼀部分,所以在其他数据库系统(如SQL Server或PostgreSQL)中可能不会被识别。

1
SELECT * FROM table # 这也是⼀个注释,但仅在MySQL中有效

如果你的代码只需要在MySQL中运行,使用 #是没有问题的。但如果你希望你的SQL代码能在不同的数据库系统中运行,最好使用标准的 -- 注释。

总结一下, -- 更具有通用性,而 #是MySQL特有的。如果你在编写数据库无关的代码,最好使用--。

3. 为什么要加+

在字符型注入中,会用到下面的语句,?wllm=1' order by 3--+

在某些SQL解析器和数据库管理系统(如MariaDB、MySQL等)中,--后面需要跟一个空格才能被识别为SQL注释。在URL中,由于空格通常会被去掉或需要编码(通常为%20+),所以直接使用一个空格可能会导致SQL语法错误。

在这种情况下,添加+实际上是在确保注释--后面有一个空格,这样数据库就能正确解析这个SQL注释。因此,--+实际上是--空格(两个短划线后面跟一个空格)的URL编码形式。

这就解释了为什么在这个具体例子中,不加+会导致SQL语法错误:数据库在解析SQL时没有把--识别为注释,因为它后面没有跟空格。而加上+后,数据库就能正确地把--识别为注释。

4. Burp Suite2023完美安装

本人自从知道了新版本有高亮,就再也不想用老版本,搞了半天,终于在各种乱七八糟的教程中搜到了我能实操的

感谢下面的两位师傅:

Burp Suite专业版 -2023.10(激活教程附包) - 知乎 (zhihu.com)

burp suit 文本不能精确选中的原因 - ly探长 - 博客园 (cnblogs.com)


Web-CTF-SQL注入刷题总结
http://viper2383.github.io/2024/05/13/Web-CTF-SQL注入刷题总结/
作者
w1per3
发布于
2024年5月13日
许可协议