20155201 網絡攻防技術 實驗八 Web基礎
20155201 網絡攻防技術 實驗八 Web基礎
一、實踐內容
- Web前端HTML,能正常安裝、啟停Apache。理解HTML,理解表單,理解GET與POST方法,編寫一個含有表單的HTML。
- Web前端javascipt,理解JavaScript的基本功能,理解DOM。編寫JavaScript驗證用戶名、密碼的規則。
- Web後端:MySQL基礎:正常安裝、啟動MySQL,建庫、創建用戶、修改密碼、建表。
- Web後端:編寫PHP網頁,連接數據庫,進行用戶認證。
- 最簡單的SQL註入,XSS攻擊測試;功能描述:用戶能登陸,登陸用戶名密碼保存在數據庫中,登陸成功顯示歡迎頁面。
二、報告內容:
1. 基礎問題回答
1)什麽是表單?
表單在網頁中主要負責數據采集功能。一個表單有三個基本組成部分: 表單標簽:這裏面包含了處理表單數據所用CGI程序的URL以及數據提交到服務器的方法。
表單域:包含了文本框、密碼框、隱藏域、多行文本框、復選框、單選框、下拉選擇框和文件上傳框等。 表單按鈕:包括提交按鈕、復位按鈕和一般按鈕;用於將數據傳送到服務器上的CGI腳本或者取消輸入,還可以用表單按鈕來控制其他定義了處理腳本的處理工作。
2)瀏覽器可以解析運行什麽語言?
HTML,XML,Python,PHP,JavaScript,ASP等腳本語言。
3)WebServer支持哪些動態語言
JavaScript、ASP、PHP、Ruby等腳本語言。
2. 實踐總結與體會
這次實驗按照上一屆學長的博客來做,直接粘貼代碼還出了點問題,花了點時間結果發現是一個很簡單的代碼的錯誤,改正了之後一切都還比較順利,其他問題同學們都有解決辦法;這次實驗準備的部分包含了上個學期網絡安全編程基礎的Java Web部分,代碼還是需要回憶一下子才能搞定,完成全部內容花了點時間,但更重要的是對數據庫知識的回憶、對攻擊部分的了解,解析,感覺收獲很多。
3. 實踐過程記錄
- Web前端HTML
- Web前端javascipt
- Web後端Mysql基礎
- Web後端PHP
- SQL註入攻擊、XSS攻擊測試
Web前端:HTML
- 我們的Web開發是基於Apache服務器進行的,直接用指令
sudo apt-get install apache2
netstat -tupln |grep 80
指令查看80端口被哪些進程占用,如果有占用記得kill掉~使用指令apachectl start
打開Apache服務 - 在Firefox中輸入
127.0.0.1:80
,是Apache的默認網頁,服務器正常開啟 之後
cd /var/www/html
進入到Apache的工作目錄下,vi test1.html
新建一個含有表單的html文件,我們常用的登錄頁面一般就是用表單向後臺提交數據,所以可以編寫一個簡單的登錄頁面,代碼如下:<html> <head> <title>test</title> </head> <body> <table> <form method ="POST" action="#" name="frmLogin" > <tr> <td>username: </td> <td><input type="text" name="username" value="Your name" size="20" maxlength="20" /></td> <td> </td> <td> </td> </tr> <tr> <td>password:</td> <td><input type="password" name="password" value="Your password" size="20" maxlength="20" /></td> <td> </td> <td> </td> </tr> <tr> <td><input type="checkbox" name="zlogin" value="1">auto-Login</td> </tr> <table> <tr> <td><input type="submit" name="login" value="Login" /></td> <td><input type="reset" name="rs" value="Reset" /></td> </tr> </table> </form> </table> </body> </html>
- 打開看下效果:
- 這裏的提交方法
method
是POST
,method屬性分Post和Get兩種,其主要區別有以下幾方面:- Get是用來從服務器上獲得數據,而Post是用來向服務器上傳遞數據
- Get是不安全的,因為在傳輸過程,數據被放在請求的URL中,而如今現有的很多服務器會將URL記錄到日誌文件中,然後存儲在某個地方,這樣就可能會泄露信息。Post的所有操作對用戶來說都是不可見的。
- Get傳輸的數據量小,Post的傳輸量大,所以在上傳文件只能使用Post;
Web前端javascipt
我們可以使用JavaScript來編寫一個驗證用戶名、密碼的規則,直接在之前的代碼上進行修改,重命名為
login_test.html
,代碼如下所示:<html> <head> <title>test</title> </head> <body> <table> <form method ="POST" action="login.php" name="frmLogin" > <tr> <td>user</td> <td><input type="text" name="username" value="Your name" size="20" onfocus="if (this.value==‘Your name‘) this.value=‘‘;" /></td> <td> </td> <td> </td> </tr> <tr> <td>password</td> <td><input type="password" name="password" value="Your password" size="20" maxlength="20" onfocus="if (this.value==‘Your password‘) this.value=‘‘;" /></td> <td> </td> <td> </td> </tr> <tr> <td><input type="checkbox" name="zlogin" value="1">auto login</td> </tr> <table> <tr> <td><input type="submit" name="login" value="login" onClick="return validateLogin()"/></td> <td><input type="reset" name="rs" value="reset" /></td> </tr> </table> </form> </table> <script language="javascript"> function validateLogin(){ var sUserName = document.frmLogin.username.value ; var sPassword = document.frmLogin.password.value ; if ((sUserName =="") || (sUserName=="Your name")){ alert("user name"); return false ; } if ((sPassword =="") || (sPassword=="Your password")){ alert("password!"); return false ; } } </script> </body> </html>
- 如果輸入的用戶名或者密碼為空時,就彈出相應的對話框,然後在點擊登錄按鈕時調用執行一遍這個函數,可以打開看看效果:
Web後端:MySQL基礎
先輸入
/etc/init.d/mysql start
指令開啟mysql服務,輸入mysql -u root -p
,並根據提示輸入密碼,默認密碼為password
,進入MySQL,註意:在MySQL中輸入命令後面都要帶一個分號作為命令結束符:- 輸入
use mysql;
,選擇mysql數據庫;輸入update user set password=PASSWORD("新密碼") where user=‘root‘;
,修改密碼;輸入flush privileges;
,更新權限 - 退出數據庫,用新密碼重新登錄
- 先使用
create database 庫名;
建立一個數據庫;使用show databases;
查看存在的數據庫;使用use 庫名;
使用我們創建的數據庫: - 使用
create table 表名 (字段設定列表);
建立數據表,數據表是數據庫中一個非常重要的對象,一個數據庫中可能包含若幹個數據表;使用show tables;
查看存在的數據表: - 使用
insert into 表名 values(‘值1‘,‘值2‘,‘值3‘...);
插入數據;使用select * from 表名;
查詢表中的數據: - 在MySQL中增加新用戶,使用
grant select,insert,update,delete on 數據庫.* to 用戶名@登錄主機(可以是localhost,也可以是遠程登錄方式的IP) identified by "密碼";
指令,這句話的意思是將對某數據庫的所有表的select,insert,update,delete權限授予某ip登錄的某用戶
。如圖所示,增加新用戶之後,退出,重新使用新用戶名和密碼進行登錄,登錄成功說明增加新用戶成功:
Web後端:PHP基礎
PHP是一種通用開源腳本語言,語法吸收了C語言、Java和Perl的特點,主要適用於Web開發領域。它可以比CGI或者Perl更快速地執行動態網頁。用PHP做出的動態頁面與其他的編程語言相比,PHP是將程序嵌入到HTML文檔中去執行,執行效率比完全生成HTML標記的CGI要高許多;PHP還可以執行編譯後代碼,編譯可以達到加密和優化代碼運行,使代碼運行更快。
在
/var/www/html
目錄下新建一個PHP測試文件,簡單了解一下它的一些語法:vi lzw_test.php
<?php echo ($_GET["a"]); include($_GET["a"]); echo "This is lxm php test page!<br>"; ?>
- 在瀏覽器網址欄中輸入
localhost:80/lzw_test.php?a=/etc/passwd
,可看到/etc/passwd
文件的內容 利用PHP和MySQL結合之前編的登錄網頁進行簡單的用戶身份認證,這裏可以參考老師給的代碼編寫
login.php
,代碼如下所示!!註意這裏跟很多學長的代碼相比有修改,不然後續是進行不下去的!!經多位同學試驗,這樣操作是可行的。<?php $uname=$_POST["username"]; $pwd=$_POST["password"]; echo $uname; $query_str="SELECT * FROM users where username=‘$uname‘ and password=‘$pwd‘;"; $mysqli = new mysqli("127.0.0.1", "lzw", "970828", "WLDK_DB"); /* check connection */ if ($mysqli->connect_errno) { printf("Connect failed: %s\n", $mysqli->connect_error); exit(); } echo "connection ok!"; /* Select queries return a resultset */ if ($result = $mysqli->multi_query($query_str)) { if ($result->num_rows > 0 ){ echo "<br> Welcome login Mr/Mrs:{$uname} <br> "; } else { echo "<br> login failed!!!! <br> " ; } /* free result set */ $result->close(); } $mysqli->close(); ?>
- 第一行中的方法修改成POST,無論是GET也行,POST也好,切記與html文件中的method一致。
- 第五行中
users
是我自己的表名,根據實際修改 - 第五行中原為
username=‘{$uname}‘ and password=‘{$pwd}‘;
,切記把大括號刪掉,其實想想就知道我們自己在數據庫裏select的時候哪裏來的大括號? - 第六行的
"lzw"
是我sql的另一個非root用戶,如果非要用root登錄會提示access denied
,970828
是lzw
用戶的密碼,WLDK_DB
是這個用戶裏面的一個數據庫database。
將之前編的登錄網頁的
login_test.html
代碼中form的action屬性由#
改成login.php
,即登錄後跳轉到login.php
,再在火狐瀏覽器中輸入localhost:80/login_test.html
訪問自己的登錄頁面- 輸入表中的username和password,登錄進行用戶認證。
- 如果是成功的,是這樣的歡迎界面:
- 如果連接庫失敗失敗,是這樣的,解決辦法是新建用戶,剛說過啦
- 如果庫、表和字段對應沒有搞清楚,很容易認證失敗,就是這樣子的
SQL註入攻擊,XSS攻擊
SQL註入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。具體來說,它是利用現有應用程序,將(惡意的)SQL命令註入到後臺數據庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。
- 在用戶名輸入框中輸入
‘ or 1=1#
,密碼隨便輸入,是可以登陸成功的。- 原理是這樣的,輸入的用戶名和我們的代碼中select語句組合起來變成了
select * from users where username=‘‘ or 1=1#‘ and password=‘‘
,#
相當於註釋符,會把後面的內容都註釋掉,而1=1
是永真式,所以這個條件永遠成立,所以能夠成功登陸,這個信息系統安全之前講過~~原來實踐起來是這樣子
- 我們還可以通過SQL註入將用戶名和密碼保存在數據庫中,但是得修改一下之前的代碼,因為我們之前編的代碼中
if ($result = $mysqli->query($query_str))
這條判斷語句不允許多條sql語句執行,所以將它改成if ($result = $mysqli->multi_query($query_str))
便能實現執行多個sql語句 - 在用戶名輸入框中輸入
‘;insert into users values(‘20155313‘,‘961222‘);#
,拆開來看就是SELECT * FROM users WHERE username=‘‘;
、insert into users values(‘20155313‘,‘961222‘);
,接著登錄,會提示登錄失敗,失敗又怎樣??還不是被窩insert了哈哈哈: - 記得把代碼中sql語句執行的代碼改回去,不然又要失敗啦。。
if ($result = $mysqli->query($query_str))
,輸入新的用戶名和密碼,登錄成功
XSS攻擊:跨站腳本攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆。故將跨站腳本攻擊縮寫為XSS。XSS是一種經常出現在web應用中的計算機安全漏洞,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。比如這些代碼包括HTML代碼和客戶端腳本。攻擊者利用XSS漏洞旁路掉訪問控制——例如同源策略(same origin policy)。這種類型的漏洞由於被駭客用來編寫危害性更大的phishing攻擊而變得廣為人知。對於跨站腳本攻擊,黑客界共識是:跨站腳本攻擊是新型的“緩沖區溢出攻擊“,而JavaScript是新型的“ShellCode”。
- 將一張可愛的圖片存入
/var/www/html
目錄 - 在用戶名輸入框中輸入
<img src="mieba.jpeg" />balabala</a>
讀取/var/www/html
目錄下的圖片:
20155201 網絡攻防技術 實驗八 Web基礎