<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近了解到安全公司的面試中都問到了很多關於SQL隱碼攻擊的一些原理和注入型別的問題,甚至是SQL隱碼攻擊的防禦方法。SQL隱碼攻擊真的算是web漏洞中的元老了,著名且危害性極大。下面這裡就簡單的分享一下我總結的四種SQL隱碼攻擊防禦手段,加深理解,方便下次遇到這種問題時可以直接拿來使用。(主要是怕面試中腦殼打鐵,這種情況太常見了)
SQL隱碼攻擊佔我們滲透學習中極大地一部分,擁有這很重要的地位。隨著防禦手段的不段深入,市面上存在SQL隱碼攻擊的網站的確少之又少了,但不能說是沒有。在我看來,學習SQL隱碼攻擊的目的並不只是學習針對這種方法,而是一類方法,包括他的思想,思路和奇淫技巧,簡單點說就是舉一反三。學到現在發現好像越向後面學其他漏洞,方法思路都大體一致,比如字串拼接,構造閉合語句,函數替代等等。
好了,說了這麼多,現在我們步入正題吧!
我們簡單理解SQL隱碼攻擊就是在人為可以構造引數的地方加入一些非法敏感語句,繞過後端的處理,並帶入到資料庫中執行,然後返回敏感資料的過程。
在傳入引數的地方限制引數的型別,比如整型 Integer,隨後加入函數判斷,如is_numeric($_GET[‘id’]) 只有當get到的id為數位或者數位字元時才能執行下一步,限制了字字元自然就限制了注入,畢竟構造引數怎麼可能不傳入字元。但這種方法存在一定的限制,只能在特定的頁面才能使用,一般大部分都是要求我們傳入的字串,但可以很大程度限制整型注入的情況。(針對此函數也是有一定繞過手段,比如轉為十六進位制)
相信對於正規表示式大家都不陌生了,幾乎在過濾比較嚴格的地方都有正規表示式。(後面我也會寫一篇關於使用正規表示式的文章,包括基礎的使用和繞過)。這裡簡單解讀一下這段正規表示式:
$id=$_POST['id']; if (preg_match('/and|select|insert|insert|update|[A-Za-z]|/d+:/i', $id)) { die('stop hacking!'); } else { echo 'good'; }
preg_match() 函數匹配傳入的id值,
/ 作為正則的起始識別符號
| 代表或
[A-Za-z] 表示匹配引數中是否存在大小寫的26個字元
/d 匹配是否存在數位
+匹配一次或多次
/i 不區分大小寫
像下面這句:
?id=1’ union select 1,2# 因為匹配到union select,輸出 stop hacking!
正規表示式也具有一定危險性,在SQL隱碼攻擊繞過waf中談到過,正規表示式匹配非常消耗效能,因此攻擊時可以構造大量的正常語句‘騙’過伺服器,當後臺對資料的處理達到最大限制時就會放棄匹配後面我們構造的非法語句,從而略過這個封包。
在php中最基本的就是自帶的magic_quotes_gpc函數,用於處理 ’ " 符號加上/ 防止跳脫, 比如:
?id=1' and 1=1# ===> ?id=1/' and 1=1#
另外還有addslashes(),也具有相同的效果。
像前面提到的**preg_match()**函數結合正規表示式或者黑名單也具有預防效果。
小tips:預設情況下,PHP 指令 magic_quotes_gpc 為 on,對所有的 GET、POST 和 COOKIE 資料自動執行 addslashes()。不要對已經被 magic_quotes_gpc 跳脫過的字串使用 addslashes(),因為這樣會導致雙層跳脫。遇到這種情況時可以使用函數 get_magic_quotes_gpc() 進行檢測。
mysql_escape_string($string):用反斜槓跳脫字串中的特殊字元,用於mysql_query()查詢。
mysql_real_escape_string() 函數跳脫 SQL 語句中使用的字串中的特殊字元。
跳脫的符號包括 x00 n r ’ " x1a
預編譯語句對現在的程式設計師來說基本都會去設計使用的方法,保障資料庫的安全。一般來說,防禦SQL隱碼攻擊的最佳方式就是使用預編譯語句,繫結變數。
String query="select password from users where username='?' ";
下面講一下什麼叫預編譯:使用預編譯相當於是將資料於程式碼分離的方式,把傳入的引數繫結為一個變數,用?表示,攻擊者無法改變SQL的結構,在這個例子中,即使攻擊者插入類似 admin’ or 1=1# 的字串,如果不做處理直接帶入查詢,那麼query則變成了
query="select password from users where username='admin' or 1=1 ";
閉合了後面的引號,從而執行了惡意程式碼。而預編譯則是將傳入的 admin’ or 1=1# 當做純字串的形式作為username執行,避免了上面說到的SQL語句中的拼接閉合查詢語句等過程,可以理解為字串與sql語句的關係區分開,username此時作為字串不會被當做之前的SQL語句被帶入資料庫執行,避免了類似sql語句拼接、閉合等非法操作。就相當於拿著這個字串去資料庫中找有沒有這個東西一樣。並且使用預編譯的SQL語句,SQL語句的語意不會發生改變。
下面給個php繫結變數的事例:
$query="INSERT INTO myCity (Name,CountryCode,District) VALUES (?,?,?)"; $stmt=$mysqli->prepare($query); $stmt->bind_param("sss",$val1,$val2,$val3); $val1="Stuttgart"; $val2="DEU"; $val3="Baden"; //execute the statement $stmt->execute();
以上談到的四種方法都是一些基本方法,具體怎麼實現防禦還要看怎麼去設計。說到預編譯語句是最佳方式,並不是說只是使用這一種方法就能夠防止SQL隱碼攻擊,而實際上預編譯也存在注入繞過的問題,並且也不是所有的地方都能夠使用預編譯語句。最佳的方式應該是多種方法結合,使用預編譯的同時還要加上其他函數過濾,正則匹配等,更多的還有根據實際情況自定義函數確保安全。
到此這篇關於SQL隱碼攻擊的四種防禦方法總結的文章就介紹到這了,更多相關SQL隱碼攻擊防禦方法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45