вторник, 5 февруари 2013 г.

CSRF - Cross Site Request Forgery

Днес мотайките се по разни страници и слушайки мейдън ми хрумна една идея а именно:

Отваря някой нашата страница която наглед е напълно безобидна (съдържа снимки на котенца и кученца), но в съседния таб има отворен gmail. Какво ще стане ако в един div чрез javascript заредим gmail?

Няма ли това да ни даде достъп до страница (отново чрез javascript) със заредена цялата негова кореспонденция, която можем да парснем и да си изпратим (примерно като POST заявка)?

Запретвам ръкави и пиша html/javascriptски код. Тъй като аз на този език не пиша всичко е идеално:

<html>
<table>
<tr>
<td>
    <a href="http://mail.google.com" onmouseover="previewUrl(this.href,'div1')">google</a>
</td>
<td>
    <div id="div1" style="width:400px;height:300px;border:1px solid #ddd;"></div>
</td>
</tr>
</table>

<script>
    function previewUrl(url,target){
        //use timeout coz mousehover fires several times
        clearTimeout(window.ht);
        window.ht = setTimeout(function(){
            var div = document.getElementById(target);
            div.innerHTML = '<iframe style="width:100%;height:100%;" frameborder="0" src="' + url + '" />';
        },20);
    }
</script>
</html>





Палим и какво да видя .... НИЩО. Създава се iframe но в него няма никой.
Помислих че скрипта (който сам написах вервайте ми) нещо е объркан.

Смених href-а с "reddit" и о чудо там всичко си излиза и моя потребител се вижда, и като го сменя да показва входящите съобщения и те се виждат.

Започнах да се запитвам защо така и как така гугъл са толкова ъкълести и чудейки се с подкрепата на ... ами пак на тях (този път търсачката която между другото също не се отваря в ифрейм) намерих отговор. Или по-точно въпрос:


А на него отговор:
It prevents cross-site request forgery.

Contrived example: say Google has a URL like gmail.com/json?action=inbox which returns the first 50 messages of your inbox in JSON format. Evil websites on other domains can't make AJAX requests to get this data due to the same-origin policy, but they can include the URL via a <script> tag. The URL is visited with your cookies, and by overriding the global array constructor or accessor methods they can have a method called whenever an object (array or hash) attribute is set, allowing them to read the JSON content.
The while(1); or &&&BLAH&&& prevents this: an AJAX request at gmail.com will have full access to the text content, and can strip it away. But a <script> tag insertion blindly executes the JavaScript without any processing, resulting in either an infinite loop or a syntax error.

И тъй като всяка добра история трябва да има поука или извод, ето моя:

Ебаси колко съм прост и ограничен то си имало такава атака (не съм аз измислил леда на кубчета) че и са измислили как да се защитават от нея а аз чак сега разбирам че я има.

ПолсеПрост

Тъй като не всички са толкова умнички като чичковците от гугъл,
трябва някой дето му се лежи на топло макар че зимата мина да провери как са ни банковите сайтове в това отношение. Аз няма да се намесвам тук.

Поздрави