xss過濾字元
1. 在xss中各種過濾的情況,在什麼地方可能存在注入點
XSS注入的本質就是:某網頁中根據用戶的輸入,不期待地生成了可執行的js代碼,並且js得到了瀏覽器的執行.意思是說,發給瀏覽器的字元串中,包含了一段非法的js代碼,而這段代碼跟用戶的輸入有關.常見的XSS注入防護,可以通過簡單的htmlspecialchars(轉義HTML特殊字元),strip_tags(清除HTML標簽)來解決,但是,還有一些隱蔽的XSS注入不能通過這兩個方法來解決,而且,有時業務需要不允許清除HTML標簽和特殊字元.下面列舉幾種隱蔽的XSS注入方法:IE6/7UTF7XSS漏洞攻擊隱蔽指數:5傷害指數:5這個漏洞非常隱蔽,因為它讓出現漏洞的網頁看起來只有英文字母(ASCII字元),並沒有非法字元,htmlspecialchars和strip_tags函數對這種攻擊沒有作用.不過,這個攻擊只對IE6/IE7起作用,從IE8起微軟已經修復了.你可以把下面這段代碼保存到一個文本文件中(前面不要有空格和換行),然後用IE6打開試試(沒有惡意代碼,只是一個演示):+/v8+ADw-script+AD4-alert(document.location)+ADw-/script+AD4-最容易中招的就是JSONP的應用了,解決方法是把非字母和數字下劃線的字元全部過濾掉.還有一種方法是在網頁開始輸出空格或者換行,這樣,UTF7-XSS就不能起作用了.因為只對非常老版本的IE6/IE7造成傷害,對Firefox/Chrome沒有傷害,所以傷害指數只能給4顆星.參考資料:UTF7-XSS不正確地拼接JavaScript/JSON代碼段隱蔽指數:5傷害指數:5Web前端程序員經常在PHP代碼或者某些模板語言中,動態地生成一些JavaScript代碼片段,例如最常見的:vara='<!--?phpechohtmlspecialchars($name);?';不想,$name是通過用戶輸入的,當用戶輸入a』;alert(1);時,就形成了非法的JavaScript代碼,也就是XSS注入了.只需要把上面的代碼改成:vara=
2. lt;script>alert</script>每個欄位都要做XSS過濾嗎
一般的網站會把用戶寫入的內容中包含<> ' ""這類的特殊符號格式化掉(安全過濾), 如開頭的特殊字元標識.
3. 安全編碼與xss編碼有什麼不同
提起XSS 想到的就是插入字元字元編碼與各種解析了!
這也就是各種xss編碼插件跟工具出世的原因!之前不懂瀏覽器是如何對我們編碼過的代碼進行解析的時候就是一頓亂插!
各種編碼 各種插 沒把編碼還原就算了 還原了就算運氣好!後來到PKAV經過二哥和短短的調教後才算是弄清楚了一點編碼與解析方面的知識!
現在也算是運用自如了把!
現在介紹一下在xss中最經常用到的編碼
html實體編碼(10進制與16進制):
如把尖括弧編碼[ < ] -----> html十進制: < html十六進制:<
javascript的八進制跟十六進制:
如把尖括弧編碼[ < ] -----> js八進制:\74 js十六進制:\x3c
jsunicode編碼:
如把尖括弧編碼[ < ] ----->jsunicode:\u003c
url編碼 base64編碼:
如把尖括弧編碼[ < ] -----> url: %22 base64: Ig==
0x01 html實體編碼
html實體編碼本身存在的意義是防止與HTML本身語義標記的沖突。
但是在XSS中卻成為了我們的一大利器,但是也不能盲目的使用!
html中正常情況只識別:html10進制,html16進制!
現在介紹一下我們應該如何在xss過程中靈活的使用各種編碼呢?
比如現在你的輸出點在這:
<img src="[代碼]">
在這里過濾了script < > / \ http: 以及各種危險字元 比如創建一個html節點什麼的!
有的站只允許你引用一個img文件夾里的圖片 但是圖片是你可以控的 可以通過抓包來修改的!
我們如果想載入外部js 或者一個xss平台的鉤子我們應該怎麼寫呢?
那麼我們可以在這里 閉合雙引號 寫事件: onerror=[html language="實體編碼"][/html][/html]
比如我現在彈個窗:
<img src="x" onerror="alert(1)">
原code:
<img src="x" onerror="alert(1)">
這里我用的是html十進制編碼 也可以使用十六進制的html實體編碼!
但是為什麼這里我沒有用jsunicode 以及 js八進制跟js十六進制呢!
瀏覽器是不會在html標簽里解析js中的那些編碼的!所以我們在onerror=後面放js中的編碼是不會解析 你放進去是什麼 解析就是什麼!
大多數網站是不會號的,如果過濾了怎麼辦呢?
那麼再來講一下另外一個案例:
源碼如下:
頁面中的Go按鈕中包含一個a標簽 輸入的值會存在於a標簽的href屬性中,href中用了javascript偽協議,可以在href跳轉時執行js代碼!
所以造成了xss!
我們提交的值如下:
wooyun%26%23x27,alert(1)%2b%26%23x27
由於頁面對單引號 & 符號 以及 #符號過濾!但是html中可以識別html實體編碼!但是實體編碼是由組成!
這個時候已經被過濾 我們只能通過url編碼來對 & # 兩個符號進行編碼!再讓瀏覽器解碼成 然後拼接x27 最後就成為了單引號的html16進制編碼!
解碼後:我們的提交值為:
',alert(1)'
href代碼為:
?
1
<a href="javascript:location='./3.3.php?offset='+document.getElementById('pagenum').value+'&searchtype_yjbg=yjjg&searchvalue_yjbg='">GO</a>
ps:在之前說了html標簽中識別html實體編碼,並且會在html頁面載入時會對編碼進行解碼!那麼' 已經是單引號了 但是並不會閉合! 然後在點擊過程中執行javascript代碼 這個時候由於html里'被解析成單引號但是沒閉合 這個時候js被執行 這個我們提交的在html載入時解析成了字元串單引號但是不能閉合之前的引號 因為現在是把我們提交的編碼了的單引號 當成字元串來顯示 但是現在他是存在於a標簽中的href里的 href鏈接里的地址是javascript偽協議,我們現在點擊的時候 會執行裡面的代碼 關鍵來了 這個時候我們之前被當做字元串的單引號 被再次解析 這個時候就沒任何過濾規則來過濾它 程序也沒那麼智能 之前當做字元串的單引號起作用了 javascript不知道他是個字元串 它只知道瀏覽器解析成了什麼 他就帶入進去!就在這個時候我們的字元串單引號就成功的閉合了!當點擊go時 我們的代碼執行!
4. 如何防止xss攻擊,需要過濾什麼
XSS攻擊通常是指黑客通過"HTML注入"篡改了網頁,插入了惡意的腳本,從而在用戶瀏覽網頁時,控制用戶瀏覽器的一種攻擊。
一、HttpOnly防止劫取Cookie
HttpOnly最早由微軟提出,至今已經成為一個標准。瀏覽器將禁止頁面的Javascript訪問帶有HttpOnly屬性的Cookie。目前主流瀏覽器都支持,HttpOnly解決是XSS後的Cookie支持攻擊。
我們來看下網路有沒有使用。
未登錄時的Cookie信息
可以看到,所有Cookie都沒有設置HttpOnly,現在我登錄下
發現在個叫BDUSS的Cookie設置了HttpOnly。可以猜測此Cookie用於認證。
下面我用PHP來實現下:
<?php
header("Set-Cookie: cookie1=test1;");
header("Set-Cookie: cookie2=test2;httponly",false);
setcookie('cookie3','test3',NULL,NULL,NULL,NULL,false);
setcookie('cookie4','test4',NULL,NULL,NULL,NULL,true);
?>
<script>
alert(document.cookie);
</script>
js只能讀到沒有HttpOnly標識的Cookie
二、輸入檢查
輸入檢查一般是檢查用戶輸入的數據中是否包含一些特殊字元,如<、>、'、"等,如果發現存在特殊字元,則將這些字元過濾或者編碼。
例如網站注冊經常用戶名只允許字母和數字的組合,或者郵箱電話,我們會在前端用js進行檢查,但在伺服器端代碼必須再次檢查一次,因為客戶端的檢查很容易繞過。
網上有許多開源的「XSS Filter」的實現,但是它們應該選擇性的使用,因為它們對特殊字元的過濾可能並非數據的本意。比如一款php的lib_filter類:
$filter = new lib_filter();
echo $filter->go('1+1>1');
它輸出的是1,這大大歪曲了數據的語義,因此什麼情況應該對哪些字元進行過濾應該適情況而定。
三、輸出檢查
大多人都知道輸入需要做檢查,但卻忽略了輸出檢查。
1、在HTML標簽中輸出
如代碼:
<?php
$a = "<script>alert(1);</script>";
$b = "<img src=# onerror=alert(2) />";
?>
<div><?=$b?></div>
<a href="#"><?=$a?></a>
這樣客戶端受到xss攻擊,解決方法就是對變數使用htmlEncode,php中的函數是htmlentities
<?php
$a = "<script>alert(1);</script>";
$b = "<img src=# onerror=alert(2) />";
?>
<div><?=htmlentities($b)?></div>
<a href="#"><?=htmlentities($a)?></a>
2、在HTML屬性中輸出
<div id="div" name ="$var"></div>
這種情況防禦也是使用htmlEncode
在owasp-php中實現:
$immune_htmlattr = array(',', '.', '-', '_');
$this->htmlEntityCodec->encode($this->immune_htmlattr, "\"><script>123123;</script><\"");
3、在<script>標簽中輸出
如代碼:
<?php
$c = "1;alert(3)";
?>
<script type="text/javascript">
var c = <?=$c?>;
</script>
這樣xss又生效了。首先js變數輸出一定要在引號內,但是如果我$c = "\"abc;alert(123);//",你會發現放引號中都沒用,自帶的函數都不能很好的滿足。這時只能使用一個更加嚴格的JavascriptEncode函數來保證安全——除數字、字母外的所有字元,都使用十六進制"\xHH"的方式進行編碼。這里我採用開源的owasp-php方法來實現
$immune = array("");
echo $this->javascriptCodec->encode($immune, "\"abc;alert(123);//");
最後輸出\x22abc\x3Balert\x28123\x29\x3B\x2F\x2F
4、在事件中輸出
<a href="#" onclick="funcA('$var')" >test</a>
可能攻擊方法
<a href="#" onclick="funcA('');alter(/xss/;//')">test</a>
這個其實就是寫在<script>中,所以跟3防禦相同
5、在css中輸出
在owasp-php中實現:
$immune = array("");
$this->cssCodec->encode($immune, 'background:expression(window.x?0:(alert(/XSS/),window.x=1));');
6、在地址中輸出
先確保變數是否是"http"開頭,然後再使用js的encodeURI或encodeURIComponent方法。
在owasp-php中實現:
$instance = ESAPI::getEncoder();
$instance->encodeForURL(『url』);
四、處理富文體
就像我寫這篇博客,我幾乎可以隨意輸入任意字元,插入圖片,插入代碼,還可以設置樣式。這個時要做的就是設置好白名單,嚴格控制標簽。能自定義 css件麻煩事,因此最好使用成熟的開源框架來檢查。php可以使用htmlpurify
五、防禦DOM Based XSS
DOM Based XSS是從javascript中輸出數據到HTML頁面里。
<script>
var x = "$var";
document.write("<a href='"+x+"'>test</a>");
</script>
按照三中輸出檢查用到的防禦方法,在x賦值時進行編碼,但是當document.write輸出數據到HTML時,瀏覽器重新渲染了頁面,會將x進行解碼,因此這么一來,相當於沒有編碼,而產生xss。
防禦方法:首先,還是應該做輸出防禦編碼的,但後面如果是輸出到事件或腳本,則要再做一次javascriptEncode編碼,如果是輸出到HTML內容或屬性,則要做一次HTMLEncode。
會觸發DOM Based XSS的地方有很多:
document.write()、document.writeln()、xxx.innerHTML=、xxx.outerHTML=、innerHTML.replace、document.attachEvent()、window.attachEvent()、document.location.replace()、document.location.assign()
5. js用什麼函數過濾非法字元防止跨站腳本攻擊
test
如:<input type="text" id="txtceshi" /><input type="button" onclick="yanzheng()" value="ceshi" />
<script type="text/javascript">
function yanzheng() {
var ce = txtceshi.value;//獲取文本抄框的值
var ze = /[^0-9]+/; //只能是數字,這里可以在網上找到一些正則替換成你想要的表達式
if (ze.test(ce)) {
alert("數據不合法!");
}
}
</script>
6. xss漏洞中需要過濾哪些特殊的字元
點擊來系統上的騰訊電腦管家應用程自序界面,在主界面中,點擊修復漏洞按鈕
在漏洞修復界面中,展出可以安裝的修復程序列表,如果簡單的話,可以直接點擊右側的一鍵修復按鈕
點擊漏洞修復界面中的,已安裝,就會返回已經安裝的漏洞修復程序列表
點擊右上方的設置按鈕,進行漏洞修復設置
在設置界面中,可以設置程序的安裝和修復方式,需要提醒自己,然後進行修復操作
7. xss字元限制怎麼辦
如果在同一個頁面上 可以多段代碼組合:比如var a = "xsscode[1]";var a.= "xsscode[2]"。。。最後eval a 就行了
8. CI 防注入方面,到底過濾特殊字元沒有
:一般來說,這樣處理即可:所有參數都當作字元串處理,用單引號括起來。另外就是要把字元串中的單引號替換掉。
9. xss過濾後的字元串怎麼set回去
下劃線 一般命名的時候會加一個下劃線表示命名有兩部分 row_max 想表達的意思是 行最大
你寫成 rowmax 也是一樣的 但是分隔了之後就看的十分顯然一些。
還有的不是用「_」下劃線 而是用大小寫 區分 都是一樣的。
這些東西可以在變數的命名里找到。