1. 簡介
XSS:跨站腳本攻擊(Cross Site Scripting):惡意攻擊者往Web頁面中插入惡意JavaScript代碼,當用戶瀏覽網頁時嵌入的JavaScript代碼執行,從而達到惡意攻擊用戶的目的。
2. XSS漏洞靶場搭建
2.1 靶場環境
- kali虛擬機
- Apache服務器
- PHP
- Firefox瀏覽器
2.2 靶場實現
- kali虛擬機安裝,kali虛擬機中集成了我們靶場需要的開發環境Apache2+php+Firefox
3 XSS原理
service apache2 start 啓動Apache2服務,在/var/www/html路徑下新建一個xss.php頁面,文件中寫入代碼:
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>xss</title> </head> <body> <form action="" method="get"> <input type="text" name="xss_input"> <input type="submit"> </form> <hr> <?php /** * Created by PhpStorm. * User: root * Date: 12/6/16 * Time: 4:11 PM */ $xss = $_GET['xss_input']; echo "your text is <br>" .$xss ?> </body> </html>
- 訪問頁面如圖所示:
- 在輸入框中輸入任意字符,你輸入的字符就會顯示在頁面中,比如輸入yaofei,返回如圖所示:
- 查看網頁源代碼:
我們輸入的字符串原封不動的輸出出來,我們進行一個假設,當我們在輸入框中輸入<script>alert('hello')</script>
時,會出現什麼樣的結果呢?按照上述的例子我們可以知道我們的輸入<script>alert('hello')</script>
時,他應該存在第14行的<br>
和</body>
之間,所以會彈出hello的對話框。 - 輸入
<script>alert('hello')</script>
來驗證我們的想法:
說明我們的想法是正確的,查看相應的源代碼:
我們的假設成功了。
注:chrome瀏覽器可能這個代碼不能實現,因爲chrome的內核和ie的內核不同,chrome的過濾機制比ie強,所以當你輸入xss的時候可能被chrome的過濾機制過濾了。
4 XSS利用輸出環境來構造代碼
在相同路徑下新建XSS2.php文件,代碼:
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>XSS_TEST</title> </head> <body> <center> <h6>INPUT VALUE</h6> <form action="" method="get"> <h6>INPUT</h6> <input type="text" name="xss_input_value" value="input"><br> <input type="submit"> </form> <hr> <?php /** * Created by PhpStorm. * User: root * Date: 12/19/16 * Time: 1:46 PM */ $xss = $_GET['xss_input_value']; if(isset($xss)){ echo '<input type="text" value="'.$xss.'">'; } else{ echo '<input type="text" value="output">'; } ?> </center> </body> </html>
- 頁面如圖所示:
當你在輸入對話框中輸入你的內容,輸出對話框將你的內容進行輸出。我們同樣可以用<script>alert('hello')</script>
來進行測試,發現輸出框直接源碼輸出了<script>alert('hello')</script>
字符串。
說明我們的js腳本並沒有執行。同樣,我們可以查看網頁的源代碼:
我們看到,我們的輸入<script>alert('hello')</script>
的腳本被存入了input標籤的value中,所以js腳本並沒有執行。通過第一個例子我們可以知道當我們的js腳本在<br>
和<body>
標籤裏的時候是可以執行的。
所以要想我們的js腳本能夠執行的話,我們可以把我們的js“移動”到input標籤的外面,話說那我們怎麼才能把我們的js腳本移動到input標籤外面呢?
聰明的人可能已經想到了,我們可以從輸入中自己構造代碼來使input標籤閉合。輸入"> <script>alert('hello')</script>
,”>是用來閉合input標籤的,測試一下:
成功彈框!!!查看一下源代碼:
可以看到<script>alert('hello')</script>
已經放到了input標籤外面,js腳本也執行了。 XSS的腳本是不是一定要含有
<script></script>
標籤呢?因爲我們可以看到很多的網站對XSS漏洞進行防護的時候都會把<script>
標籤給禁用掉,那樣是不是就徹底杜絕了XSS漏洞呢?
答案當然是不是這樣的,XSS漏洞的原理就是頁面執行JavaScript腳本,難道調用JavaScript只能用<script>
標籤嗎,很顯然不是的,下面我就介紹幾種XSS不需要調用<script>
標籤的方法:
還用這個環境:" onclick="alert('hello')
,onclick事件可以執行js腳本,所以當我們點擊輸出框的時候可以看到彈出框,源代碼:
同理:Onmousemove事件,鼠標移動時觸發也可以實現:" Onmousemove="alert('hello')
。
同時還有其他標籤可以實現相效果:<img src=1 onerror=alert('hello')>:找不到圖片1的時候執行alert("hello") <a href=javascript:alert('hello')>s</a>:點擊s超鏈接執行js腳本alert("hello") <iframe src=javascript:alert('hello');height=0 width=0 />:利用<iframe>的src執行alert("hello")
5 XSS利用
XSS 難道就是用來彈框的嗎?當然不是,我們之前做的所有的工作只是爲了驗證XSS漏洞的存在。
XSS最有用的用途就是獲取用戶或者管理員的cookie,拿到cookie之後我們可以通過一些工具:如burpsuite來更改自己的cookie,就可以不用輸入用戶名,密碼,驗證碼等,以其他用戶的身份對網站進行控制用戶等操作。