第24天
SQL注入原理
基于攻击者向应用程序输入字段中插入恶意的SQL代码,这些输入最终会被应用程序未经适当清洁或验证直接传递给数据库执行。当这些恶意输入与应用程序的原始SQL语句结合时,它们可以修改原始SQL查询的意图,允许攻击者执行未授权的数据库操作。
常见的Payload示例
假设一个网站有一个登录表单,后端代码直接将用户输入的用户名和密码拼接到SQL查询中,以验证用户。在没有适当防护的情况下,攻击者可以尝试以下payload:
' OR '1'='1
后端代码:
SELECT * FROM users WHERE username = '$username' AND password = '$password';
攻击者将上述payload作为用户名或密码输入时,最终的SQL查询可能变为:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';
这里的 ‘1’=‘1’ 总是为真,导致这个查询条件忽略了原始的用户名和密码检查,可能返回数据库中的所有用户信息。
经常在能够输入数据的地方进行SQL注入,包括url传参与表单等
SQL注入攻击流程
- 分析网站数据库类型
- 根据数据库类型选择对应思路
Access数据库
字典猜解
payload示例
UNION SELECT 1,2, admin, 4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 FROM admin
UNION操作符
在SQL中用于合并两个或多个SELECT语句的结果集,并且删除重复的记录。每个SELECT语句内部必须有相同数量的选取列,列也必须有相似的数据类型。同时,每个SELECT语句中的列的顺序也必须一致。
这里的意图是将原查询的结果集与一个新的SELECT查询的结果集合并。新的SELECT查询尝试从admin表中选取admin列以及一系列数字作为填充数据,以确保列的数量与原查询匹配。这种技巧常用于探测或抽取特定表的数据。
注意:这里需要存在admin表,确定数据库的表名和列名通常通过字典猜解获得
偏移注入
偏移注入适用于知道表名,但不知道列名的时候。字段就是列
- 首先是order by查询字段数,
- 再确定表名
- 再select 1,2,4,5,admin.* from admin查询字段数
payload示例:
127.0.0.1/asp/index.asp?id=1513 union select 1,2,3,4,5,6,7,8,9,10,*from(admin as a inner join admin as b on a.id = b.id)
MySQL
MYSQL5.o以上版本:自带的数据库名information schema
information_schema:存储数据库下的数据库名及表名,列名信息的数据库
获取相关数据:
- 数据库版本-看是否符合information_schema查询-version ()
- 数据库用户-看是否符合RooT型注入攻击-user ()
- 当前操作系统-看是否支持大小写或文件路径选择-@@version compile_os-win
- 数据库名字-为后期猜解指定数据库下的表,列做准备-database ( )
payload示例:
?id=-2 UNION SELECT version(), 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17
version() 是一个数据库函数,用于返回数据库的版本信息。
后面跟随的数字2, 3, …, 17是为了匹配原查询中的列数,以确保UNION操作可以成功执行。这些数字本身通常不重要,只是占位符,用于满足UNION查询要求的列数一致性。
攻击目的
攻击者的目的是绕过正常的应用逻辑,通过注入UNION SELECT查询来获取数据库的版本信息,这可能是进一步攻击的跳板,因为知道了数据库的具体版本后,攻击者可以针对该版本已知的漏洞进行定向攻击。