1.本實踐的具體要求有:javascript
(1) Web前端HTML(0.5分)php
能正常安裝、啓停Apache。理解HTML,理解表單,理解GET與POST方法,編寫一個含有表單的HTML。css
(2) Web前端javascipt(0.5分)html
理解JavaScript的基本功能,理解DOM。編寫JavaScript驗證用戶名、密碼的規則。前端
(3) Web後端:MySQL基礎:正常安裝、啓動MySQL,建庫、建立用戶、修改密碼、建表(0.5分)java
(4) Web後端:編寫PHP網頁,鏈接數據庫,進行用戶認證(1分)mysql
(5) 最簡單的SQL注入,XSS攻擊測試(1分)web
功能描述:用戶能登錄,登錄用戶名密碼保存在數據庫中,登錄成功顯示歡迎頁面。sql
課題負責人須要完成:登錄後能夠發貼;會話管理。數據庫
(1)什麼是表單
(2)瀏覽器能夠解析運行什麼語言。
瀏覽器屬於Web前端,一般能夠識別HTML、CSS和JS語言等。
(3)WebServer支持哪些動態語言
查了一下資料得知,常見的有3種語言ASP、JSP和PHP。
模塊分類:
apachectl -v
來查看版本,出現版本號,則證實Linux已安裝Apache。service apache2 start
打開Apache服務器,若是沒有任何錯誤提示,代表已成功開啓。127.0.0.1
,若是能夠成功打開Apache的默認網址則證實Apache已經開啓。/var/www/html
也就是Apache目錄下,新建一個簡單的含有表單的html文件simple_form.html
的文件。內容以下:<html> <head> <title>CryptoTeam</title> <!-- Meta tag Keywords --> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <!-- Meta tag Keywords --> </head> <body> <style type="text/css"> body{ background-image:url("manwei.jpg"); background-position:center; background-repeat:no-repeat; } </style> <div style="text-align:center;margin-top:120px"> <!--main--> <!--//header--> <h2 align="center"><font size=6>Login</font></h2> <center> <form action="login" method="post"> <input placeholder="E-mail or your name" name="Name" class="user" type="email"> <br> </br> <input placeholder="Password" name="Password" class="pass" type="password"> <br> </br> <input type="submit" value="Enter"> </form> </center> <!--//main--> </div> </body> </html>
在瀏覽器嘗試打開
simple_form.html
的基礎上,能夠添加一段javascript
代碼,以完成對用戶是否填寫郵箱和密碼的判斷。修改後的login_test.html
以下圖所示:<!-- Meta tag Keywords --> </head> <body> <style type="text/css"> body{ background-image:url("manwei.jpg"); background-position:center; background-repeat:no-repeat; } </style> <div style="text-align:center;margin-top:120px"> <!--main--> <!--//header--> <h2 align="center"><font size=6>Login</font></h2> <form action="login" method="post" name="form_login"> <input placeholder="E-mail" name="Email" class="user" type="email" onfocus="if (this.value=='Your email') this.value='';" /> <br> </br> <input placeholder="Password" name="Password" class="pass" type="password" onfocus="if (this.value=='Your password') this.value='';"/> <br> </br> <input type="submit" value="Login" onClick="return validateLogin()"/> </form> <!--//main--> </div> <script language="javascript"> function validateLogin(){ var sUserName = document.form_login.Email.value ; var sPassword = document.form_login.Password.value ; if ((sUserName =="") || (sUserName=="Your email")){ alert("user email!"); return false ; } if ((sPassword =="") || (sPassword=="Your password")){ alert("password!"); return false ; } } </script> </body> </html>
file:///var/www/html/login_test.html
,也能夠直接打開login_test.html
,,若是用戶郵箱或密碼未填寫就提交,網頁會報提示:/etc/init.d/mysql start
。mysql -u root -p
使用root權限進入,默認密碼是password
:update user set password=PASSWORD("新密碼") where user = 'root';
來修改密碼;輸入flush privileges;
更新權限
exit
退出數據庫,能夠嘗試使用新的密碼登陸。create database 數據庫名稱;
創建數據庫。我輸入的是create database xyx;
創建了一個名爲xyx
的數據庫。show database;
能夠查看存在的數據庫:use 數據庫名稱;
,使用咱們建立的數據庫,即對數據庫作一些編輯操做。create table 表名稱 (列名稱1 數據類型,列名稱2 數據類型,···)
建立數據庫中的表,並設置相應字段,如圖所示,我輸入的是create table login_table(username VARCHAR(20),password VARCHAR(20));
建立了一個名爲login_table
的列表,且表中設置了兩列,分別爲username
和password
,均存儲VARCHAR數據類型,最大長度爲20show tables;
查看錶的基本信息;如圖所示,能夠看到咱們的數據庫xyx
中有一個表爲login_table
:insert into 代表 values('值1','值2','值3',···);
,注意值的順序是按照咱們設置的表中列的順序來的。select * from 表名;
查詢表中的數據,能夠看到咱們 表已經出現。grant select,insert,update,delete on 數據庫.* to 用戶名@登陸主機(能夠是localhost,也能夠是遠程登陸方式的IP) identified by "密碼";
,意爲對某數據庫中全部表的select,insert,update,delete權限授予某ip登陸的某用戶。登陸成功,說明新用戶增長成功
/var/www/html
目錄下新建立一個PHP測試文件phptest.php
<?php echo ($_GET["a"]); include($_GET["a"]); echo "This is my php test page!<br>"; ?>
localhost:80/phptest.php?a=/etc/passwd
,可看到etc/passwd
文件的內容:login_test.html
的文件中的action
部分要與PHP
文件的文件名對應,而且在mysqli
對象創建的時候,要對應參數(主機號,用戶名,密碼,數據庫名)
,修改後的login.php
代碼以下:<?php $uname=$_POST["Email"]; $pwd=$_POST["Password"]; echo $uname; $query_str="SELECT * FROM login_table where username='$uname' and password='$pwd';"; $mysqli = new mysqli("127.0.0.1", "xiayunxiao", "123456", "xyx"); $query_str1="use xyx;"; /* 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_str1)) echo"<br>Success into database!"; echo$uname; if ($result = $mysqli->query($query_str)) { if ($result->num_rows > 0 ){ echo "<br> {$uname}:Welcome login!! <br> "; } else { echo "<br> login failed!!!! <br> " ; } /* free result set */ $result->close(); } $mysqli->close(); ?>
127.0.0.1/login_test.html
訪問本身的登陸界面。SQL注入,就是經過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器質性惡意的SQL命令。具體來講,它是利用現有應用程序,將(惡意的)SQL命令注入到後臺數據庫引擎質性的能力,它能夠經過在Web表單中輸入(惡意)SQL語句獲得一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。
' or 1=1#
,密碼任意輸入,就能夠登陸成功了。這是由於,咱們輸入的用戶名在數據庫中都會轉換成SQL語句中的select語句,而輸入' or 1=1#
時,語句變成了
select * from users where username='' or 1=1#' and password=''
這就有意思了,#
至關於註釋符,會把後面的內容註釋表,而1=1
是永真式,因此這個條件永遠成立,無論密碼是否輸入正確,都可以登錄成功。
跨站腳本攻擊(Cross Site Scripting),爲不和層疊式樣式表(Cascading Style Sheets,CSS)的縮寫混淆。故將跨站腳本攻擊縮寫爲XSS。XSS是一種常常出如今web應用中的計算機安全漏洞,它容許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。好比這些代碼包括HTML代碼和客戶端腳本。攻擊者利用XSS漏洞旁路的訪問控制--例如同源策略(same origin policy)。這種類型的漏洞因爲被黑客用來編寫危害性更大的phishing攻擊而變得廣爲人知。
/var/www/html
目錄下,在用戶名輸入框輸入<img src="spiderman.jpg" />
,密碼任意,就能夠讀取圖片了。本次實驗由於本身對於數據庫方面的知識只是java課上接觸點兒皮毛,因此仍是遇到一些問題,但願對你們有所幫助。
Q1:在我輸入127.0.0.1/login.html
時,沒法顯示頁面。
A1:遇到這種問題,首先要在網址欄中輸入127.0.0.1
看看本身的Apache服務器是否已經打開。第二,看看咱們的網頁名字是否正確,也就是本身的var/www/html
目錄下是否存在着這樣一個網頁。我屬於第二種,本身的網頁名字爲login_test.html
,哈哈哈哈。
Q2:本身的用戶名和密碼均輸入正確,但老是顯示沒法鏈接數據庫。
A2:這就須要查看本身的login_test.html
和login.php
的對應關係。如圖所示,個人login_test.html
的Name中的name
和login.php
中的變量uname
和pwd
要對應起來。
Q3:在作SQL注入攻擊時,輸入攻擊語句時,提示只能輸入email
。
A3:查看本身的login_test.html
,在用戶名輸入欄中的type
欄中輸入爲email
,因此只能識別email
,咱們能夠將其改成text
,這樣就能識別文本類型了。
本次實驗的過程容易理解,本身編寫一個網頁,而後進行攻擊,並且綜合性比較強,既有劉念老師的網絡安全編程課的知識,也有數據庫的知識,因此,打好基礎很重要,在數據庫方面本身還須要多加練習,另外,感謝同窗們在實驗過程當中對我提供了幫助。但願本身能在從此的實驗中能更加努力。