實驗八 Web基礎
實驗要求
(1)Web前端HTML
能正常安裝、啟停Apache。理解HTML,理解表單,理解GET與POST方法,編寫一個含有表單的HTML。
(2)Web前端javascipt
理解JavaScript的基本功能,理解DOM。編寫JavaScript驗證用戶名、密碼的規則。
(3)Web后端:MySQL基礎:正常安裝、啟動MySQL,建庫、創建用戶、修改密碼、建表
(4)Web后端:編寫PHP網頁,連接數據庫,進行用戶認證
(5)最簡單的SQL注入,XSS攻擊測試
功能描述:用戶能登陸,登陸用戶名密碼保存在數據庫中,登陸成功顯示歡迎頁面。
實驗原理
1.在Kali-Linux中可以很方便地啟停Apache2服務,如果要更方便地進行訪問,我們可以先Kill掉占用80端口的進程,這樣Apache啟動之后就會使用80端口,在訪問時就不需要選擇端口連接了!
HTML是超文本傳輸協議,可以在CSS的幫助下制作出一個比較精美的靜態網頁界面,但是功能有限,如果加入了Java Script代碼后,界面就能動態處理一些事態,變得更靈活,用戶體驗也會更好一點。
HTTP的底層是TCP/IP。所以GET和POST的底層也是TCP/IP,也就是說,GET/POST都是TCP鏈接。GET和POST能做的事情是一樣一樣的。你要給GET加上request body,給POST帶上url參數,技術上是完全行的通的。所以本質上來講這兩者沒有什么區別,視需要使用就好了。
2.JavaScript可以實現一個動態網頁,不像靜態的、死板的HTML文件,帶有JavaScript的JSP文件看起來更加生動。將一段Java代碼穿插寫在HTML文本中間,不影響HTML本身的作用,限制較少。
3.在后台中一般來說會帶一個數據庫的軟件,我個人用得比較多的是Access,本次試驗用到的是mysql數據庫,是一個已經內置在Kali-Linux中的一款數據庫軟件,很省事,如果后台采用Java語言編寫的話,需要加載Access驅動后用SQL語言訪問Access數據庫,存取你想要的數據。不管哪個都是很好用的軟件,在命令上都是一樣的。
4.后台會在用戶提交表單后,將數據進行一些處理,這里面就可以進行登錄驗證等很多事情,鏈接數據庫也是在這部分實現的。
5.SQL注入:在訪問數據庫時候,攻擊者使用設計好的字段令SQL語言做出其它的、預想之外的操作,以影響數據庫的正常工作,達到攻擊者篡改、破壞數據的目的。
實驗步驟
我們按部就班地按照實驗步驟,一點一點做~
首先打開Apache服務,如果有進程在占用80端口一定要Kill掉,然后將自己做好的登錄頁面置入/var/www/html/這個目錄下面,用瀏覽器查看一下,看看能否正常訪問我們置入的文件。
然后打開Kali-Linux自帶的mysql服務,進行一些簡單配置,更改root用戶的密碼,更新權限,建立一個test_db數據庫,存入我們需要的登錄信息。
mysql這塊在敲命令行的時候一定要記住:加分號!!!這次被這些分好搞得焦頭爛額,不是很習慣……
最后我們使用老師給出的一個login.php文件進行連接,在使用之前要更改用戶名、密碼使它能訪問本機的mysql數據庫,還要配合我們制作的HTML頁面使得username和password的表單名稱可以對應,否則不能正確讀取文本框里面輸入的信息。
A-oooooooooo!!出錯了,這個是我們連接不上數據庫的錯誤提示,我接下來嘗試了下面這些操作:
1.新建一個用戶
2.進行權限提升
3.更新文件內容
這些操作結束后……並沒有解決問題……不過倒是產生了不一樣的效果login.php什么都不顯示了!Emmmmm…………
這個時候我們要使用一款神器,他叫:別人的電腦!(別問我為什么每次實驗都會出現各種各樣奇奇怪怪的錯誤,我也不想啊……)
這個時候發生了一個小插曲(后來覺得這顯然比在別人電腦上做成功更靠譜一些):
反正也行不通了。。。不如試一下看看能不能找到某些網站的漏洞emmmm……所以先拿一些做工比較粗糙的網站下手試了試,雖然這些不是很正規的網站看起來有點low,但是游民星空、游俠網、3DM(這個登錄信息太多了啊)還有很多關掉就會忘掉的網站,等等這些網站還是可以有效抵擋的,他們會額外檢查用戶名這塊區域的字符合法性,所以很多sql注入的方式會被這層檢測攔下來,也不失為一種防御手段,這里面只有游民星空這個網站出現了異樣,很久沒有登陸反饋,預測產生了一些影響吧,輸點別的還是挺正常的。
然后就找了些網友們推薦的可以嘗試一下的SQL注入點,這里首先嘗試的是testfire的一個頁面,簡單的username='or 1=1#是不奏效的,我在嘗試時在Username字段中輸入admin'OR'l,在Password字段中輸入test'OR'1,單擊Login按鈕,你會發現你進入了用戶賬戶!大家都可以試一下,這個網站有故意成為靶機的意思哦!
這個網站攻擊原理是將SQL語句改為了SELECT * FROM [users] WHERE username= 'admin' OR '1' AND password='test' OR '1'。是不是很巧妙,不光用戶名可以設計,密碼字段也可以稍加設計,做到SQL注入,這才使得我們成功進入這個網站的后台。
不知道這樣能不能算作一次SQL注入實驗呢?
i春秋還提供有SQL注入的更詳細的介紹和技巧,可以跟進關注一下!
實驗感想
在網上找了非常多的登錄界面,嘗試使用SQL注入繞開登錄認證階段,但是事實上大部分的網站是無法以現有水平進行攻擊的,現在的用戶名可能不是使用用戶輸入的原樣,合成SQL語句進行數據庫訪問,而是進行了一些處理和防范。有些網站會在頁面上寫入JavaScript進行用戶名格式判斷,過濾掉不符合要求的用戶名格式,用戶即使不點提交也會提示格式錯誤,這樣可以在極大程度上避免純粹的SQL注入設計好的字符直接對數據庫進行處理,也是比較廉價的方式,相對應的,這個方式如果使用其它的手段繞過JavaScript檢測也是可行的,要斟酌一下這個代價是否划算。還有一種可能帶有防范措施,當服務器察覺到傳輸數據可能造成SQL注入,則會斷開連接,使瀏覽器與網站失去連接,也是比較常見的一種防護措施。再有就是不直接使用用戶名進行查找,這個雖然是我自己想的但是很有可能規避SQL注入攻擊,將輸入的這些字段進行哈希運算,近似一一對應很難撞庫暫不考慮這個特殊情況,利用哈希值進行比對;由於密碼哈希算法是不可逆的,從哈希值逆運算找到對應的明文計算上不可行,很難找到對應可以SQL注入的明文,所以可以實現SQL注入的防御。
總而言之,本次實驗能教給我們的只是需要預防SQL,僅僅做實驗達到效果是遠遠不夠的,更需要我們理解原理,想出應對之策,避免自身損失。