2015219付穎卓《網絡對抗》EXP8 Web基礎
實驗後回答問題
1.什麽是表單
來自百度百科的官方定義:表單在網頁中主要負責數據采集功能。一個表單有三個基本組成部分:
表單標簽:這裏面包含了處理表單數據所用CGI程序的URL以及數據提交到服務器的方法。
表單域:包含了文本框、密碼框、隱藏域、多行文本框、復選框、單選框、下拉選擇框和文件上傳框等。
表單按鈕:包括提交按鈕、復位按鈕和
一般按鈕;用於將數據傳送到服務器上的CGI腳本或者取消輸入,還可以用表單按鈕來控制其他定義了處理腳本的處理工作。
2.瀏覽器可以解析運行什麽語言
超文本標記語言:HTML
可擴展標記語言:XML
腳本語言:ASP、PHP、Script、JavaScript、VBScript、Perl、Python、ColdFusion、Java、JSP等
3.WebServer支持哪些動態語言
ASP語言,PHP語言和JSP語言
實踐過程記錄
一、Web前端HTML
- 要求:能正常安裝、啟停Apache。理解HTML,理解表單,理解GET與POST方法,編寫一個含有表單的HTML
1.輸入sudo vi /etc/apache2/ports.conf查看apache端口情況,將80改成自己想用的數字,我用的是8080
2.通過apachectl start開啟Apache,使用netstat -aptn查看端口占用:在這裏apach2確實占用了端口8080,可以進行下一步了
3.瀏覽器中輸入localhost:8080,測試apache是否正常工作,因為上次實驗我假冒的網站是baidu,所以現在彈出來的是baidu
4.編寫一個含有表單的html,新建在Apache工作目錄/var/www/html下。我用了上學期劉念老師網絡安全編程基礎作業的表單代碼試驗了一下,除了編碼方式不同的問題有亂碼,功能沒有問題。
代碼如下:
<html> <head> <title>test</title> </head> <body> <table> <form method ="POST" action="#" name="frmLogin" > <tr> <td>用戶名:</td> <td><input type="text" name="username" value="Your name" size="20" maxlength="20" onfocus="if (this.value==‘Your name‘) this.value=‘‘;" /></td> <td> </td> <td> </td> </tr> <tr> <td>密 碼:</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">自動登錄</td> </tr> <table> <tr> <td><input type="submit" name="login" value="登錄" onClick="return validateLogin()"/></td> <td><input type="reset" name="rs" value="重置" /></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("請輸入用戶名!"); return false ; } if ((sPassword =="") || (sPassword=="Your password")){ alert("請輸入密碼!"); return false ; } } </script> </body> </html>
此代碼可以在win10下運行出來如下界面,但是在kali裏,不能支持中文,故進行了一些修改。
自己增加了一些色彩。。但是有亂碼,因為不支持中文,改為英文就好了。
當不輸入用戶名時出現如下提示:
6.因為沒有編寫相應action的php,所以submit之後指向404:not found
二、Web前端javascipt
- 要求:理解JavaScript的基本功能,理解DOM。編寫JavaScript驗證用戶名、密碼的規則。
1.JavaScript基本功能:如下圖
2.DOM概念:在網頁上,組織頁面(或文檔)的對象被組織在一個樹形結構中,用來表示文檔中對象的標準模型就稱為DOM。
3.編寫驗證用戶名和密碼的規則:(用戶名和密碼不為空)
4.實現一個javascript(表單驗證)
如果沒有填寫學號,將會出現如下:
三、Web後端:MySQL基礎:正常安裝、啟動MySQL,建庫、創建用戶、修改密碼、建表
- 在web開發中我們要用到後臺數據庫,而MySQL就是一個數據庫管理系統,類似的還有SqlServer、oracle等等,由於MySQL是開放的,不收費,所以一般中小型網站的開發都選擇MySQL作為網站數據庫。
1.先輸入/etc/init.d/mysql start指令開啟mysql服務,輸入mysql -u root -p,並根據提示輸入密碼,默認密碼為p@ssw0rd,進入MySQL,註意:在MySQL中輸入命令後面都要帶一個分號作為命令結束符,否則不執行:
2.我們可以對密碼進行修改:輸入use mysql;,選擇mysql數據庫;輸入update user set password=PASSWORD("新密碼") where user=‘root‘;,修改密碼;輸入flush privileges;,更新權限;
3.接著輸入quit退出MySQL,重新進入,使用新密碼登錄成功,說明修改成功
4.我們先使用create database 庫名;建立一個數據庫;使用show databases;查看存在的數據庫;使用use 庫名;使用我們創建的數據庫:
5.接著使用create table 表名 (字段設定列表);建立數據表,數據表是數據庫中一個非常重要的對象,一個數據庫中可能包含若幹個數據表;使用show tables查看存在的數據表:
6.使用insert into 表名 values(‘值1‘,‘值2‘,‘值3‘...);插入數據;使用select * from 表名查詢表中的數據:
Web後端:PHP基礎
- 首先PHP是一種通用開源腳本語言,語法吸收了C語言、Java和Perl的特點,主要適用於Web開發領域。它可以比CGI或者Perl更快速地執行動態網頁。用PHP做出的動態頁面與其他的編程語言相比,PHP是將程序嵌入到HTML文檔中去執行,執行效率比完全生成HTML標記的CGI要高許多;PHP還可以執行編譯後代碼,編譯可以達到加密和優化代碼運行,使代碼運行更快。
1.我們可以在/var/www/html目錄下新建一個PHP測試文件,簡單了解一下它的一些語法:
<?php
echo ($_GET["a"]);
include($_GET["a"]);
echo "This is lxm php test page!<br>";
?>
2.瀏覽器打開localhost:80/lxm_test.php?a=/etc/passwd可看到/etc/passwd文件的內容,註意PHP變量大小寫敏感:
簡單測試完成後,我們可以利用PHP和MySQL結合之前編的登錄網頁進行簡單的用戶身份認證,這裏可以參考老師給的代碼編寫fyz_test.php,代碼如下所示:
<?php
$uname=($_POST["username"]);
$pwd=($_POST["password"]);
echo $uname;
$query_str="SELECT * FROM fyztable where username=‘{$uname}‘ and password=‘{$pwd}‘;";
$str="SELECT * FROM users where username=‘{$uname}‘ and password=‘password{$pwd}‘;";
$mysqli = new mysqli(‘127.0.0.1‘, ‘root‘, ‘p@ssw0rd‘, ‘fyz_test‘);
/* 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->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();
?>
3.這裏做幾點說明,如圖所示圈出的部分,第一個password那個地方老師給的代碼是調用了password函數對密碼進行了加密,但是如果數據庫裏密碼沒有加密的話,最後輸入的值比對肯定不會相等,登陸不成功,所以要把password那個函數去掉,第二個127.0.0.1是本機地址,root是MySQL的用戶名p@ssw0rd之前的登錄密碼,fyz_test是數據庫的庫名。
但是不管輸入對的還是錯誤的用戶名密碼,顯示的都是下圖,登錄失敗。
這時進入/etc/mysql目錄下,執行sudo vi debian.cnf或者sudo
vimdebian.cnf查看裏面的用戶名和密碼,
然後使用這個文件中的用戶名和密碼進入mysql但還是被拒絕了。
之後我還下載了自帶的phpmyadmian數據庫。以為會有幫助。
但還是不行,我才意識到肯定是代碼有問題,於是我仔細看看別的同學的代碼。發現!自己就是個傻子
改為post就好了。。。。
SQL註入
- 1.SQL註入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。具體來說,它是利用現有應用程序,將(惡意的)SQL命令註入到後臺數據庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。
- 在用戶名輸入框中輸入‘ or 1=1#,密碼隨便輸入,這時候的合成後的SQL查詢語句為
select * from lxmtable 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 zxtable values(‘cjd‘,‘5219‘);#
拆開來看就是
SELECT * FROM zxtable WHERE username=‘‘;、insert into zxtable values(‘cjd‘,‘5219‘,);
,接著登錄,再去查數據庫:發現真的多了一行數據。
有這行數據當做用戶名密碼登錄試試看,果然可以登上了。
XSS攻擊
XSS攻擊:跨站腳本攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆。故將跨站腳本攻擊縮寫為XSS。XSS是一種經常出現在web應用中的計算機安全漏洞,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。比如這些代碼包括HTML代碼和客戶端腳本。攻擊者利用XSS漏洞旁路掉訪問控制——例如同源策略(same origin policy)。這種類型的漏洞由於被駭客用來編寫危害性更大的phishing攻擊而變得廣為人知。對於跨站腳本攻擊,黑客界共識是:跨站腳本攻擊是新型的“緩沖區溢出攻擊“,而JavaScript是新型的“ShellCode”。
我們可以進行一個簡單的測試,在用戶名輸入框中輸入讀取/var/www/html目錄下的圖片:
實驗總結與體會
這次實驗雖有上學期劉念老師《網絡安全編程基礎》的知識基礎,但新知識量還是比較大,理應耗時較長,幸在天晨同學博客寫的非常好,搬用她的代碼做實驗沒有用太長時間。但我知道這是遠遠不夠的,因為很多理論知識的理解還有欠缺,代碼也理解的不夠充分,應該繼續努力。而且,我耗時很多天完成的實驗,中間遇到很多問題,一一解決了,但有的沒有記錄,總之還是完成了,覺得自己挺牛逼的。
2015219付穎卓《網絡對抗》EXP8 Web基礎