libinjection开源库的研究总结
一、前言
在项目中的需要增加detectSQLi和detectXSS方法,故研究一下libinjection中的源码结构。
如下图所示,在规则引擎中调用了detectSQLi之后,会跑到libinjection中执行libinjection_sqli,然后执行libinjection_sqli_init()初始化libinjection_sqli_state结构体,回调函数赋值给结构体中的lookup函数指针成员,接着调用libinjection_is_sqli()函数并返回结果:
二、结构流程
2.1 libinjection_is_sqli()函数结构
|->libinjection_is_sqli()|->libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_NONE | FLAG_SQL_ANSI);if|->sql_state->lookup() //回调函数是libinjection_sqli_lookup_word()else|->reparse_as_mysql(sql_state)else|->libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_NONE | FLAG_SQL_MYSQL);|->sql_state->lookup() |->libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_SINGLE | FLAG_SQL_ANSI);if|->sql_state->lookup()else|->reparse_as_mysql(sql_state)else|->libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_SINGLE | FLAG_SQL_MYSQL);|->sql_state->lookup()if|->libinjection_sqli_fingerprint(sql_state,FFLAG_QUOTE_SINGLE | FLAG_SQSL_MYSQL);else|->sql_state->lookup()
2.2 拿其中的几个函数来说明
|->libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_NONE | FLAG_SQL_ANSI);|->libinjection_sqli_reset(sql_state, flags);|->libinjection_sqli_init(sf, sf->s, sf->slen, flags) //初始化libinjection_sqli|->|->libinjection_sqli_fold();|->st_clear(&last_comment); //clear last_comment变量|->libinjection_sqli_tokenize(sf) |->parse_string_core() //处理字符串|->is_backslash_escaped() //判断是否是转义|->is_double_delim_escaped() //判断是否是两个相同的字符转义|->fnptr=char_parse_map[ch];(*fnptr)(sf);//在循环中进行对应的parse_xxx回调函数,表放在代码框下面|->接下来就是不断的匹配string的特征为相应的字母,匹配表放在代码框下面|->syntax_merge_words(sf, &sf->tokenvec[left], &sf->tokenvec[left+1]) //查看是否两个tokens可以合并|->sf->lookup(sf, LOOKUP_WORD, tmp, sz3) //接下来有此函数介绍
if|->sql_state->lookup() //回调函数是libinjection_sqli_lookup_word()|->libinjection_sqli_check_fingerprint(sql_state) //通过黑名单和不是白名单两方面判断|->libinjection_sqli_blacklist(sql_state)|->is_keyword()|->bsearch_keyword_type(key, len, sql_keywords, sql_keywords_sz) //从sql_keywords全局变量中匹配|->libinjection_sqli_not_whitelist(sql_state)|->bsearch_keyword_type(str,len, sql_keywords, sql_keywords_sz) //从sql_keywords全局变量中进行匹配
else|->reparse_as_mysql(sql_state)
else|->libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_NONE | FLAG_SQL_MYSQL);
截图为特征值匹配的sqli_token_types表:
上图中有个对应表,参考http://www.freebuf.com/column/170926.html,也可以看每一个parse_xxx的具体实现:
'k' /*例如COLUMN,DATABASES,DEC等会被识别为该值*/
'U' /*EXCEPT,INTERSECT,UNION等会被识别为该值*/
'B' /*GROUP BY,LIMIT,HAVING*/
'E' /*INSERT,SELECT,SET*/
't' /*SMALLINT,TEXT,TRY*/
'f' /*UPPER,UTL_HTTP.REQUEST,UUID*/
'n' /*WAITFOR,BY,CHECK*/
'1' /*所有数字会被识别为1*/
'v' /*CURRENT_TIME,LOCALTIME,NULL*/
's' /*单引号和双引号*/
'o' /*+=,-=,!>*/
'&' /*&&,AND,OR*/
'c' /*注释符*/
'A' /* COLLATE*/
'('
')' /* not used? */
'{'
'}'
'.'
','
':'
';'
'T' /* TSQL start */ /*DECLARE,DELETE,DROP*/
'?'
'X' /* unparsable, abort */ /* “/*!*/” */
'F' /* not really a token */
'\\'
注册相关回调函数的表如下:
2.3 举例说明:
我们输入SQL注入的检测语句
' and 1 = 1
libinjection会将其转换为s&1,其中单引号依据定义被转换为s,and被转换为&,数组被转换为1
' UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL--
libinjection会将其转换为sUEvc,其中单引号依据定义被转换为s,UNION ALL被转换为U,SELECT被转换为E,NULL被转换为v,后面相同的NULL合并为一个v,--注释符被转换为c
libinjection在转换完后,通过二分查找算法对内置的8000多个特征进行匹配,匹配到则将SQL注入识别特征复制进fingerprint变量并返回。
三、libinjection_xss部分
在libinjection_xss函数中分别对
DATA_STATE,VALUE_NO_QUOTE,VALUE_SINGLE_QUOTE,VALUE_DOUBLE_QUOTE,VALUE_BACK_QUOTE)的状态进行libinjection_is_xss()函数判断
|->libinjection_is_xss()|->libinjection_h5_init() //初始化state回调函数|->h5_state_data|->h5_state_eof //当<符号不存在的时候|->h5_state_tag_open //当<符号存在的时候|->h5_state_markup_declaration_open(hs) //if ch == CHAR_BANG|->h5_state_doctype(hs);//DOCTYPE类型|->h5_state_cdata(hs); //[[cdata类型|->h5_state_comment(hs); |->h5_state_end_tag_open(hs) //else if (ch == CHAR_SLASH)|->h5_state_bogus_comment(hs) //else if (ch == CHAR_QUESTION)|->h5_state_bogus_comment2(hs) //else if(ch == CHAR_PERCENT) 符号%|->h5_state_tag_name(hs) //大小写英文字母和CHAR_NULL情况|->h5_is_white(ch) //如果遇到空白符号|->h5_state_self_closing_start_tag; //如果遇到/符号|->h5_state_data //如果遇到>符号|->h5_state_before_attribute_name|->h5_skip_white(hs)|->h5_state_self_closing_start_tag(hs) //case CHAR_SLASH|->h5_state_data //case CHAR_GT|->h5_state_attribute_name(hs) //default|->h5_state_attribute_value_single_quote|->h5_state_attribute_value_quote(hs, CHAR_SINGLE)|->h5_state_eof //idx == NULL|->h5_state_after_attribute_value_quoted_state //idx != NULL|->h5_is_white(ch) //if|->h5_state_self_closing_start_tag(hs) //else if (ch == CHAR_SLASH)|->h5_state_data //if(ch == CHAR_GT)|->h5_state_before_attribute_name(hs) //else|->h5_state_data //else if(ch == CHAR_GT)|->h5_state_before_attribute_name(hs) //else|->h5_state_attribute_value_double_quote|->h5_state_attribute_value_quote(hs, CHAR_DOUBLE)|->h5_state_attribute_value_back_quote|->h5_state_attribute_value_quote(hs, CHAR_TICK)|->while(libinjection_h5_next(&h5)) //循环判断|->is_black_tag(h5.token_start, h5.token_len) //判断是否是黑名单tag,tag列表在代码框下面|->is_black_attr(h5.token_start, h5.token_len) //判断是否是黑名单attr,attr列表在代码框下面|->is_black_url(h5.token_start, h5.token_len) //下面四个url后缀变量在代码框下面|->htmlencode_startwith(data_url, s, len)|->htmlencode_startswith(viewsource_url, s, len)|->htmlencode_startswith(javascript_url, s, len)|->htmlencode_startswith(vbscript_url, s, len)
匹配成功则为xss攻击。
libinjection开源库的研究总结相关推荐
- Android 内存泄漏检测开源库LeakCanary 研究
1. Android 内存空间不足会引发的问题 1.1 异常 1.2 卡顿 1.3 从 Java 堆内存超限这个问题开始 2. 内存优化着手点 2.1 检测 RAM usage 2.2 进程 2.3 ...
- 南加州大学等开源元学习研究库learn2learn
近日,南加州大学单位等开源了一个元学习研究库learn2learn,旨在促进越来越多的元学习的研究,该库基于PyTorch,文档完善,样例丰富,是从事相关研究值得参考的开源库. 相关论文: learn ...
- 常用C/C++开源库
1. 框架 Apache C++ Standard Library : 是一系列算法,容器,迭代器和其他基本组件的集合 ASL : Adobe源代码库提供了同行的评审和可移植的C++源代码库. Boo ...
- Google重磅发布开源库TFQ,快速建立量子机器学习模型
整理 | 弯月 编辑 | 郭芮 出品 | AI科技大本营(ID:rgznai100) 近日,Google 与滑铁卢大学.大众汽车等联合发布 TensorFlow Quantum(TFQ),一个可快速建 ...
- 基于Go的语义解析开源库FMR,“屠榜”模型外的NLP利器
(由AI科技大本营付费下载自视觉中国) 作者 | 刘占亮 一览群智技术副总裁 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100) 如何合理地表示语言的内在意义?这是自然语言处理业 ...
- 集合70多种推荐算法,东北大学老师用Java写了一个开源库,在GitHub上收获近1500个Star...
[AI科技大本营导读]在经过一年多的开发工作之后,LibRec 3.0 版本终于发布了.LibRec 是一个基于 Java 的开源算法工具库,覆盖了 70 余个各类型推荐算法,可以有效解决评分预测 ...
- Kimera:一个基于度量语义的SLAM开源库
标题:Kimera:an Open-Source Library for Real-Time Metric-Semantic Localization and Mapping 作者:Antoni Ro ...
- 伯乐:一个易用、强大的PyTorch推荐系统开源库
来源:RUC AI Box 本文约3500字,建议阅读5分钟 4类53个模型,27个数据集,又一推荐系统神器! [ 导读 ]是否还在为推荐模型无法复现而怀疑人生?是否还在为不知如何入门推荐而踌躇不前? ...
- C++开源库,欢迎补充。
C++在"商业应用"方面,曾经是天下第一的开发语言,但这一桂冠已经被java抢走多年.因为当今商业应用程序类型,已经从桌面应用迅速转移成 Web应 用.当Java横行天下之后,MS ...
最新文章
- python的id方法_python中id()函数的实用研究实例
- 树莓派python实例_树莓派3 搭建 django 服务器的实例
- IOS贝塞尔曲线圆形进度条和加载动画
- 全球及中国页岩气市场供需前景与投资盈利分析报告2021版
- MongDB集合文档操作符
- 国科大prml--SVM
- MVC4发布到IIS7报404错误
- Oracle迁移PostgreSQL经验总结
- SCWS分词扩展在UNIX/LINUX下的安装方法
- 拓端tecdat|R语言向量自回归模型(VAR)及其实现
- perl脚本GET系统命令执行
- 我的世界开服java不是内部或外部命令_java不是内部或外部指令 也不是可运行程序 minecraft服务器...
- Contiki-NG在GD32F310的移植
- 【4 于博士Cadence SPB15.7 快速入门视频】建立不规则SOIC封装NE5532
- qrcode生成一个带有图片的二维码
- 助力企业设备上云,京东云上物联网产品重磅发布
- python脚本修改hosts文件
- My97 DatePicker普通调用
- 玳鸽信息:近一年多数产业端对于转型升级有了明确的需求 | FBEC 2020特别策划...
- 一种近红外I区荧光染料ICG-CBT 主要应用领域,是药品监督管理局(FDA)批准的体内应用染料
热门文章
- 切点、切面:@Aspect、@PointCut相关的个人总结
- Python 测试开发教程
- linux-搜索查找类
- 如何设定vs2012用linux文件格式,Visual Studio 2012发布网站详细步骤
- 防火墙简介(二)——firewalld防火墙
- 电脑组装与维护教程_男,78年,懂电脑组装、运营维护青岛地区寻找电脑维护合适岗位...
- MySQL之日期时间处理函数_MySQL之日期时间处理函数
- c语言获取按键痕迹,c语言获得键盘的按键
- java生成数据插入hbase_hbase实战之javaAPI插入数据
- 深圳python指南_深圳Pythonlevel7