日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

libinjection开源库的研究总结

發布時間:2024/1/23 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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开源库的研究总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。