SQL注入与libinjection分析(4)源码分析之整体框架解读
SQL注入与libinjection分析系列:
MYSQL命令大全
https://blog.csdn.net/lqy971966/article/details/104922862
SQL注入与libinjection分析(1)SQL注入
https://blog.csdn.net/lqy971966/article/details/105269658
SQL注入与libinjection分析(2)Libinjection
https://blog.csdn.net/lqy971966/article/details/105273753
SQL注入与libinjection分析(3)源码分析之一些重要的结构体说明
https://blog.csdn.net/lqy971966/article/details/106195224
SQL注入与libinjection分析(4)源码分析之整体框架解读
https://blog.csdn.net/lqy971966/article/details/106857168
SQL注入与libinjection分析(5)源码分析之指纹函数fingerprint和查找函数lookup_word剖析
https://blog.csdn.net/lqy971966/article/details/106902216
这篇主要对 libinjection_sqli 函数,即整体框架进行解读,分析。
1. 整体框架解读
libinjection 做了一个假设,它假设黑客只能通过三种方法来进行sql攻击
- 直接注入sql语句
- 在单引号内注入sql
- 在双引号内注入sql
1.1 直接注入sql语句
libinjection_sqli_fingerprint,无引号,标准SQL语法
1.1.1 分析
-
判断用户输入的字符串长度是否合法,为零则返回FALSE。(即没有发现SQL注入)
-
执行SQL注入识别函数(libinjection_sqli_fingerprint,无引号,标准SQL语法),获取字符串识别特征码
2.1 执行结构体内的查询函数(这里为libinjection_sqli_lookup_word,二分查找算法),对比第二步获取的识别特征是否与SQL注入识别特征匹配。
如果第三步发现SQL注入特征匹配结果为真,则返回true,并将SQL注入识别特征匹配到的fingerprint写入结构体,2.2 如果检测失败,则调用reparse_as_mysql()函数判断是否存在“(dash-dash-[notwhite]) 注释”或“’#’ 运算符号”,如果存在则再次执行SQL识别函数(libinjection_sqli_fingerprint,无引号,MYSQL语法),
1.1.2 代码解读
/* 入口 参数:输入字符串,长度 输出指纹结果 */
libinjection_sqli(input, slen, fingerprint)
/*
初始化 libinjection_sqli_state
主要是赋值指纹/令牌查找回调函数 libinjection_sqli_lookup_word
*/
libinjection_sqli_init
/* 判断输入sql语句是不是 sql注入 */
libinjection_is_sqli
/*
执行SQL注入识别函数 libinjection_sqli_fingerprint,
无引号,标准SQL语法
获取字符串识别特征码/令牌
*/
libinjection_sqli_fingerprint(sql_state,
FLAG_QUOTE_NONE | FLAG_SQL_ANSI);
/*
执行结构体内的查询函数 libinjection_sqli_lookup_word
对比获取的识别特征是否与SQL注入识别特征匹配。
*/
sql_state->lookup
/*
如果发现SQL注入特征匹配结果为真,则返回true,
并将SQL注入识别特征匹配到的fingerprint写入结构体
*/
return TRUE;
/*
如果检测失败,则调用 reparse_as_mysql
函数判断是否存在“(dash-dash-[notwhite]) -- 注释”
或“’#’ 运算符号”
*/
reparse_as_mysql
/*
如果存在则再次执行SQL识别函数 libinjection_sqli_fingerprint
无引号,MYSQL语法
*/
libinjection_sqli_fingerprint(sql_state,
FLAG_QUOTE_NONE | FLAG_SQL_MYSQL)
sql_state->lookup
/* 如果发现,则返回true */
return TRUE;
1.2 在单引号内注入sql
libinjection_sqli_fingerprint,单引号,标准SQL语法
1.2.1 分析
如果前面的判断没有返回结果,将扫描参数(即用户输入的字符串)查找是否存在单引号。如果为真接着重复上述检测步骤。
1.2.2 代码解读
/* 如果前面的判断没有返回结果,将扫描参数(即用户输入的字符串)查找是否存在单引号。*/
memchr(s, CHAR_SINGLE, slen)
/*
如果存在则次执行SQL识别函数 libinjection_sqli_fingerprint,
单引号,标准SQL语法
*/
libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_SINGLE | FLAG_SQL_ANSI);
sql_state->lookup
/* 如果发现,则返回true */
return TRUE;
/*
如果检测失败,则调用 reparse_as_mysql 函数判断
是否存在“(dash-dash-[notwhite]) -- 注释”或“’#’ 运算符号”
*/
reparse_as_mysql
/*
如果存在则再次执行SQL识别函数 libinjection_sqli_fingerprint,
单引号,MYSQL语法
*/
libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_NONE | FLAG_SQL_MYSQL)
sql_state->lookup
/* 如果发现,则返回true */
return TRUE;
1.3 在双引号内注入sql
libinjection_sqli_fingerprint,双引号,标准SQL语法
1.3.1 分析
- 如果前面的判断依旧没有返回结果,将扫描参数(即用户输入的字符串)查找是否存在双引号。如果为真则接着执行SQL注入识别函数
(libinjection_sqli_fingerprint,双引号,MYSQL语法) - 同时执行结构体的分析函数(libinjection_sqli_lookup_word,二分查找算法)进行特征匹配检测结果为真,则返回true,并将SQL注入识别特征匹配到的fingerprint写入结构体
1.3.2 代码解读
/* 如果前面的判断没有返回结果,将扫描参数(即用户输入的字符串)查找是否存在双引号。*/
memchr(s, CHAR_DOUBLE, slen)
/*
如果存在则次执行SQL识别函数 libinjection_sqli_fingerprint,
双引号,标准SQL语法
*/
libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_DOUBLE | FLAG_SQL_ANSI);
sql_state->lookup
/* 如果发现,则返回true */
return TRUE;
参考
源码托管在在github上:
https://github.com/Audi-1/sqli-labs
https://zhuanlan.zhihu.com/p/44292411
https://zhuanlan.zhihu.com/p/44537204
https://www.anquanke.com/post/id/86097