SQL Injection

SQL 注入

本质原因:允许用户拼接 SQL 语句并执行。

步骤:

  1. 找注入点,如登录后台、查询点、通过 id 加载的网页等
  2. 判断数据库信息,如 MySQL , SQL Server 等
  3. 拼接 SQL 语句

SQL 注入学习:

  1. SQLi-Labs1

mybits 尽量使用 #,若使用 $ 可导致 SQL 注入2,如

@Select("select * from users where username = '${username}'")
List<User> findByUserNameVuln01(@Param("username") String username);

模糊查询使用 LIKE concat(‘%’,#{_parameter}, ‘%’) ,如果是 LIKE '%{_parameter}%' 会让攻击者可以闭合引号实现 SQL 注入。

整型注入

?id=1 or 1=1 #

字符型注入

?id=1' or '1'='1 -- x

需要注意拼接引号,使得语句完整闭合,可以使用注释符、引号、括号、转义符等。

盲注

通过一些间接线索判断执行结果,如时间。

布尔型:只有两种结果,要么成功,要么失败。

时间型:使用特定的函数如 sleep, benchmark 等判断成功或失败。

判断字段数: order by <int> ,超过哪个数字就不正常时说明就有多少个字段。

显注

执行 SQL 语句后会显示相应的结果或错误信息。可以是带内方式,通过 错误信息 或 union 子句获取结果;也可以是带外通过控制数据库与外部服务器的连接来获取数据。

SqlMap

Libinjection3

语义分析判别 SQL 注入。

Liblinjection 通过对用户的输入进行词法分析,生成指纹,然后通过二分查找算法,在特征库中进行匹配,匹配到则判定为 SQL 注入。

判别三种情况:

  1. 直接注入
  2. 单引号内注入
  3. 双引号内注入

没有对注释内注入的情况进行处理。

大致流程:

  1. 初始化变量 int issqli; struct libinjection_sqli_state state;
  2. libinjection_sqli_init(&state, input, slen, 0);
  3. 通过 issqli = libinjection_is_sqli(&state); 分析
  4. issqli 为 1 则 strcpy(fingerprint, state.fingerprint); ,否则 fingerprint[0]='\0';
  5. 返回 issqli

Footnotes:

湘ICP备19014083号-1