Android APP漏洞之战——SQL注入漏洞初探

Android APP漏洞之战——SQL注入漏洞初探
最新回答
咸鱼味的猫

2023-10-22 06:08:26

Android APP中SQL注入漏洞主要涉及利用未正确验证的用户输入,通过构造恶意SQL语句来操纵数据库查询,从而获取、篡改或删除敏感数据。 以下从原理、分类、技巧及常见测试点展开介绍:

一、SQL注入原理

攻击者通过操纵用户输入数据,将恶意SQL语句插入应用程序的查询中,使后端数据库执行非预期操作。其核心条件是应用程序未对用户输入进行充分验证或转义。例如,在登录表单中输入恶意字符串,可能绕过身份验证或直接获取数据库内容。

二、SQL注入分类

根据页面反馈方式,SQL注入可分为以下四类:

  1. 联合查询注入

    原理:通过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() -- 爆表名

    适用场景:页面有回显(如搜索结果、错误信息中直接显示查询内容)。

  2. 报错注入

    原理:利用数据库函数(如extractvalue()、updatexml())处理非法数据时触发的错误,从错误信息中提取数据。

    示例

    extractvalue(1,concat(0x7e,(SELECT user()),0x7e)) -- 输出用户名的前32位updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) -- 输出数据库名的前32位

    适用场景:页面无回显但返回错误信息。

  3. 布尔盲注

    原理:通过页面返回的“真”或“假”(如成功/失败提示)逐步推断数据库信息。

    步骤

    判断数据库名长度: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个表名

    适用场景:页面无回显且无错误信息,但能区分“真/假”状态。

  4. 时间盲注

    原理:通过页面响应延迟判断信息,利用IF()函数和延时函数(如sleep())构造条件语句。

    示例

    IF(length(database())=数字,sleep(2),0) -- 判断数据库长度IF(ascii(substr(database(),s,1))=可用ASCII码值,sleep(2),0) -- 逐字符猜解数据库名

    适用场景:布尔盲注无法区分“真/假”时(如返回内容始终相同)。

三、SQL注入技巧
  1. 重言式攻击

    原理:通过注入恒真条件(如OR 1=1)绕过身份验证。

    示例

    SELECT * FROM users WHERE username='admin' OR '1'='1' -- AND password='1234'
  2. Piggy-backed查询

    原理:使用分号(;)注入额外查询,例如删除表:

    SELECT pass FROM users WHERE username='user1'; DROP TABLE users --
  3. 联合查询注入

    原理:在原始查询中插入UNION SELECT,例如获取管理员信息:

    SELECT * FROM users WHERE username='1111' UNION SELECT * FROM members WHERE member_id='admin' -- AND password='1234'
  4. 存储过程攻击

    原理:调用数据库存储过程执行恶意操作,例如关闭数据库:

    SELECT Username FROM UserTable WHERE user_name='user1' AND pass=''; SHUTDOWN;
  5. 交替编码

    原理:使用十六进制、Unicode等编码绕过输入过滤,例如:

    SELECT accounts FROM users WHERE login='admin' AND pin=0; EXEC(CHAR(0x73687574646F776E)) -- 执行关机命令
四、Android APP SQL漏洞常见测试点
  1. 用户登录:输入特殊字符(如单引号')测试是否触发错误或绕过验证。
  2. 充值/提现:修改金额参数为恶意SQL语句,例如1 OR 1=1。
  3. 修改银行卡:在银行卡号字段注入查询,例如123456' UNION SELECT credit_card FROM users --。
  4. 留言反馈:在内容字段插入UNION SELECT查询数据库信息。
  5. 商品购买:修改商品ID参数为恶意语句,例如1 UNION SELECT name,price FROM products WHERE id=2。

总结:Android APP中的SQL注入漏洞主要通过未验证的用户输入触发,攻击者可利用联合查询、报错、盲注等技术窃取或篡改数据。开发中应采用参数化查询、输入过滤等措施防御,测试时需重点关注用户交互频繁的功能点。