一、前言

在项目中的需要增加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开源库的研究总结相关推荐

  1. Android 内存泄漏检测开源库LeakCanary 研究

    1. Android 内存空间不足会引发的问题 1.1 异常 1.2 卡顿 1.3 从 Java 堆内存超限这个问题开始 2. 内存优化着手点 2.1 检测 RAM usage 2.2 进程 2.3 ...

  2. 南加州大学等开源元学习研究库learn2learn

    近日,南加州大学单位等开源了一个元学习研究库learn2learn,旨在促进越来越多的元学习的研究,该库基于PyTorch,文档完善,样例丰富,是从事相关研究值得参考的开源库. 相关论文: learn ...

  3. 常用C/C++开源库

    1. 框架 Apache C++ Standard Library : 是一系列算法,容器,迭代器和其他基本组件的集合 ASL : Adobe源代码库提供了同行的评审和可移植的C++源代码库. Boo ...

  4. Google重磅发布开源库TFQ,快速建立量子机器学习模型

    整理 | 弯月 编辑 | 郭芮 出品 | AI科技大本营(ID:rgznai100) 近日,Google 与滑铁卢大学.大众汽车等联合发布 TensorFlow Quantum(TFQ),一个可快速建 ...

  5. 基于Go的语义解析开源库FMR,“屠榜”模型外的NLP利器

    (由AI科技大本营付费下载自视觉中国) 作者 | 刘占亮 一览群智技术副总裁 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100) 如何合理地表示语言的内在意义?这是自然语言处理业 ...

  6. 集合70多种推荐算法,东北大学老师用Java写了一个开源库,在GitHub上收获近1500个Star...

     [AI科技大本营导读]在经过一年多的开发工作之后,LibRec 3.0 版本终于发布了.LibRec 是一个基于 Java 的开源算法工具库,覆盖了 70 余个各类型推荐算法,可以有效解决评分预测 ...

  7. Kimera:一个基于度量语义的SLAM开源库

    标题:Kimera:an Open-Source Library for Real-Time Metric-Semantic Localization and Mapping 作者:Antoni Ro ...

  8. 伯乐:一个易用、强大的PyTorch推荐系统开源库

    来源:RUC AI Box 本文约3500字,建议阅读5分钟 4类53个模型,27个数据集,又一推荐系统神器! [ 导读 ]是否还在为推荐模型无法复现而怀疑人生?是否还在为不知如何入门推荐而踌躇不前? ...

  9. C++开源库,欢迎补充。

    C++在"商业应用"方面,曾经是天下第一的开发语言,但这一桂冠已经被java抢走多年.因为当今商业应用程序类型,已经从桌面应用迅速转移成 Web应 用.当Java横行天下之后,MS ...

最新文章

  1. python的id方法_python中id()函数的实用研究实例
  2. 树莓派python实例_树莓派3 搭建 django 服务器的实例
  3. IOS贝塞尔曲线圆形进度条和加载动画
  4. 全球及中国页岩气市场供需前景与投资盈利分析报告2021版
  5. MongDB集合文档操作符
  6. 国科大prml--SVM
  7. MVC4发布到IIS7报404错误
  8. Oracle迁移PostgreSQL经验总结
  9. SCWS分词扩展在UNIX/LINUX下的安装方法
  10. 拓端tecdat|R语言向量自回归模型(VAR)及其实现
  11. perl脚本GET系统命令执行
  12. 我的世界开服java不是内部或外部命令_java不是内部或外部指令 也不是可运行程序 minecraft服务器...
  13. Contiki-NG在GD32F310的移植
  14. 【4 于博士Cadence SPB15.7 快速入门视频】建立不规则SOIC封装NE5532
  15. qrcode生成一个带有图片的二维码
  16. 助力企业设备上云,京东云上物联网产品重磅发布
  17. python脚本修改hosts文件
  18. My97 DatePicker普通调用
  19. 玳鸽信息:近一年多数产业端对于转型升级有了明确的需求 | FBEC 2020特别策划...
  20. 一种近红外I区荧光染料ICG-CBT 主要应用领域,是药品监督管理局(FDA)批准的体内应用染料

热门文章

  1. 切点、切面:@Aspect、@PointCut相关的个人总结
  2. Python 测试开发教程
  3. linux-搜索查找类
  4. 如何设定vs2012用linux文件格式,Visual Studio 2012发布网站详细步骤
  5. 防火墙简介(二)——firewalld防火墙
  6. 电脑组装与维护教程_男,78年,懂电脑组装、运营维护青岛地区寻找电脑维护合适岗位...
  7. MySQL之日期时间处理函数_MySQL之日期时间处理函数
  8. c语言获取按键痕迹,c语言获得键盘的按键
  9. java生成数据插入hbase_hbase实战之javaAPI插入数据
  10. 深圳python指南_深圳Pythonlevel7