本實踐的目標理解經常使用網絡欺詐背後的原理,以提升防範意識,並提出具體防範方法。javascript
返回目錄php
Web前端HTML(0.5分)
能正常安裝、啓停Apache。理解HTML,理解表單,理解GET與POST方法,編寫一個含有表單的HTML。html
Web前端javascipt(0.5分)
理解JavaScript的基本功能,理解DOM。編寫JavaScript驗證用戶名、密碼的規則。前端
Web後端:MySQL基礎:正常安裝、啓動MySQL,建庫、建立用戶、修改密碼、建表(0.5分)java
Web後端:編寫PHP網頁,鏈接數據庫,進行用戶認證(1分)mysql
最簡單的SQL注入,XSS攻擊測試(1分)web
功能描述:用戶能登錄,登錄用戶名密碼保存在數據庫中,登錄成功顯示歡迎頁面。sql
課題負責人須要完成:登錄後能夠發貼;會話管理。
返回目錄數據庫
返回目錄apache
本實驗使用的環境是Kali2,默認已安裝Apache,直接使用service apache2 start
命令打開Apache服務便可,輸入在瀏覽器輸入127.0.0.1能夠查看Apache是否已經啓動:
下面咱們開始編寫前端HTML文件,下面是我找別人的一個demo:
<html> <head> <title>CryptoTeam</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <h2>This is a Login Form</h2> <form action="login" method="post"> <input placeholder="E-mail" name="Name" class="user" type="email"> <br> </br> <input placeholder="Password" name="Password" class="pass" type="password"> <br> </br> <input type="submit" value="Login"> </form> </body> </html>
咱們把這個文件放到/var/www/html下,由於這個是Apache目錄默認目錄。
簡單分析一下段代碼:
下面咱們添加javascipt,主要功能是檢測email框或者pwd框是否輸入爲空:
<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>
我直接把這一段加到html文件的form標籤的下面,分析一下代碼:
比較直觀的邏輯,由於這裏涉及到對錶單的輸入進行操做,因此咱們須要對以前表單的一些屬性進行修改:
<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>
如上,你們比較一下就能夠發現:
下面咱們來進行後端編程,輸入/etc/init.d/mysql start
開啓MySQL服務
輸入mysql -u root -p
使用root權限進入,默認的密碼是你用戶的pwd,咱們登陸進取後能夠改密碼:
嗯,出現了一點小問題,看錯誤提示,說沒有選擇數據庫,那咱們就選一個再改:
輸入flush privileges;
,更新權限,而後退出exit
從新登陸一下:
看起來貌似沒問題了,咱們新建一個數據庫create database 數據庫名稱;
,以後能夠用show databases;
查看:
使用use 數據庫名稱;
使用咱們建立的數據庫,而後在裏面建立一個數據表create table 表名 (字段設定列表);
插入數據insert into 表名 values('值1','值2','值3'...);
:
OK,進行到這裏沒問題了
下面是額外的操做,若是你想使用其餘用戶登陸的話,能夠將這個數據庫受權給另一個用戶:
grant select,insert,update,delete on 數據庫名.* to 用戶名@登陸主機 identified by "密碼";
解釋一下命令,
grant,受權;
select,insert,update,delete,是權限的類別;
數據庫名.*,是數據庫xxx下的全部表;
to 用戶名@登陸主機,用戶名你本身的,能夠是遠程用戶,登陸主機能夠寫本機localhost,也能夠是遠程IP地址;
identified by "密碼",至關於設置登陸密碼;
這樣寫的大概意思就是告訴MySQL,那個登陸名是xxx,密碼是xxx,地址是xxx的能夠操做個人xxx數據庫,容許的操做是select,insert,update,delete。
登陸一下MySQL試一試:
沒問題。
下面是寫PHP文件,對於咱們的前端HTML文件來講,通常只進行前端上的操做,進行數據的處理雖然也能夠,可是會使得文件十分臃腫,而且因爲其餘人訪問HTML文件時是會下載你的這個文件的,處理數據的操做會被人家看到,而且數據處理通常是要放在服務器這邊跑的……
那麼咱們再copy一下別人的代碼(懶):
<?php $uname=$_POST["Email"]; $pwd=$_POST["Password"]; echo $uname; $query_str="SELECT * FROM users_table where username='$uname' and password='$pwd';"; $mysqli = new mysqli("127.0.0.1", "testuser", "123456", "test5322"); if ($mysqli->connect_errno) { printf("Connect failed: %s\n", $mysqli->connect_error); exit(); } echo "connection ok!"; if ($result = $mysqli->query($query_str)) { if ($result->num_rows > 0 ){ echo "<br> {$uname}:Welcome!!! <br> "; } else { echo "<br> login failed!!!! <br> " ; } /* free result set */ $result->close(); } $mysqli->close(); ?>
雖然是copy,可是咱們仍是要看懂這個操做的原理的,繼續進行分析:
很直觀的代碼,咱們試試吧,在瀏覽器地址輸入127.0.0.1/login.php
:
嗯?不對嗎?檢查一下用戶和密碼:
好像沒錯啊,試試用root用戶:
好像仍是錯了?
回頭檢查一下,找到緣由:在受權的時候我受權成數據表而不是數據庫了……,趕忙改過來,其實能夠用grant all
將全部權限都給出去的。
而後咱們試試登陸127.0.0.1/test5322_index.html
看看,由於以前的頁面只有前端沒後端,沒法處理數據:
嗯哼,找不到file,多是我某個地方的文件名輸入錯了,check一下代碼:
<form action="login" method="post" name="form_login">
在HTML文件中找到表單的action屬性,發現這個是以前我隨便輸入action,由於那時沒有後端文件,在有login.php文件後,也要將相應的action屬性改成action="login.php"再試試:
bingo
' or 1=1#
吧,直接在用戶名中輸入:<input placeholder="E-mail" name="Email" class="user" type="email" onfocus="if (this.value=='Your email') this.value='';" />
這裏的input標籤的類別屬性是type="email",怪不得只能輸入email呢,這裏咱們爲了實現SQL注入就僞裝它不安全的使用了type="text"這個類別吧!
這樣的話咱們再輸入' or 1=1#
就不會報錯了,這樣的話傳值後咱們後端生成的SQL語句爲:select * from users where username=' ' or 1=1 #' and password=' '
其中username=' '爲假,1=1爲真,用or鏈接,username=' ' or 1=1
就爲真了,而後再註釋掉' and password=' ',MySQL理解爲:
select * from users where username=' ' or 1=1
這固然是永真的,因此MySQL就:
<img src="test.jpg" />
:此次試驗比較簡單,我是照着同窗的博客作的,由於這個時間段碰上大創答辯、共建結題和國賽半決賽,因此決定這樣寫。
作實驗加上問題的解決一共花了一個半小時,由於比較熟悉HTML和JS,之前也搭建過網站和博客,遇到問題解決的也快。