2023-10-22 06:08:26
Android APP中SQL注入漏洞主要涉及利用未正确验证的用户输入,通过构造恶意SQL语句来操纵数据库查询,从而获取、篡改或删除敏感数据。 以下从原理、分类、技巧及常见测试点展开介绍:
一、SQL注入原理攻击者通过操纵用户输入数据,将恶意SQL语句插入应用程序的查询中,使后端数据库执行非预期操作。其核心条件是应用程序未对用户输入进行充分验证或转义。例如,在登录表单中输入恶意字符串,可能绕过身份验证或直接获取数据库内容。

根据页面反馈方式,SQL注入可分为以下四类:
联合查询注入
原理:通过UNION拼接SELECT语句,合并多个查询结果集。当原始查询结果为空时,结果由注入的SELECT语句控制。
步骤:
使用ORDER BY判断列数。
构造条件使原始查询结果为空(如AND 1=0)。
通过UNION SELECT注入目标查询,例如:
UNION SELECT 1,database(),user() -- 爆数据库名和用户名UNION SELECT 1,2,group_concat(table_name) FROM information_schema.tables WHERE table_schema=database() -- 爆表名适用场景:页面有回显(如搜索结果、错误信息中直接显示查询内容)。
报错注入
原理:利用数据库函数(如extractvalue()、updatexml())处理非法数据时触发的错误,从错误信息中提取数据。
示例:
extractvalue(1,concat(0x7e,(SELECT user()),0x7e)) -- 输出用户名的前32位updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) -- 输出数据库名的前32位适用场景:页面无回显但返回错误信息。
布尔盲注
原理:通过页面返回的“真”或“假”(如成功/失败提示)逐步推断数据库信息。
步骤:
判断数据库名长度:length(database())。
逐字符猜解ASCII码:ascii(substr(database(),s,1))=可用ASCII码值。
示例:
ascii(substr((SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 3,1),s,1))=可用ASCII码值 -- 猜解第4个表名适用场景:页面无回显且无错误信息,但能区分“真/假”状态。
时间盲注
原理:通过页面响应延迟判断信息,利用IF()函数和延时函数(如sleep())构造条件语句。
示例:
IF(length(database())=数字,sleep(2),0) -- 判断数据库长度IF(ascii(substr(database(),s,1))=可用ASCII码值,sleep(2),0) -- 逐字符猜解数据库名适用场景:布尔盲注无法区分“真/假”时(如返回内容始终相同)。
重言式攻击
原理:通过注入恒真条件(如OR 1=1)绕过身份验证。
示例:
SELECT * FROM users WHERE username='admin' OR '1'='1' -- AND password='1234'Piggy-backed查询
原理:使用分号(;)注入额外查询,例如删除表:
SELECT pass FROM users WHERE username='user1'; DROP TABLE users --联合查询注入
原理:在原始查询中插入UNION SELECT,例如获取管理员信息:
SELECT * FROM users WHERE username='1111' UNION SELECT * FROM members WHERE member_id='admin' -- AND password='1234'存储过程攻击
原理:调用数据库存储过程执行恶意操作,例如关闭数据库:
SELECT Username FROM UserTable WHERE user_name='user1' AND pass=''; SHUTDOWN;交替编码
原理:使用十六进制、Unicode等编码绕过输入过滤,例如:
SELECT accounts FROM users WHERE login='admin' AND pin=0; EXEC(CHAR(0x73687574646F776E)) -- 执行关机命令
总结:Android APP中的SQL注入漏洞主要通过未验证的用户输入触发,攻击者可利用联合查询、报错、盲注等技术窃取或篡改数据。开发中应采用参数化查询、输入过滤等措施防御,测试时需重点关注用户交互频繁的功能点。