偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

SQL注入防御與繞過的幾種姿勢

安全 數(shù)據(jù)安全
本文章主要以后端PHP和MySQL數(shù)據(jù)庫為例,參考了多篇文章后的集合性文章。

前言

本文章主要以后端PHP和MySQL數(shù)據(jù)庫為例,參考了多篇文章后的集合性文章,歡迎大家提出個人見解,互促成長。

[[190446]]

一、 PHP幾種防御姿勢

1. 關(guān)閉錯誤提示

說明:

PHP配置文件php.ini中的display_errors=Off,這樣就關(guān)閉了錯誤提示。

2. 魔術(shù)引號

說明:

當(dāng)php.ini里的magic_quotes_gpc=On時。提交的變量中所有的單引號(')、雙引號(")、反斜線(\)與 NUL(NULL 字符)會自動轉(zhuǎn)為含有反斜線的轉(zhuǎn)義字符。

魔術(shù)引號(Magic Quote)是一個自動將進(jìn)入 PHP 腳本的數(shù)據(jù)進(jìn)行轉(zhuǎn)義的過程。(對所有的 GET、POST 和 COOKIE 數(shù)據(jù)自動運行轉(zhuǎn)義)

PHP 5.4 之前 PHP 指令 magic_quotes_gpc 默認(rèn)是 on。

本特性已自PHP 5.3.0 起廢棄并將自 PHP 5.4.0 起移除,在PHP 5.4.O 起將始終返回 FALSE。

參考:

《magic_quotes_gpc相關(guān)說明》:

http://www.cnblogs.com/qiantuwuliang/archive/2009/11/12/1601974.html

3. addslashes

說明:

addslashes函數(shù),它會在指定的預(yù)定義字符前添加反斜杠轉(zhuǎn)義,這些預(yù)定義的字符是:單引號(')、雙引號(")、反斜線(\)與 NUL(NULL 字符)。

這個函數(shù)的作用和magic_quotes_gpc一樣。所以一般用addslashes前會檢查是否開了magic_quotes_gpc。

http://p9.qhimg.com/t01b9cc5ebd329c3951.png

magic_quotes_gpc與addslashes的區(qū)別用法:

1)對于magic_quotes_gpc=on的情況

我們可以不對輸入和輸出數(shù)據(jù)庫的字符串?dāng)?shù)據(jù)作addslashes()和stripslashes()的操作,數(shù)據(jù)也會正常顯示。

如果此時你對輸入的數(shù)據(jù)作了addslashes()處理,那么在輸出的時候就必須使用stripslashes()去掉多余的反斜杠。

2)對于magic_quotes_gpc=off 的情況

必須使用addslashes()對輸入數(shù)據(jù)進(jìn)行處理,但并不需要使用stripslashes()格式化輸出,

因為addslashes()并未將反斜杠一起寫入數(shù)據(jù)庫,只是幫助mysql完成了sql語句的執(zhí)行。

參考:

《addslashes函數(shù)說明》:

https://secure.php.net/manual/zh/function.addslashes.php

《對于magic_quotes_gpc的一點認(rèn)識》:

http://www.phpfans.net/bbs/viewthread.php?tid=6860&page=1&extra=page=1

4. mysql_real_escape_string

說明:

mysql_real_escape_string()函數(shù)轉(zhuǎn)義 SQL 語句中使用的字符串中的特殊字符。

下列字符受影響:

  1. \x00 
  2. \n 
  3. \r 
  4. \x1a 

如果成功,則該函數(shù)返回被轉(zhuǎn)義的字符串。如果失敗,則返回 false。

本擴(kuò)展自 PHP5.5.0 起已廢棄,并在自 PHP 7.0.0 開始被移除。

因為完全性問題,建議使用擁有Prepared Statement機(jī)制的PDO和MYSQLi來代替mysql_query,使用的是mysqli_real_escape_string

參考:

《 PHP防SQL注入不要再用addslashes和mysql_real_escape_string了》:

http://blog.csdn.net/hornedreaper1988/article/details/43520257

《PDO防注入原理分析以及使用PDO的注意事項》:

http://zhangxugg-163-com.iteye.com/blog/1835721

5. htmlspecialchars()

說明:

htmlspecialchars()函數(shù)把預(yù)定義的字符轉(zhuǎn)換為 HTML實體。

