SQL注入与libinjection分析(5)源码分析之指纹函数fingerprint和查找函数lookup_word剖析
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
1. libinjection_sqli_fingerprint
/* 重新置位 sql_state 因为,sql注入三种形式都调用此接口,每次调用都重新置位 */
libinjection_sqli_reset
/*
libinjection_sqli_fold
这个函数就是计算字符的指纹/令牌
返回值: left 是已经折叠或处理的token数量
1. 跳过最初的注释|左括号|一元运算符
2. 如果全是注释|左括号|一元运算符 则返回0 否则 执行下一个字符
3. 循环 while(1)
3.1 如果处理的指纹超过 MAX_TOKENS >= 5个,则特殊处理
pos>5 令tokenvec[5]覆盖tokenvec[1] 再使得pos=2;left=0 //就是假设未指纹化 并且pos从2开始
pos=5 只令pos=1;left=0 //就是假设未指纹化 并且pos从1开始
3.2 如果 left >= 5 ,那么重头开始 , left = pos
3.3 处理两个指纹的情况
上一个token.type不等于TYPE_NONE;并且pos<=5;并且pos - left < 2,则依次往后计算指纹
3.3.1 去除重复字符,如 ss->s
3.3.2 语法合并 如 "UNION" + "ALL" -> "UNION ALL"
3.3.3 处理 TSQL 相关, IN/NOT IN 操作
3.4 如果两个指纹未匹配,则处理三个指纹的情况
按照各个情况进行处理
4. 如果有4个或更多指纹+注释再处理
*/
libinjection_sqli_fold
/*
libinjection_sqli_tokenize
这个函数就是计算具体每个字符的指纹/令牌
返回值: 是否转化成功
1. 如果是字符串开始,并且是单引号或者双引号模式,则假定以引号开头
2. 依次取输入sql字符串的每个字符,
然后通过 char_parse_map 查找对应的解析函数,进行解析,得到指纹/令牌
注意: 这里面的有些函数处理还是很复杂的
比如 parse_number 需要明白sql注入的业务才好看懂代码
*/
libinjection_sqli_tokenize
2. libinjection_sqli_lookup_word
/*
判断黑名单和非白名单
*/
libinjection_sqli_check_fingerprint
/* 依次取指纹字符,进行拼接,然后 进行二分查找 is_keyword */
libinjection_sqli_blacklist
/*
减少误报的处理:
处理2个指纹的情况:注释是否包含sp_password;1 union;#注释;1c…/x;
处理3,4,5个指纹的情况
*/
libinjection_sqli_not_whitelist
/*
判断str是否命中指纹库sql_keywords 中的指纹
这里使用二分查找 bsearch_keyword_type
*/
bsearch_keyword_type