常見的Web安全漏洞:SQL注入、XSS跨站腳本攻擊、文件上傳漏洞、URL跳轉漏洞,今天分享下SQL注入。
SQL注入可能造成:網頁和數據被改,核心數據被竊,數據庫所在的服務器被攻擊
1.SQL注入的產生條件
3.SQL注入類型
3.數據類型
4.防禦SQL注入
1.SQL注入的產生條件
SQL注入的產生條件:有參數傳遞、參數值代入數據庫查詢並且執行,後臺在編寫程序時沒有對輸入的數據進行過濾。
比如:用戶在查詢課程的輸入框提交的參數是mysql,此時,
瀏覽器提交的URL爲:
192.168.5.249:8080/index.php?coursename=mysql
服務器後臺執行的SQL語句爲:
SELECT * FROM course WHERE coursename=mysql
這樣正常的輸入是沒任何影響到,但是如果進行SQL注入,輸入mysql; DROP table,這種情況下,服務器後臺則執行的SQL語句爲:
SELECT * FROM course WHERE coursename=mysql; DROP table
在執行查詢課程的過程後,將course表給刪除,從而導致了SQL注入
2.SQL注入類型
基於布爾的盲注、基於時間的盲注、基於報錯的注入、聯合查詢注入、堆查詢注入、其他
2.1基於布爾的盲注
不返回數據庫數據,結果爲FALSE、TRUE
2.2基於時間的盲注
利用sleep()或者benchmark()等函數讓MySQL執行時間增長
比如:if(表達式,true,false) ——》 if( length(datebase()>1, sleep(5), 1) )
2.3基於報錯的注入
多單引號、EXTRACTVALUE()、FLOOR()、UPDATEXML()、GEOMETRYCOLLECTION()、MULTIPOINT()、POLYGON()、MULTIPOLYGON()、LINESTRING()、MULTILINESTRING()、EXP(),比如:
- 多單引號
比如用戶在查詢課程的輸入框提交的參數是1’:
SELECT * FROM course WHERE courseid==1’
如果返回不正常,則說明courseid參數存在注入漏洞
- EXTRACTVALUE()
對XML文檔進行查詢的函數,其語法是extractvalue(目標XML文檔, XML路徑),concat()拼接
正常情況下:
SELECT coursename FROM course
WHERE id=1 AND ( extractvalue( ‘anything’,concat(‘/’,(SELECT database() ) ) ) )
異常情況下:
SELECT coursename FROM course
WHERE id=1 AND ( extractvalue( ‘anything’,concat(‘~’,(SELECT database() ) ) ) )
- UPDATEXML()
UPDATEXML()類似於EXTRACTVALUE()函數,是更新XML文檔的函數,其語法是updatexml(目標XML文檔,XML路徑,更新的內容)
正常情況下:
SELECT coursename FROM course
WHERE id=1 AND (updatexml(‘anything’,’/xx/xx’,’anything’))
異常情況下:
SELECT coursename FROM course
WHERE id=1 AND (updatexml(‘anything’,concat(‘~’,(select database())),’anything’))
2.4聯合查詢注入
UNION注入,比如:id=-1 UNION SELECT 1,2,3
2.5堆查詢注入
分號隔開、%23—#
2.6其他
其他注入,比如:寬字節注入、二次注入、BASE64注入、COOKIE注入
- 寬字節注入
數據庫編碼爲GBK,繞過單引號被轉義
- 二次注入
向數據庫插入查詢語句,不被執行;數據庫調用時報錯,返回錯誤信息
3.數據類型
數字型(輸入的參數爲整型)、字符型(輸入的參數爲字符串),數字型不需要單引號來閉合,而字符串一般需要通過單引號來閉合。
4.防禦
可通過使用預編譯語句、過濾危險字符等方式進行防禦SQL注入
4.1使用預編譯語句
- 構造SQL語句時使用參數化形式
參數化處理SQL是將參數進行字符串化處理,把參數中的單引號、井號等都做轉義化處理,從而在執行SQL語句時不會被當作SQL中的定界符或指定符來執行
- 不使用拼接方式
不使用拼接concat()
4.2過濾危險字符
過濾一些查詢關鍵字或者不常規的符號