SQL注入攻击:典型攻击类型(附例子)及攻击目的

SQL注入攻击是网络安全的常见威胁。
攻击者向应用程序提交恶意SQL代码以获取敏感数据或执行未经授权的操作。
以下是SQL注入攻击的典型类型和示例:1.带内SQL注入(In-BandSQLi):攻击者通过同一通信通道注入SQL代码并获取结果。
例如,在登录表单的用户名字段中输入“admin'--”,如果主SQL语句为`SELECT*FROMusersWHEREusername='admin'--`,则实际执行的SQL语句为`SELECT*FROMusersWHEREusername='admin'`,跳过密码检查。
2.基于错误的SQL注入:攻击者故意创建错误的SQL查询并从数据库错误信息中获取信息。
如果您输入可能导致数据库错误的查询,例如“SELECT*FROMusersWHEREusername='admin'ANDpassword='password';”,数据库版本将显示在错误消息中。
3.基于内容的SQL盲注(BlindSQLi):通过修改查询并观察页面内容的变化来确定注入的SQL查询是否执行成功。
例如,假设在线商店网站有一个搜索框,并且用户输入产品名称查询,则主要SQL代码可能是“SELECT*FROMproductsWHEREproduct_nameLIKE'%search%”。
攻击者尝试输入“UNIONSELECT1,2.,3`.如果页面显示预期的异常信息,则说明注入成功。
4.基于时间的SQL盲注(Time-basedBlindSQLi):通过观察数据库响应时间来推断查询的正确性。
例如,输入“SELECTSLEEP(5)”,如果页面响应延迟5秒,则表示条件为真。
5.联合查询SQL注入(UnionBasedSQLi):使用UNIONSQL运算符,执行额外的选择查询并将结果合并到原始查询输出中。
例如,输入“UNIONSELECTcolumn1,column2FROMtable2”可以返回两个表的数据。
6.Stackedqueries(或Piggy-BackedQueries):将多个SQL命令注入到单个查询语句中的技术。
例如,在查询语句后添加“DELETEFROMusers”即可对同一查询执行多个操作。
7.Base64编码的SQL注入:攻击者提交Base64编码的SQL。
如果应用程序在处理之前没有对其进行解码和验证,恶意代码就会被执行。
例如,编码“DROPTABLEusers;»并提交。
8.二阶SQL注入:有两个阶段:注入和执行。
在注入阶段,提交包含恶意代码的数据;在执行阶段,当应用程序使用该数据时执行恶意代码。
例如,当管理员查询用户列表时,应用程序会构造一个SQL查询。
如果处理不当,恶意数据可能会被执行。
9.Out-of-bandSQLi:在两个不同的通道上运行,用于发送攻击代码和接收数据。
依赖数据库执行特定操作,例如将数据发送到攻击者控制的服务器。
SQL注入攻击的主要目标是获取敏感数据、执行未经授权的操作或控制系统。
有不同的目的,攻击者可以使用上面提到的不同类型的SQL注入技术。
了解这些类型的攻击可以帮助您加强数据库安全策略,并使用参数化查询、输入验证和安全编码实践来防范SQL注入攻击。

Mybatis-plussql注入及防止sql注入详解

SQL注入是一种攻击技术,用于更改数据驱动应用程序中的查询结果。
恶意SQL语句被注入到正在执行的SQL语句中,例如“OR1=1”或“;droptablesys_user;”。
Mybatis使用#{}和${}来防止SQL注入。

当使用`#{}`时,Mybatis会将每个`#`标记符号解析为参数占位符,并将变量作为参数传递。
这样就避免了修改SQL语句,有效防止SQL注入。
但“Statement”每次执行SQL时都要进行解析和编译,效率不如“PreparedStatement”。
后者在编译时将“#”标记替换为参数,提高了执行效率,降低了注入风险。

预编译执行代码文本替换,处理“#include”、“#define”等指令,并为编译做好准备。
SQL注入发生在运行时,与预编译过程无关。

Mybatisplus使用PaginationInterceptor来处理物理分页,但动态查询无法预编译,这会在Orderby场景中引入SQL注入风险。
必须使用PaginationInnerInterceptor设置com.baomidou.mybatisplus.extension.plugins.pagination.page对象属性并直接使用SQL拼接对排序列名进行安全检查。

使用分页的控制器会检查传入的分页参数以确定是否存在非法字符,以防止SQL注入。
例如,检查“ascs”和“descs”字段是否存在非法字符,以确保参数安全。
如果参数包含无效的列名,例如“create_timeaaaa”,会返回错误消息。

MybatisPlus实现自定义全局SQL注入策略的步骤如下:

在映射器中定义业务方法。

实现自己的`MySqlInjector`类并自定义注入规则。

在全局策略中设置自定义的“MySqlInjector”。

XML配置的示例实现。
具体实现步骤和代码编写请参考MybatisPlus官方文档。

SQL注入——SQL语句

SQL注入是一种常见的安全漏洞,攻击者可以通过它获取数据库中的敏感信息。
下面,我们将一步步分析一个SQL注入的实例,了解其操作流程。
首先,输入ID=1,我们可以得到ID、FirstName和Surname信息。
这表明在特定参数位置存在可利用的注入点。
输入ID=’,不会出现错误。
初步判断这个注入点对输入的长度不敏感。
再尝试输入1or1=1,但未能成功遍历数据表。
这表明我们可能面临数字注入。
猜测字符注入,输入1'或'1'='1,然后成功遍历数据库中的所有内容,成功展示了字符注入的威力。
接下来我们使用orderby[num]语句进行测试,输入1'orderby1--(加空格)测试查询结果长度,继续输入1'orderby2--(空格)和1'orderby3--(空格),并判断查询结果为2列。
使用内置函数database()、user()和version()获取数据库帐户名、数据库名称和版本信息。
通过1'and1=2unionselect1,2--(空格)注入,可以读取到查询结果第一列和第二列的值。
使用1'and1=2unionselectuser(),database()注入,数据库用户为root@localhost,数据库名称为dvwa。
注入1'and1=2unionselectversion(),database()即可获取数据库版本信息和数据库名称。
注入1'and1=2unionselect1,@@global.version_compile_osfrommysql.user获取操作系统信息。
查询mysql数据库中所有数据库和表时,注入1'and1=2unionselect1,schema_namefrominformation_schema.schemata尝试获取信息,但结果返回错误。
通过注入1'andexists(select*fromusers),成功将dvwa数据库中的表名猜为users。
注入1'andexists(select[tablename]fromusers)尝试猜测字段名称。
特定于字段名称,例如first_name和last_name。
最后注入1'and1=2unionselectfirst_name,last_namefromusers即可获取表中的字段内容。
在实际渗透环境中,这一步对于查找存储管理员账户信息和密码至关重要。