SQL Injection
SQL 注入
本质原因:允许用户拼接 SQL 语句并执行。
步骤:
- 找注入点,如登录后台、查询点、通过 id 加载的网页等
- 判断数据库信息,如 MySQL , SQL Server 等
- 拼接 SQL 语句
SQL 注入学习:
- 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 注入。
判别三种情况:
- 直接注入
- 单引号内注入
- 双引号内注入
没有对注释内注入的情况进行处理。
大致流程:
- 初始化变量
int issqli; struct libinjection_sqli_state state;
libinjection_sqli_init(&state, input, slen, 0);
- 通过
issqli = libinjection_is_sqli(&state);
分析 issqli
为 1 则strcpy(fingerprint, state.fingerprint);
,否则fingerprint[0]='\0';
- 返回
issqli