淺談php web安全(2)

發表于:2013-12-31來源:IT博客大學習作者:Benwin點擊數: 標簽:php
(2)數據長度問題,如 數據庫 建表字段char(25),大多phper考慮到是否為空、數據類型是否正確,卻忽略字符長度,忽略還好更多是懶于再去判斷長度。(這個

  (2)數據長度問題,如數據庫建表字段char(25),大多phper考慮到是否為空、數據類型是否正確,卻忽略字符長度,忽略還好更多是懶于再去判斷長度。(這個更多出現在新手當中,筆者曾經也有這樣的思想)

  (3)以為前端用js判斷驗證過了,后臺不需要判斷驗證。這也是致命,要知道偽造一個表單就幾分鐘的事,js判斷只是為了減少用戶提交次數從而提高用戶體驗、減少http請求減少服務器壓力,在安全情況下不能防“小人”,當然如果合法用戶在js驗證控制下是完美的,但作為phper我們不能只有js驗證而拋棄再一次安全驗證。

  (4) 缺少對表單某些屬性比如select、checkbox、radio、button等的驗證,這些屬性在web頁面上開發者已經設置定其值和值域(白名單值),這些屬性值在js驗證方面一般不會驗證,因為合法用戶只有選擇權沒修改權,然后phper就在后端接受數據處理驗證數據的時候不會驗證這些數據,這是一個慣性思維,安全問題也就有了,小人一個偽表單足矣致命。

  (5)表單相應元素name和數據表的字段名一致,如用戶表用戶名的字段是user_name,然后表單中的用戶名輸入框也是user_name ,這和暴庫沒什么區別。

  (6)過濾危險字符方面如防注入下面會獨立講解。

  3、防注入

  3.1簡單判斷是否有注入漏洞以及原理。

  網址:http:www.phpben.com/benwin.php?id=1 運行正常,sql語句如:select * from phpben where id = 1

  (1) 網址:http:www.phpben.com/ benwin.php?id=1’ sql語句如:select * from phpben where id = 1’ 然后運行異常 這能說明benwin.php文件沒有對id的值進行“’” 過濾和intval()整形轉換,當然想知道有沒有對其他字符如“%”,“/*”等都可以用類似的方法窮舉測試(很多測試軟件使用)

  (2) 網址:http:www.phpben.com/ benwin.php?id=1 and 1=1 則sql語句可能是 select * from phpben where id = 1 and 1=1,運行正常且結果和http:www.phpben.com/benwin.php?id=1結果一樣,則說明benwin.php可能沒有對空格 “ ”、和“and”過濾(這里是可能,所以要看下一點)

  (3)網址:http:www.phpben.com/ benwin.php?id=1 and 1=2則sql語句可能是 select * from phpben where id = 1 and 1=2 如果運行結果異常說明sql語句中“and 1=2”起作用,所以能3個條件都滿足都則很確定的benwin.php存在注入漏洞。

  ps:這里用get方法驗證,post也可以,只要把值按上面的輸入,可以一一驗證。

  這說明

  3.2常見的mysql注入語句。

  (1)不用用戶名和密碼

  //正常語句

  $sql ="select * from phpben where user_name='admin' and pwd ='123'";

  //在用戶名框輸入’or’=’or’或 ’or 1=’1 然后sql如下

  $sql ="select * from phpben where user_name=' 'or'='or'' and pwd ='' ";

  $sql ="select * from phpben where user_name=' 'or 1='1' and pwd ='' ";

  這樣不用輸入密碼。話說筆者見到登錄框都有嘗試的沖動。

  (2)在不輸入密碼的情況下,利用某用戶。

  //正常語句

  $sql ="select * from phpben where user_name='$username' and pwd ='$pwd'";

  //利用的用戶名是benwin 則用戶名框輸入benwin’# 密碼有無都可,則$sql變成

  $sql ="select * from phpben where user_name=' benwin'#' and pwd ='$pwd'";

  這是因為mysql中其中的一個注悉是“#”,上面語句中#已經把后面的內容給注悉掉,所以密碼可以不輸入或任意輸入。網上有些人介紹說用“/*”來注悉,筆者想提的是只有開始注悉沒結束注悉“*/”時,mysql會報錯,也不是說“/**/”不能注悉,而是這里很難添加上“*/”來結束注悉,還有“-- ”也是可以注悉mysql 但要注意“--”后至少有一個空格也就是“-- ”,當然防注入代碼要把三種都考慮進來,值得一提的是很多防注入代碼中沒把“-- ”考慮進防注入范圍。

  (3)猜解某用戶密碼

  //正常語句

  $sql ="select * from phpben.com where user_name='$username' and pwd ='$pwd'";

  //在密碼輸入框中輸入“benwin’ and left(pwd,1)='p'#”,則$sql是

  $sql ="select * from phpben.com where user_name=' benwin' and left(pwd,1)='p'#' and pwd ='$pwd'";

  如果運行正常則密碼的密碼第一個字符是p,同理猜解剩下字符。

  (4)插入數據時提權

  //正常語句,等級為1

  $sql = "insert into phpben.com (`user_name`,`pwd`,`level`) values(‘benwin','iampwd',1) ";

  //通過修改密碼字符串把語句變成

  $sql = "insert into phpben.com (`user_name`,`pwd`,`level`) values(‘benwin','iampwd',5)#',1) ";

  $sql = "insert into phpben.com (`user_name`,`pwd`,`level`) values(‘benwin','iampwd',5)-- ',1) ";這樣就把一個權限為1的用戶提權到等級5

  (5)更新提權和插入提權同理

  //正常語句

  $sql = "update phpben set `user_name` ='benwin', level=1";

  //通過輸入用戶名值最終得到的$sql

  $sql = "update phpben set `user_name` ='benwin',level=5#', level=1";

原文轉自:http://blogread.cn/it/article/6086

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97