預(yù)定義的字符是:

  1. & (和號)成為 & 
  2. " (雙引號)成為 " 
  3. ' (單引號)成為 ' 
  4. < (小于)成為 &lt; 
  5. > (大于)成為 &gt; 

6. 用正則匹配替換來過濾指定的字符

  1. preg_match 
  2. preg_match_all() 
  3. preg_replace 

參考:

《preg_match說明》:

http://php.net/manual/zh/function.preg-match.php

《preg_replace說明》:

https://secure.php.net/manual/zh/function.preg-replace.php

7. 轉(zhuǎn)換數(shù)據(jù)類型

說明:

根據(jù)「檢查數(shù)據(jù)類型」的原則,查詢之前要將輸入數(shù)據(jù)轉(zhuǎn)換為相應(yīng)類型,如uid都應(yīng)該經(jīng)過intval函數(shù)格式為int型。

8. 使用預(yù)編譯語句

說明:

綁定變量使用預(yù)編譯語句是預(yù)防SQL注入的最佳方式,因為使用預(yù)編譯的SQL語句語義不會發(fā)生改變,在SQL語句中,變量用問號?表示,攻擊者無法改變SQL語句的結(jié)構(gòu),從根本上杜絕了SQL注入攻擊的發(fā)生。

代碼示例:

http://p6.qhimg.com/t011554d1448b3f5840.png

參考:

《Web安全之SQL注入攻擊技巧與防范》:

http://www.plhwin.com/2014/06/13/web-security-sql/

二、 幾種繞過姿勢

下面列舉幾個防御與繞過的例子:

例子1:addslashes

防御:

http://p5.qhimg.com/t01bd6f0a9c2f97bc13.png

這里用了addslashes轉(zhuǎn)義。

繞過:

  • 將字符串轉(zhuǎn)為16進(jìn)制編碼數(shù)據(jù)或使用char函數(shù)(十進(jìn)制)進(jìn)行轉(zhuǎn)化(因為數(shù)據(jù)庫會自動把16進(jìn)制轉(zhuǎn)化)
  • 用注釋符去掉輸入密碼部分如“-- /* #”

payload:

  1. http://localhost/injection/user.php?username=admin-- hack 

(因為有的SQL要求--后要有空格,所以此處加上了hack)

  1. http://localhost/injection/user.php?username=admin/* 

(escape不轉(zhuǎn)義/*)

  1. http://localhost/injection/user.php?username=admin%23 

(這里的%23即為#,注釋掉后面的密碼部分。注意IE瀏覽器會將#轉(zhuǎn)換為空)

  1. http://localhost/injection/user.php?username=0x61646d696e23 

(admin# -->0x61646d696e23)

  1. http://localhost/injection/user.php?username=CHAR(97,100, 109, 105, 110, 35) 

(admin# -->CHAR(97, 100, 109, 105, 110, 35))

關(guān)于編碼原理:

因為一般前端JavaScript都會escape()、encodeURL或encodeURIComponent編碼再傳輸給服務(wù)器,主要為encodeURL,如下,所以可以利用這點。

JavaScript代碼如:

JavaScript代碼

攔截請求:

http://p4.qhimg.com/t018cafe605b0f54abb.png

1)escape( )

對ASCII字母、數(shù)字、標(biāo)點符號"@* _ + - . /"不進(jìn)行編碼。在\u0000到\u00ff之間的符號被轉(zhuǎn)成%xx的形式,其余符號被轉(zhuǎn)成%uxxxx的形式。(注意escape()不對"+"編碼,而平時表單中的空格會變成+)

2) encodeURL

對" ; / ? : @ & = + $ , # ' "不進(jìn)行編碼。編碼后,它輸出符號的utf-8形式,并且在每個字節(jié)前加上%。

3) encodeURIComponent

用于對URL的組成部分進(jìn)行個別編碼,而不用于對整個URL進(jìn)行編碼。

常用編碼:  

  1. @ * _ + - ./ ;  \ ? : @ & = + $ , # ' 空格 

轉(zhuǎn)碼工具可用:

http://evilcos.me/lab/xssor/

參考:

《URL編碼》:

http://www.ruanyifeng.com/blog/2010/02/url_encoding.html

例子2:匹配過濾

防御:

http://p1.qhimg.com/t011ef7d8ad83689108.png

繞過:

關(guān)鍵詞and,or常被用做簡單測試網(wǎng)站是否容易進(jìn)行注入攻擊。這里給出簡單的繞過使用&&,||分別替換and,or。

  • 過濾注入: 1 or 1 = 1 1 and 1 = 1
  • 繞過注入: 1 || 1 = 1 1 && 1 = 1

關(guān)于preg_match過濾可以看參考文章,文章里講得很詳細(xì)了。

參考:

《高級SQL注入:混淆和繞過》:

http://www.cnblogs.com/croot/p/3450262.html

例子3:strstr

防御:

http://p3.qhimg.com/t01e38d15cd0ba68f9d.png

strstr ()查找字符串的首次出現(xiàn),該函數(shù)區(qū)分大小寫。如果想要不區(qū)分大小寫,使用stristr()。(注意后面這個函數(shù)多了個i)

繞過:

strstr()函數(shù)是對大小寫敏感的,所以我們可以通過大小寫變種來繞過

payload:

  1. http://localhost/injection/user.php?id=1uNion select null,null,null 

例子4:空格過濾

防御:

http://p7.qhimg.com/t0197f1f3f7332c497a.png

繞過:

1)使用內(nèi)聯(lián)注釋。

2)使用換行符代替空格。注意服務(wù)器若為Windows則換行符為%0A%0D,Linux則為%0A。

  1. http://localhost/injection/user.php?id=1/**/and/**/11=1 
  2. http://localhost/injection/user.php?id=1%0A%0Dand%0A%0D1=1 

