上下文無關語法
懶人在思考?WAF研究中...
- 什麼是漢語?是漢字+語法嗎?
- 什麼是英語?是單詞+語法嗎?
我們能夠看懂這篇文章,是因為我們認識裡面每一個漢字,理解這門語言的語法。那麼我們能不能定義一門攻擊語言?
- 比如XSS攻擊語言:JS token + JS語法?
- 比如PHP攻擊語言:PHP token + PHP語法?
當我們看到一個字元串,它是XSS攻擊語言,那麼我們就稱這個字元串是XSS攻擊串!那麼如何判斷一個字元串是XSS攻擊語言呢?這就是我們要做的XSS語義引擎!為瞭解決這個問題,我們引入一個類似的問題:如何判斷一個字元串,它符合C語言語法?答案呼之欲出:編譯原理!我們要解決的問題是判斷XSS攻擊!我們踏入的第一個坑是上下文無關語法!非安全研究人員可以停止閱讀了,天書預警!
上下文無關語法
上下文無關語法G:終結符集合T + 非終結符集合N + 產生式集合P + 起始符號S
由語法G推倒出來的所有句子的集合稱為G語言!由XSS攻擊語法推倒出來的所有句子的集合稱為XSS攻擊語言。
S -> AB
A -> aA | ε
B -> b | bB
產生式
(Production):形如S -> AB
,右側可以替換左側非終結符
(Nonterminal):產生式左側符號,SAB終結符
(Terminal):產生式右側符號,token (a,b,ε...)起始符
(Start symbol):所有句子都以它為起點產生,S展開
(expand):將P(A->u )應用到符號串vAw中,得到新串vu w摺疊
(reduce):將P(A->uu )應用到符號串vuu w中,得到新串vAw推導
(derivate):符號串u 應用一些列產生式,變成符號串v ,則u =>v上下文無關語法
G:4元組:(P,N,T,S)解析
(parse):由T 推導得到句子s的全過程
A:{ε ,a ,aa ,aaa , ...}
B:{b ,bb ,bbb , ...}
S:{b ,bb ,ab ,abb ,aab ,aabb ,...}
看看S是不是可以替代正則表達式:a*b+
,拯救正則性能有救了!
再來看看上下文無關語法
更強大的表達能力:
E -> E OP E | (E) | N
OP -> = + - * /
N -> [0-9]+
整數算術表達式!哇哦,簡直了 ~
E:{1 ,123 ,1-1 ,(1+1)*(1+2) ,...}
很明顯,我們知道1+1
符合語法E,1+-1
不符合語法E,那麼機器是怎麼知道的呢?
參考文獻:自己動手寫編譯器(pandolia.net/tinyc/)
推薦閱讀: