Exp 8 Web綜合
20184312孫靜
一、基礎問題回答
1.什么是表單
表單是一個包含表單元素的區域,表單元素是允許用戶在表單中(比如:文本域、下拉列表、單選框、復選框等等)輸入信息的元素,表單在網頁中主要負責數據采集功能,一個表單有三個基本組成部分:表單標簽、表單域、表單按鈕。
2.瀏覽器可以解析運行什么語言
支持HTML(超文本標記語言)、XML(可擴展標記語言)以及Python、PHP、JavaScript、ASP等眾多腳本語言。
3.WebServer支持哪些動態語言
JavaScript、ASP、PHP、Ruby等腳本語言,ASP基於IIS WEB SERVER,是微軟的服務器端腳本技術,PHP基於APACHE WEB SERVER,與ASP有幾分類似,都是一種在服務器端執行的嵌入HTML文檔的腳本語言。
4.防范注入攻擊的方法有哪些
一是可以替換單引號,即把所有單獨出現的單引號改成兩個單引號,防止攻擊者修改SQL命令的含義;
二是限制表單或查詢字符串輸入的長度。如果用戶的登錄名字最多只有10個字符,那么不要認可表單中輸入的10個以上的字符,這將大大增加攻擊者在SQL命令中插入有害代碼的難度。
三是檢查用戶輸入的合法性,確信輸入的內容只包含合法的數據。數據檢查應當在客戶端和服務器端都執行——之所以要執行服務器端驗證,是為了彌補客戶端驗證機制脆弱的安全性。
四是將用戶登錄名稱、密碼等數據加密保存。加密用戶輸入的數據,然后再將它與數據庫中保存的數據比較,這相當於對用戶輸入的數據進行了“消毒”處理,用戶輸入的數據不再對數據庫有任何特殊的意義,從而也就防止了攻擊者注入SQL命令。
二、實驗過程記錄
(一)Web前端HTML
1. 安裝、配置、停止Apache2
(1)安裝
sudo apt-get install apache2//命令進行安裝 service apache2 start //啟動
service apache2 stop //關閉
(2)重要目錄、文件
/etc/apache2/apache2.conf //存儲了apache2的配置 /var/www/html //存儲網頁 /var/log/apache2/error.log //存儲報錯信息
(3)apache2偵聽端口
使用命令
netstat -aptn
查看端口信息,如果80端口被Apache2監聽,則啟動成功。
從圖中可以看出,80端口已經被apache2監聽。
如果80端口被其它應用占用,可以使用 netstat -tupln | grep 80 查看占用80端口的應用PID, 然后 kill processID(進程ID) 關閉此進程,再次開啟Apache即可;也可以通過修改ports.conf的方法,把Apache的默認端口從80改為其他的未被占用的端口。
(4)測試
測試1:
瀏覽器打開 127.0.0.1,如下圖所示,可正常打開Apache介紹網頁
測試2:
在終端輸入命令
vi /var/www/html/test4312.txt
進入編輯器,輸入20184312sunjing
瀏覽器打開 127.0.0.1/test4312.txt 可看到輸入的內容
2. 編寫一個含有表單的HTML,理解HTML,理解表單,理解GET與POST方法
HTML表單教程請查看https://www.w3school.com.cn/html/html_forms.asp
w3school支持運行編寫好的html代碼,可以在網站上調試好后再新建html。
method 屬性:
<form> 標簽的 method 屬性中指明表單處理服務器要用方法來處理數據,可以使用POST或者GET方法。
如果采用 POST 方法,瀏覽器將會按照下面兩步來發送數據。首先,瀏覽器將與 action 屬性中指定的表單處理服務器建立聯系,一旦建立連接之后,瀏覽器就會按分段傳輸的方法將數據發送給服務器。
另一種情況是采用 GET 方法,這時瀏覽器會與表單處理服務器建立連接,然后直接在一個傳輸步驟中發送所有的表單數據:瀏覽器會將數據直接附在表單的 action URL 之后。這兩者之間用問號進行分隔。
(1)POST方法
我的代碼如下:
<html> <body> <h1>用戶登錄</h1> <form action="/demo/html/action_page.php" target="_blank" method="POST"> <label for="fname">賬號:</label><br> <input type="text" id="username" name="username" ><br> <label for="lname">密碼:</label><br> <input type="password" id="password" name="password"><br><br> <input type="submit" value="登錄"> </form> </body> </html>
效果如下所示:
在終端命令行輸入
vi /var/www/html/submit_4312.html
進入編輯模式后,將代碼進行復制,保存退出編輯頁面。
在瀏覽器端打開對應的 http://127.0.0.1/submit_4312.html,如下所示
除了文字亂碼以外,其余均和預期的一樣。
亂碼解決方法:
在代碼<body>標簽下添加一行關於編碼的內容,“<meta charset="utf-8">”
再次進入 http://127.0.0.1/submit_4312.html,如下所示,字符可以正常顯示。
點擊登錄,查看效果
可看到瀏覽器欄中為http://127.0.0.1/demo/html/action_page.php,因為當前采用的傳送方法是POST ,會將輸入信息傳送給action_page.php。
(2)GET方法
將method設置為GET,按照上述步驟再次進行查看
可看到瀏覽器欄中顯示了剛剛輸入的賬號20184312,密碼sunjing。
采用GET方式,則會將輸入的信息(這里是賬號及密碼)顯示到表單的 action URL 之后。
(二)Web前端javascipt
JavaScript是一種屬於網絡的腳本語言,已經被廣泛用於Web應用開發,常用來為網頁添加各式各樣的動態功能,為用戶提供更流暢美觀的瀏覽效果,通常JavaScript腳本是通過嵌入在HTML中來實現自身的功能的。
前段JavaScript腳本語言可以訪問https://www.w3school.com.cn/js/js_validation.asp網站進行簡單學習
1. 在(1)的基礎上,編寫JavaScript驗證用戶名、密碼的規則,在用戶點擊登陸按鈕后回顯“歡迎+輸入的用戶名”。
代碼如下:
驗證用戶名密碼的規則是二者不為空,二者有一為空則彈出“賬號密碼不能為空”的對話框。
在點擊登錄並且賬號密碼符合規則將彈出“歡迎+用戶名”的對話框。
<html> <head> <script> function validateForm() { var x = Form.username.value; var y = Form.password.value; if ((x == "")||(y == "")) { alert("賬號密碼不能為空"); return false; }else alert("歡迎"+x); } </script> </head> <body>
<meta charset="utf-8"> <h1>用戶登錄</h1> <form name="Form"action="/demo/html/action_page.php"onsubmit="return validateForm()" target="_blank" method="POST"> <label for="fname">賬號:</label><br> <input type="text" id="username" name="username" ><br> <label for="lname">密碼:</label><br> <input type="password" id="password" name="password"><br><br> <input type="submit" value="登錄"> </form> </body> </html>
onsubmit="return validateForm()"表示一旦點擊提交將會觸發validateForm函數。
alert():用來簡單而明了地將alert()括號內的文本信息顯示在對話框中,要顯示的信息放置在括號內,該對話框上包含一個“確認”按鈕,用戶閱讀完所顯示的信息后,只需單擊該按鈕就可以關閉對話框。
validateForm中x 為輸入表單的 username的值,y為password的值,對x和y的值進行判斷,若有一個為空則alert("賬號密碼不能為空"),若二者均不為空則alert("歡迎"+x),變量x存放用戶輸入的賬號值。
在終端命令行輸入
vi /var/www/html/javascript_4312.html
新建一個html文件,進入編輯頁面后將代碼進行復制粘貼,在瀏覽器端進入http://127.0.0.1/javascript_4312.html,效果如下:
對編寫的規則進行測試,分別不輸入賬號密碼、只輸入賬號、只輸入密碼,效果如下,都會彈出“賬號密碼不能為空”的對話框。
接下來輸入正確的賬號密碼進行測試,我輸入的賬號為sunjing,密碼為20184312,點擊登錄后效果如下所示,會彈出一個“歡迎sunjing”的對話框。
為了和數據庫中的屬性對應,新增加了用戶名,實現原理與上面的代碼類似。
2. 理解DOM
DOM(document object model)文檔對象模型,是一項W3C 標准,是針對HTML和XML的一個API(應用程序接口)。它將web頁面和JavaScript連接起來,允許程序和腳本動態地訪問、更新文檔的內容、結構和樣式。它提供了對文檔的結構化的表述,並定義了一種方式可以使從程序中對該結構進行訪問,從而改變文檔的結構,樣式和內容。它會將web頁面和腳本或程序語言連接起來。當網頁被加載時,瀏覽器會創建頁面的文檔對象模型DOM(Document Object Model)。簡單來說,DOM就好像是一個PPT的模板。
比如下面這部分html代碼,script中對p1這個標題的屬性進行定義,定義了字體顏色、樣式、大小,這里p1的內容是“用戶登錄”。
<p id="p1">用戶登錄</p> <script> document.getElementById("p1").style.color = "green"; document.getElementById("p1").style.fontFamily = "Arial"; document.getElementById("p1").style.fontSize = "larger"; </script>
顯示效果如下所示:
在這里dom相當於一個格式模板,有了模板我們只需要定義好模板對應的內容即可。
3. 嘗試注入攻擊,利用回顯用戶名注入HTML及JavaScript。
在輸入框中輸入<img src="4312.png">,點擊登錄后應該會有圖片顯示出來,但是不知道為什么,我的無法顯示,經過檢查應該是代碼的問題,但是由於本人能力有限,實在檢查不出來,所以借用班上一位同學的代碼,進行修改,如下所示。
<!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="text" name="userid" 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.userid.value == null || form1.userid.value==""){ alert("請輸入賬號"); return false; } if (form1.userpwd.value == null || form1.userpwd.value==""){ alert("請輸入密碼"); return false; } return true; } </script>
php頁面的話,可以隨便編寫一個,只要保證表單中的action與編寫的php頁面名稱一致即可。
在輸入框輸入后
<script>alert("20184312sunjing")</script>
會顯示出一個彈框,如下所示:
(三)Web后端——MySQL基礎:正常安裝、啟動MySQL,建庫、創建用戶、修改密碼、建表
在linux上執行關於安裝mysql的命令后,均顯示沒有安裝包,應該是當前版本的kali不支持mysql了,如下圖所示。
在網上查找相關教程,發現MariaDB是MySQL源代碼的一個分支,所以可以安裝mariadb試試。
(1)執行下列命令
apt-get install mariadb-client apt-get install mariadb-server
(2)配置文件
在終端輸入下列命令
vi /etc/mysql/my.cnf
進入編輯頁面后,將以下內容復制到文件中
[client-server] #default-character-set=utf8 port = 3306 socket = /tmp/mysql.sock [mysql] default-character-set=utf8
保存退出
(3)啟動mysql
在命令行終端輸入
service mysql start
這一步如果報錯,根據提示用journalctl -xe查看報錯信息,重點查看報[error]的部分,可能是配置文件出錯可能是某個文件夾沒有權限可能是磁盤滿了可能是端口被占用可能是其他奇奇怪怪的問題,總之要仔細查看報錯內容,然后對症下葯。
(4)登錄mysql
在命令行中輸入下面的指令,進行登錄,password為空
mysql -u root -p
MariaDB > 后面就可以輸入mqsql指令了
(5)查看數據庫基本信息
show databases;
注意后面有“;”
(6)修改密碼
如下所示,輸入指令:
mysql> use mysql; //這里的mysql是上一步中查詢到的數據庫名稱 mysql> select user, password, host from user;//mysql庫中的user表中存儲着用戶名、密碼與權限 mysql>UPDATE user SET password=20184312 WHERE user='root'; //20184312是我設置的密碼 mysql>flush privileges; mysql>quit; //退出數據
修改完成后再輸入登錄指令測試密碼修改是否成功
mysql -u root -p
(7)創建用戶
創建新用戶,用戶名為sunjing,localhost表示此用戶為本地用戶,密碼是20184312:
create user 'sunjing'@'localhost' identified by '20184312';
授予新用戶root用戶的所有權限:
grant all privileges on root.* to 'sunjing'@'localhost' identified by '20184312'; flush privileges;
測試新用戶:
mysql -u sunjing -p
可以正常登錄。
(8)建庫建表
新建名稱為“sunjing_test”的庫,注意單引號的格式,否則會報錯。
CREATE SCHEMA `sunjing_test`;
詳細數據庫教程網上有很多,大家可以自行學習一下,下面是一些常用命令:
create database `nbuna`;//創建數據庫,引號內容為數據庫名稱 drop database `nbuna`;//刪除數據庫 show databases;//查看數據庫 use mysql;//選擇數據庫
drop table users;//刪除表 select * from users;//查詢users表中的所有元組 alter table users drop column enabled;//刪除users表中的enabled屬性列; insert into users (ename,hiredate,sal,deptno) values ('jack','2000-01-01','2000',1);//在users表中新增記錄,指定字段 insert into users values ('lisa','2010-01-01','8000',2);//在users表中新增記錄,可以不指定字段,但要一一對應 delete from users where userid='20184312';//從users表中刪除userid為20184312的記錄
在sunjing_test數據庫中新建名為users的表,表中包含userid、username、password、enabled四項屬性。
CREATE TABLE `sunjing_test`.`users` (`userid` INT NOT NULL COMMENT '',`username` VARCHAR(45) NULL COMMENT '', `password` VARCHAR(256) NULL COMMENT '', PRIMARY KEY (`userid`) COMMENT '');
在users表中插入一條記錄
insert into users (userid,username,password) values ('20184312','sunjing','20184312');
查看記錄:
select * from users;
(四)Web后端——編寫PHP網頁,連接數據庫,進行用戶認證
1. PHP安裝
使用命令
sudo apt-get install php
命令進行安裝,PHP安裝完即可正常使用,不需要修改配置。
2. PHP簡單編程
(1)測試PHP能否正常工作
輸入指令
vi /var/www/html/test.php
內容為
<?php include($_GET["a"]); ?>
大概意思是將“a”的內容取出來顯示在頁面上
保存退出后在瀏覽器打開 http://127.0.0.1/test.php?a=/var/www/html/test4312.txt ,這里我將a設置成了/var/www/html/test4312.txt文件,所以頁面顯示出來是文件的內容,如下所示。
(2)嘗試獲取表單數據
代碼如下:
<!DOCTYPE html> <html> <body> <?php echo "我的第一段 PHP 腳本!"; $uid=($_GET["userid"]); $uname=($_GET["username"]); $pwd=($_GET["password"]); echo $uid; echo $uname; echo $pwd; ?> </body> </html>
代碼中的參數userid、username、password是從html表單輸入的內容,輸入后會傳遞給php。這里直接在地址欄后添加上?userid=20184312&username=sunjing&password=20184312,測試能否正常回顯。
3.安裝PHP-MYSQL開發庫,連接數據庫,進行用戶認證
執行下列兩條指令
apt-get install php7.4-mysql
apt-get install php7.4-mysqli
安裝完成后可以通以下指令確認mysql mysqli的安裝結果。
locate mysql.so
locate mysqli.so
此時需要將之前寫的html前端頁面和mysql數據庫連接起來,二者之間的“橋”就是php代碼。
訪問html頁面前記得打開apache2服務。
html前端代碼如下:
!注意:
(1)表單中的action="XXXX.php",XXXX.php應該為你所編寫的php文件的文件名
(2)method="POST"/"GET",method的選擇要與php代碼中的接收方式一致。
php代碼如下:
內容的3-5行表示將html傳送的數據存放到uid、uname、pwd三個變量中;
9行中$query_str變存放的是數據庫查詢命令語句,在數據庫中查詢輸入的賬號、用戶名、密碼;
13行是關於登錄數據庫的操作,括號中的4個參數含義分別為 本機地址、用戶名、密碼、需要進行操作的數據庫的名稱;
16到20行含義是,若數據庫登錄失敗則將錯誤信息打印出來,登錄成功輸出“connection ok!”;
22到31行則是對html輸入的賬號、用戶名、密碼校驗結果進行處理,若匹配成功則輸出“Wellcome login+用戶名”,否則輸出“login failed!!!!”。
1 <?php 2 3 $uid=($_POST["userid"]); 4 $uname=($_POST["username"]); 5 $pwd=($_POST["password"]); 6 7 /* echo $uname; */ 8 9 $query_str="SELECT * FROM users where userid='{$uid}' and username='{$uname}' and password='{$pwd}';"; 10 11 /* echo "<br> {$query_str} <br>";*/ 12 13 $mysqli = new mysqli("127.0.0.1", "root", "20184312", "sunjing_test"); 14 15 /* check connection */ 16 if ($mysqli->connect_errno) { 17 printf("Connect failed: %s\n", $mysqli->connect_error); 18 exit(); 19 } 20 echo "connection ok!"; 21 /* Select queries return a resultset */ 22 if ($result = $mysqli->query($query_str)) { 23 if ($result->num_rows > 0 ){ 24 echo "<br> Wellcome login Mr/Mrs:{$uname} <br> "; 25 } else { 26 echo "<br> login failed!!!! <br> " ; 27 } 28 29 /* free result set */ 30 $result->close(); 31 } 32 $mysqli->close(); 33 ?>
以下是結果截圖:
在html頁面輸入賬號信息
賬號、用戶名、密碼匹配成功的返回界面如下所示,先顯示數據庫連接成功,再顯示歡迎sunjing
輸入時使用錯誤密碼,返回界面如下,會顯示login fail!!!登錄失敗
(五)SQL注入和XSS攻擊測試
1. SQL注入
SQL注入攻擊:可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。
其實相當於填空,
serch * from users where userid='XXX' and pwd='XXX';
XXX部分就是你輸入的賬號密碼,可以在輸入的字符串中通過構造單引號閉號進行攻擊。
常見的有下列幾種:
(1)' or 1=1#
在登錄界面用戶名處輸入' or 1=1#
,其他部分隨意,填充到數據庫查詢語句中,如下:
select * from users where username='' or 1=1#' and pwd='XXX';
#是注釋符,將其后面的內容給注釋掉,所以只剩下前面的1=1,這是一個恆成立的式子,因此可以成功的登錄。
在之前編寫的網頁上進行測試,如下:
賬號中輸入
' or 1=1#
用戶名密碼隨意。
可以看到登錄成功
(2)admin';#
在賬戶名中輸入admin';# ,其他隨意輸入,放在sql語句中則為:
select * from users where username='admin';#'and pwd='XXX';
#后的部分被識別為注釋,相當於執行一個僅查詢用戶名的操作,不需要匹配密碼,admin換成任何一個你知道數據庫中存在的賬號即可。
在之前編寫的網頁中進行測試,在賬號處輸入20184312';# 用戶名、密碼隨意
結果如下所示,顯示登錄成功。
2.XSS攻擊
概念:
XSS表示Cross Site Scripting(跨站腳本攻擊),通過插入惡意腳本,實現對用戶游覽器的控制。
具體來說假如用戶提交的數據含有js代碼,不做任何處理就保存到了數據庫,讀出來的時候這段js代碼就變成了可執行的代碼。一般用戶提交的數據永遠被認為是不安全的,在保存之前要做對應的處理。
xss攻擊也可以分成三類:
反射型:經過后端,不經過數據庫
存儲型:經過后端,經過數據庫
DOM:不經過后端,DOM—based XSS漏洞是基於文檔對象模型Document Objeet Model,DOM)的一種漏洞,dom - xss是通過url傳入參數去控制觸發的。
用戶名輸入框中輸入
讀取/var/www/html目錄下的圖片:
用戶名輸入
<img src="4312.png" />
如果不能顯示的話,可以嘗試更改一下圖片權限:chmod 777 /var/www/html/4312.png
輸入<img src="4312.png">
4312.png為html目錄下的一張圖片,輸入后點擊登錄,如下所示,可以看到圖片。
(六)webgoat的使用,完成SQL注入、XSS、CSRF攻擊各一例
1.webgoa的安裝
windows和linux上均可搭建,但是由於WebGoat 8使用jdk 1.8編譯,所以主機上需要配置好jdk環境。
這里我選擇在windows上搭建,在cmd中輸入java -version檢查jdk版本,如下所示,在1.8以上即可。
下載地址: https://github.com/WebGoat/WebGoat/releases 下載下來的就是一個jar包。(但是我沒有在這個地址里面找到jar的包)
我在別的網站下載到了 webgoat-server-8.0.0.M21.jar,下載完成后,在cmd中轉到文件所在的目錄,輸入命令
java -jar webgoat-server-8.0.0.M14.jar
在實驗過程中不要關閉命令行界面。
在瀏覽器端進入http://127.0.0.1:8080/WebGoat/login.mvc
界面如下所示:
注冊一個賬號,然后登錄,網頁如下:
左側是菜單右側是對應的內容,我們點開sql注入漏洞界面如下:
2. SQL注入攻擊
(1)String SQL Injection
題目:
The query in the code builds a dynamic query as seen in the previous example. The query in the code builds a dynamic query by concatenating strings making it susceptible to String SQL injection:
"select * from users where name = ‘" + userName + "'";
Using the form below try to retrieve all the users from the users table. You shouldn’t need to know any specific user name to get the complete list, however you can use 'Smith' to see the data for one user.
由題可知,查詢SQL語句為:"select * from users where name = ‘" + userName + "'";
嘗試一下單引號閉合加分號,然后后面加查詢語句
';select * from user;--
失敗了,提示沒有權限,所以應該設計一種恆等式,使得查詢的對象變成整個users表,需要注意的是構造注入的是字符串,我的構造如下:
' or 1=1;--
成功啦,顯示出了表中所有的記錄。
(2)Numeric SQL Injection
題目:
The query in the code builds a dynamic query as seen in the previous example. The query in the code builds a dynamic query by concatenating a number making it susceptible to Numeric SQL injection:
"select * from users where USERID = " + userID;
Using the form below try to retrieve all the users from the users table. You shouldn’t need to know any specific user name to get the complete list, however you can use '101' to see the data for one user.
這里需要使用數字來構成注入,題干中提示,我們可以使用'101' to see the data for one user,所以我的構造如下:
101 or 1=1
成功了!
(3)題目三
題目:
第一問應該是要查詢到所有用戶的記錄,先試試恆等式
' or 1=1;--
結果如下,感覺不是上面所建的表,里面沒有Dave,而且也表項對不上。
再試試后面加一條查詢語句的方法:
' ;select * from user_system_data;--
結果如下,這次有Dave了,而且表項也符合,同時可以看到Dave的密碼,把這個密碼輸入第二問的框框。
完成任務!
3.XSS攻擊
(1)Reflected XSS Attacks
題目:
當我們輸入錯誤用戶信息后,服務器校驗輸入有誤,返回錯誤頁面並將錯誤內容展示給我們看,這時如果我們將帶有攻擊性的URL作為輸入源,就會彈出對話框。
這里將
<script>alert('my javascript here')</script>
作為card number的輸入,然后提交,會彈出對話框,顯示my javascript here,如下所示:
4.CSRF攻擊
題目展示:
方法1:
構造一個攻擊鏈接,當用戶處於登錄狀態時點擊了攻擊鏈接,該鏈接會發起針對用戶正在訪問(已訪問)站點(被攻擊站點)的命令/請求。
參考了https://www.jianshu.com/p/419213416092 的方法。
點擊題目中的查詢按鈕,然后復制新頁面的地址:http://127.0.0.1:8080/WebGoat/csrf/basic-get-flag?csrf=false&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2(后面的那串數字復制下來就是這樣,應該是經過編碼了,直接使用即可)
在kali上/var/www/html下新建了一個html文件,代碼如下
<!DOCTYPE html> <html> <head> <title>csrf</title> <meta charset="utf-8"/> </head> <body> <img src="http://127.0.0.1:8080/WebGoat/csrf/basic-get-flag?csrf=false&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2" style="diaplay: none;"/> </body> </html>
在腳本中使用img自動發起針對攻擊站點就是我們上面復制地址的請求
因為我的webgoat安裝在windows上,所以在瀏覽器端輸入kali的ip/攻擊鏈接的文件名,即http://192.168.43.91/test_516.html 進行訪問。打開瀏覽器(我的是火狐瀏覽器)的web開發工具,如下所示:
雙擊藍色的部分的鏈接,則會彈出下面的頁面,這里面的flag不再是null了,將這個flag填到題目的框框里就OK啦。
完成!
方法2:
看到一個學長的方法,把點擊提交查詢后彈出的頁面的網址的csrf=false改成csrf=true,然后刷新頁面就能顯示flag,但是不知道這個方法的原理是什么,搞不明白。
三、實驗總結與體會
感覺這次實驗與之前相比的話,難度不大,只是內容比較多一點。在摸索和自學的過程中,感覺編寫網頁還是挺有意思的,也加深了對於web的了解。這次實驗用時比較久,任務量很大,需要了解的只是也很多,課下要學習表單網頁代碼,數據庫的建立,並且與網頁的聯系,實驗過程中遇到了很多麻煩,經歷了眾多坎坷之后終於做出了web的入侵,很多東西還是挺有意思的,像SQL注入、XSS攻擊等。經過這次實驗更加明確了今后的學習目標,注重實戰操作,當然要先學好基礎知識,希望在網絡對抗知識的學習中能更有體會的同時,下一次實驗能夠更加順利。