例子5:空字節(jié)

通常的輸入過濾器都是在應(yīng)用程序之外的代碼實現(xiàn)的。比如入侵檢測系統(tǒng)(IDS),這些系統(tǒng)一般是由原生編程語言開發(fā)而成,比如C++,為什么空字節(jié)能起作用呢,就是因為在原生變成語言中,根據(jù)字符串起始位置到第一個出現(xiàn)空字節(jié)的位置來確定字符串長度。所以說空字節(jié)就有效的終止了字符串。

繞過:

只需要在過濾器阻止的字符串前面提供一個采用URL編碼的空字節(jié)即可。

payload:

http://p3.qhimg.com/t010b93647c17389bbf.png

例子6:構(gòu)造故意過濾

防御:

http://p9.qhimg.com/t01bb2f5ae28aa52562.png

繞過:

文件的63行開始可以看到,此處將傳入的%27和%2527都進(jìn)行刪除處理,也就是還沒傳入數(shù)據(jù)庫前就已經(jīng)被該死的程序吃了,但是在67行看到他還吃了*,這樣我們就有辦法了,我們構(gòu)造%*27,這樣程序吃掉星號*后,%27就會被傳入。

payload:    

  1. http://localhost/injection/user.php?id%3D1%*27%*20and%*20%*271%*27%3D%*271 

(id=1' and '1'='1-->id%3D1%*27%*20and%*20%*271%*27%3D%*271)

參考:

《phpcms_v9.6.0_sql注入與exp》:

 

https://zhuanlan.zhihu.com/p/26263513

責(zé)任編輯:趙寧寧 來源: 安全客
相關(guān)推薦

2010-09-08 13:10:03

2013-01-11 16:23:29

2017-05-08 14:33:51

2019-02-22 09:00:00

2023-12-01 16:21:42

2010-10-25 12:10:39

SQL注入

2014-07-09 15:41:51

2013-05-22 17:43:21

2010-09-13 14:03:58

2019-01-17 04:41:38

2020-04-13 15:25:01

MySQL數(shù)據(jù)庫模糊搜索

2010-04-13 14:35:17

2024-10-18 08:53:49

SpringMybatis微服務(wù)

2017-12-11 14:12:40

PythonMySQL連接

2021-03-10 10:05:59

網(wǎng)絡(luò)釣魚攻擊黑客

2019-08-29 14:30:16

代碼開發(fā)工具

2021-01-13 08:14:36

Windows提權(quán)漏洞攻擊

2013-04-19 13:20:14

2010-09-30 09:06:15

2024-08-02 09:15:22

Spring捕捉格式
點贊
收藏

51CTO技術(shù)棧公眾號