錦州市廣廈電腦維修|上門維修電腦|上門做系統|0416-3905144熱誠服務,錦州廣廈維修電腦,公司IT外包服務
topFlag1 設為首頁
topFlag3 收藏本站
 
maojin003 首 頁 公司介紹 服務項目 服務報價 維修流程 IT外包服務 服務器維護 技術文章 常見故障
錦州市廣廈電腦維修|上門維修電腦|上門做系統|0416-3905144熱誠服務技術文章
SQL注入防御與繞過的幾種姿勢

作者: 佚名  日期:2017-05-04 07:44:39   來源: 本站整理

 本文章主要以后端PHP和MySQL數據庫為例,參考了多篇文章后的集合性文章,歡迎大家提出個人見解,互促成長。
一、 PHP幾種防御姿勢
1、關閉錯誤提示
說明:
PHP配置文件php.ini中的display_errors=Off,這樣就關閉了錯誤提示。
2、魔術引號
說明:
當php.ini里的magic_quotes_gpc=On時。提交的變量中所有的單引號(')、雙引號(")、反斜線(\)與 NUL(NULL 字符)會自動轉為含有反斜線的轉義字符。
魔術引號(Magic Quote)是一個自動將進入 PHP 腳本的數據進行轉義的過程。(對所有的 GET、POST 和 COOKIE 數據自動運行轉義)
PHP 5.4 之前 PHP 指令 magic_quotes_gpc 默認是 on。
本特性已自PHP 5.3.0 起廢棄并將自 PHP 5.4.0 起移除,在PHP 5.4.O 起將始終返回 FALSE。
參考:
《magic_quotes_gpc相關說明》:
http://www.cnblogs.com/qiantuwuliang/archive/2009/11/12/1601974.html 
3、addslashes
說明:
addslashes函數,它會在指定的預定義字符前添加反斜杠轉義,這些預定義的字符是:單引號(')、雙引號(")、反斜線(\)與 NUL(NULL 字符)。
這個函數的作用和magic_quotes_gpc一樣。所以一般用addslashes前會檢查是否開了magic_quotes_gpc。

magic_quotes_gpc與addslashes的區別用法:
1)對于magic_quotes_gpc=on的情況
我們可以不對輸入和輸出數據庫的字符串數據作addslashes()和stripslashes()的操作,數據也會正常顯示。
如果此時你對輸入的數據作了addslashes()處理,那么在輸出的時候就必須使用stripslashes()去掉多余的反斜杠。
2)對于magic_quotes_gpc=off 的情況
必須使用addslashes()對輸入數據進行處理,但并不需要使用stripslashes()格式化輸出,
因為addslashes()并未將反斜杠一起寫入數據庫,只是幫助mysql完成了sql語句的執行。
參考:
《addslashes函數說明》:
https://secure.php.net/manual/zh/function.addslashes.php 
《對于magic_quotes_gpc的一點認識》:
http://www.phpfans.net/bbs/viewthread.php?tid=6860&page=1&extra=page=1 
4、mysql_real_escape_string
說明:
mysql_real_escape_string()函數轉義 SQL 語句中使用的字符串中的特殊字符。
下列字符受影響:
\x00
\n
\r
\
'
"
\x1a
如果成功,則該函數返回被轉義的字符串。如果失敗,則返回 false。
本擴展自 PHP5.5.0 起已廢棄,并在自 PHP 7.0.0 開始被移除。
因為完全性問題,建議使用擁有Prepared Statement機制的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()函數把預定義的字符轉換為 HTML實體。
預定義的字符是:
& (和號)成為 &
" (雙引號)成為 "
' (單引號)成為 '
> (大于)成為 >
6、用正則匹配替換來過濾指定的字符
preg_match
preg_match_all()
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、轉換數據類型
說明:
根據「檢查數據類型」的原則,查詢之前要將輸入數據轉換為相應類型,如uid都應該經過intval函數格式為int型。
8、使用預編譯語句
說明:
綁定變量使用預編譯語句是預防SQL注入的最佳方式,因為使用預編譯的SQL語句語義不會發生改變,在SQL語句中,變量用問號?表示,攻擊者無法改變SQL語句的結構,從根本上杜絕了SQL注入攻擊的發生。
代碼示例:

參考:
《Web安全之SQL注入攻擊技巧與防范》:
http://www.plhwin.com/2014/06/13/web-security-sql/ 
二、 幾種繞過姿勢
下面列舉幾個防御與繞過的例子:
例子1:addslashes
防御:

