關(guān)于動態(tài)代碼防御機制,是自己瞎取的名字,目前我還沒有看到過類似的文章。如果有前輩已經(jīng)發(fā)表過,純屬巧合!!!我僅是突發(fā)奇想的一個想法,說不上高大上。也就是想說出這個想法。說不定各位在座的大佬有更好的想法去完善這個方案!
動態(tài)代碼防御機制介紹
現(xiàn)在的各種攻擊都是針對靜態(tài)代碼的攻擊,例如接受用戶名和密碼的處理語句:select * from users where id=’id’ and pwd=’pwd’。攻擊者總可以想到一種方式進行攻擊或者繞過,因為后端代碼是寫死了的,他只能按照這種方式處理,所有難以有所避免的(當(dāng)然web防火墻和代碼過濾也能解決,但是這里我想說的就是動態(tài)防御機制這個核心思想)。隨著時代的發(fā)展也誕生出一批相當(dāng)優(yōu)秀的工具,例如作為sql注入的神器sqlmap,便能輕輕松松對安全防護比較弱的網(wǎng)站發(fā)起攻擊。甚至還能直接上傳文件、獲取shell等操作。
由于后端代碼是靜止的,因此攻擊者可以通過不斷嘗試獲取數(shù)據(jù)庫的的信息。如下圖:

這種工具的誕生也給攻擊者帶來了便捷,能夠很方便的對一個網(wǎng)站發(fā)起攻擊,大多數(shù)情況下,會使用sqlmap先走一波看看啥情況,然后再人工分析。這時候想,如果后端代碼是動態(tài)隨機的,那么會有什么情況?這樣后端代碼就活動起來了,給攻擊者無論是使用工具或者人工分析都帶來困難了。要想注入成功,那就需要各位仁兄運氣了!
如果后端代碼是動態(tài)運行的,那么就會導(dǎo)致攻擊者無法鎖定后端代碼從而實施注入。如下圖:

SQL注入的動態(tài)防御實踐
這里使用的是phpstudy搭建的一個sqli-labs環(huán)境進行操作。搭建好的效果如下:

下面就用sqli-labs第一關(guān)作為實驗對象。我們看下后端代碼的sql代碼:

很明顯,我們只需要閉合這個單引號就能實現(xiàn)注入了,這會兒直接采用sqlmap進行注入,結(jié)果如下:

可以看到payload是用單引號閉合注入。然后修改下sql代碼,使用sqlmap進行注入的情況如下:

使用sqlmap注入,得到的payload如下

其實就是把單引號注入轉(zhuǎn)變成了雙引號注入。接下載就是動態(tài)代碼防御機制了,我在這個代碼中加入了隨機數(shù),通過隨機的設(shè)置sql查詢不斷變換,導(dǎo)致sqlmap不能實現(xiàn)注入。添加的代碼如下:

然后再使用sqlmap進行注入,效果如下:

Sqlmap工具突然就會失效了。在以前版本的sqlmap中比較容易實現(xiàn),現(xiàn)在使用新版本sqlmap比較稍微困難了點。
總結(jié)
通過上面的這種后端代碼動態(tài)變化方式,能夠給防御帶來一定程度上的幫助。而且我感覺這個思想應(yīng)該能用在更多的場景中,還需要大家一起探索探索。
實驗推薦
SQL注入基礎(chǔ)防御對策一
https://www.hetianlab.com/expc.do?ec=ECID172.19.104.182015123116301400001
聲明:筆者初衷用于分享與普及網(wǎng)絡(luò)知識,若讀者因此作出任何危害網(wǎng)絡(luò)安全行為后果自負,與合天智匯及原作者無關(guān)!