這里用了addslashes轉義。
繞過:
1)將字符串轉為16進制編碼數據或使用char函數(十進制)進行轉化(因為數據庫會自動把16進制轉化)
2)用注釋符去掉輸入密碼部分如“-- /* #”
payload:

http://localhost/injection/user.php?username=admin-- hack
(因為有的SQL要求--后要有空格,所以此處加上了hack)

http://localhost/injection/user.php?username=admin/*
(escape不轉義/*)

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

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

http://localhost/injection/user.php?username=0x61646d696e23
(admin# -->0x61646d696e23)

http://localhost/injection/user.php?username=CHAR(97,100, 109, 105, 110, 35)
(admin# -->CHAR(97, 100, 109, 105, 110, 35))
關于編碼原理:
因為一般前端JavaScript都會escape()、encodeURL或encodeURIComponent編碼再傳輸給服務器,主要為encodeURL,如下,所以可以利用這點。
JavaScript代碼如:

攔截請求:

1)escape( )
對ASCII字母、數字、標點符號"@* _ + - . /"不進行編碼。在\u0000到\u00ff之間的符號被轉成%xx的形式,其余符號被轉成%uxxxx的形式。(注意escape()不對"+"編碼,而平時表單中的空格會變成+)
2) encodeURL
對" ;  / ? : @ & = + $ , # ' "不進行編碼。編碼后,它輸出符號的utf-8形式,并且在每個字節前加上%。
3) encodeURIComponent
用于對URL的組成部分進行個別編碼,而不用于對整個URL進行編碼。
常用編碼:

@ * _ + - ./ ;  \ ? : @ & = + $ , # ' 空格
轉碼工具可用:
http://evilcos.me/lab/xssor/ 
參考:
《URL編碼》:
http://www.ruanyifeng.com/blog/2010/02/url_encoding.html 
例子2:匹配過濾
防御:

繞過:
關鍵詞and,or常被用做簡單測試網站是否容易進行注入攻擊。這里給出簡單的繞過使用&&,||分別替換and,or。
過濾注入: 1 or 1 = 1    1 and 1 = 1
繞過注入: 1 || 1 = 1    1 && 1 = 1
關于preg_match過濾可以看參考文章,文章里講得很詳細了。
參考:
《高級SQL注入:混淆和繞過》:
http://www.cnblogs.com/croot/p/3450262.html 
例子3:strstr
防御:

strstr ()查找字符串的首次出現,該函數區分大小寫。如果想要不區分大小寫,使用stristr()。(注意后面這個函數多了個i)
繞過:
strstr()函數是對大小寫敏感的,所以我們可以通過大小寫變種來繞過
payload:

http://localhost/injection/user.php?id=1uNion select null,null,null
例子4:空格過濾
防御:

繞過:
1)使用內聯注釋。
2)使用換行符代替空格。注意服務器若為Windows則換行符為%0A%0D,Linux則為%0A。
payload:
http://localhost/injection/user.php?id=1/**/and/**/1=1
http://localhost/injection/user.php?id=1%0A%0Dand%0A%0D1=1
例子5:空字節
通常的輸入過濾器都是在應用程序之外的代碼實現的。比如入侵檢測系統(IDS),這些系統一般是由原生編程語言開發而成,比如C++,為什么空字節能起作用呢,就是因為在原生變成語言中,根據字符串起始位置到第一個出現空字節的位置來確定字符串長度。所以說空字節就有效的終止了字符串。
繞過:
只需要在過濾器阻止的字符串前面提供一個采用URL編碼的空字節即可。
payload:

例子6:構造故意過濾
防御:

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

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)
 



熱門文章
  • 機械革命S1 PRO-02 開機不顯示 黑...
  • 聯想ThinkPad NM-C641上電掉電點不...
  • 三星一體激光打印機SCX-4521F維修...
  • 通過串口命令查看EMMC擦寫次數和判...
  • IIS 8 開啟 GZIP壓縮來減少網絡請求...
  • 索尼kd-49x7500e背光一半暗且閃爍 ...
  • 樓宇對講門禁讀卡異常維修,讀卡芯...
  • 新款海信電視機始終停留在開機界面...
  • 常見打印機清零步驟
  • 安裝驅動時提示不包含數字簽名的解...
  • 共享打印機需要密碼的解決方法
  • 圖解Windows 7系統快速共享打印機的...
  • 錦州廣廈電腦上門維修

    報修電話:13840665804  QQ:174984393 (聯系人:毛先生)   
    E-Mail:174984393@qq.com
    維修中心地址:錦州廣廈電腦城
    ICP備案/許可證號:遼ICP備2023002984號-1
    上門服務區域: 遼寧錦州市區
    主要業務: 修電腦,電腦修理,電腦維護,上門維修電腦,黑屏藍屏死機故障排除,無線上網設置,IT服務外包,局域網組建,ADSL共享上網,路由器設置,數據恢復,密碼破解,光盤刻錄制作等服務

    技術支持:微軟等
    主站蜘蛛池模板: 久久精品无码一区二区无码| 国产成人精品一区二区三区无码| 久久亚洲AV成人无码电影| 亚洲gv猛男gv无码男同短文| 久久精品无码午夜福利理论片| 日韩专区无码人妻| 国99精品无码一区二区三区| 人妻精品无码一区二区三区| 亚洲AV无码专区在线播放中文| 成人免费无码大片A毛片抽搐色欲| 国产爆乳无码一区二区麻豆| a级毛片无码免费真人| 无码AV波多野结衣久久| 日日日日做夜夜夜夜无码| 精品久久久久久中文字幕无码| 无码一区二区三区| 国产色爽免费无码视频| 免费A级毛片无码A| 中文无码不卡的岛国片| 无码人妻精品中文字幕| 超清无码无卡中文字幕| 性无码专区一色吊丝中文字幕| 无码人妻丰满熟妇区BBBBXXXX| 国产在线拍揄自揄拍无码| 国产精品无码素人福利| 精品无码人妻一区二区三区18| 无码成人精品区在线观看| 亚洲AV区无码字幕中文色| 国产成人亚洲综合无码精品| 国产精品无码一区二区在线观一 | 午夜无码伦费影视在线观看| 日韩电影无码A不卡| 无码国产69精品久久久久孕妇 | 免费无遮挡无码视频网站| 亚洲av无码久久忘忧草| 亚洲av无码电影网| 亚洲AV永久无码精品网站在线观看 | 亚洲AV无码成人网站久久精品大| 国产免费黄色无码视频| 中文字幕无码AV波多野吉衣| 永久免费av无码网站yy|