DOM-XSS攻撃と防衛

XSSの中国名は、WEBの脆弱性は、目的のハイジャックのユーザーセッションを達成するように、機能が被害者のWebブラウザに悪意のあるHTML / JavaScriptコードで、より一般的な形で、クロスサイトスクリプティングと呼ばれています。転送モードXSS悪意のあるスクリプト、すなわち、反射型、店舗型、DOM型は、最初の二つの悪意のあるスクリプトを通過し、次にクライアントにサーバを返し、DOMモデルは、比較的良好検出および防止され、3種類に分けることができます私はシングルタイプDOM XSSについての話にここにいるので、悪質なスクリプトなしDOMモデルは、DOMや反射、ストレージタイプとの間の差であるクライアントに返さサーバーに転送されます。

DOMドキュメント

より良いタイプDOM XSS、DOMでの最初の外観を理解するために、すべての後に、DOMベースのXSS型のDOMドキュメントオブジェクトモデルです。ブラウザの場合、DOM文書は、この規格の技術では、JavaScriptを通じてあなたがそれらを簡単にアクセスすることができたときに、XML文書です。

以下は、DOMツリー構造の例は、HTMLコードに変換されています。

<html>
    <head>
        <meta charset="gbk" />
        <title> TEST </title>
    </head>
    <body>
        <p>The is p.<p>
        <h1>Product:</h1>
        <ul>
            <li>Apple</li>
            <li>Pear</li>
            <li>Corn</li>
        </ul>
    </body>
</html>

図は、モデルに変換し、次のとおりです。

これの利点はそれが、この単純なツリー構造を介して、要素間の関係を調べると、データ・サーバ側の独立したDOM動的なページのコンテンツを、変更することで、そのうちの簡単で便利なクライアント側のJavaScriptのスクリプトをクリアすることができますです。

の原則を使用して

クライアント側のJavaScriptを確認クライアントコードは、DOM XSSの脆弱性タイプを有している場合には、モデルが前提の使用であるブラウザDOMドキュメントオブジェクトにアクセスすることができ、および(釣り)を誘導することができますが、ユーザアクセスURLを構築し、それを説明することができます悪意のあるスクリプトを注入するクライアント側の犠牲者。反射型を使用する工程が非常に似ているが、唯一の違いは、サーバに送信されないようにURLパラメータがWAFを迂回達成することができるされ、サーバの検出結果を回避します。

理解を容易にするために、ここで私はあなたに理解するためのいくつかのシナリオを与えます。

シーンワン:innerHTMLプロパティ

<html>
    <head>
        <title> DOM-XSS TEST </title>
        <style>
            #box{width:250px;height:200px;border:1px solid #e5e5e5;background:#f1f1f1;}
        </style>
    </head>
    <body>
        <script>
            window.onload= function(){
                var oBox=document.getElementById("box");
                var oSpan=document.getElementById("span1");
                var oText=document.getElementById("text1");
                var oBtn=document.getElementById("Btn");
                oBtn.onclick = function(){
                    oBox.innerHTML = oBox.innerHTML + oSpan.innerHTML + oText.value + "<br/>";
                    // oBox.innerHTML += oSpan.innerHTML + oText.value +  "<br/>";//这是简便的写法,在js中 a=a+b ,那么也等同于 a+=b
                    oText.value=""
                };
            }
        </script>

        <div id="box"></div>
        <span id="span1">小明:</span>
        <input type="text" id="text1"/>
        <input id="Btn" type="button" value="发送消息" name=""/>
    </body>
</html>

最初に通常の訪問でした。
hellow

二番目のパラメータは、JavaScriptコードは、値として書かれています:
<svg/onload=alert(1)>

ここで私は唯一、クロムの使用中のFirefoxの成功、失敗を使用し、ここで、各ブラウザのバージョンの問題を継続していない、私はセキュリティのために、より良いやっていると思いクロム。

使用innerHTMLプロパティは、outerHTML、ラベルの必要性はないエンコード処理の注意に、XSSにつながる可能性があります。保護はそれが自動的に解析HTMLタグプレーンテキストとして、HTMLタグは実行されませんので、XSS攻撃を避けるためになります、のinnerTextを交換することです。

oBox.innerText = oBox.innerHTML + oSpan.innerHTML + oText.value + "<br/>";

シーン2:ジャンプ

<html>
    <head>
        <title> DOM-XSS TEST </title>
    </head>
    <body>
        <script>
            var hash = location.hash;
            if(hash){
                var url = hash.substring(1);
                location.href = url;
            }
        </script>
    </body>
</html>

アクセスは通常使用され#、ページジャンプを達成するために、ジャンプが、制御パラメータのいくつかは、ドムのXSSにつながる可能性があるため。

道によるLocation.hashは、#の後に書かれたパラメータは、両方のは、JSのパラメータを読めるようにするには、だけでなく、これWAFの検出を避け、サーバーに渡されたパラメータを防ぐために。
警告(1):制御変数のハッシュ部分として、そしてURLに、制御後ハッシュ可変部は#は、擬似プロトコルが使用#javascriptであってもよいです。いくつかの一般的な擬似プロトコルがありjavascript:vbscript:data:等が。そして今、携帯端末(AndroidとiOS)、ブラウザからローカルアプリを開くには、この契約をカスタマイズすることができ、あなたが特定のを見ることができますhttps://www.cnblogs.com/WuXiaolong/p/8735226.html

#javascript:alert(1)

シーン3:evalを

#';alert(1);//
直接ユーザ入力データコードにスプライス。

eval("var x = '" + location.hash + "'");

シーン4:クッキー、リファラ

localStorage、のsessionStorage、クッキーストアソースからデータを取得し、これらの値は、多くの場合、これらの値は安全で、ブラウザで取得していることを、開発者が無視され、それが扱われていません。

var cookies = document.cookie;
document.write(cookies);

场景五:のdocument.write、document.URL.indexOf( "ID =")

var ids = document.URL;
document.writeln(ids.substring(ids.indexOf("id=")+3,ids.length));

いくつかの特別なシーンと組み合わせない限りのindexOf GET urlパラメータの内部、およびのwriteln()または書き込み()によってHTMLに出力さ、XSSが得られますが、ChromeとFirefoxブラウザのテストで今I(2020.3)、書き込み()関数は、使用することは困難です。

保護ポリシー

モバイル側を1つずつ(エネルギーが...限られている)説明していないサードパーティ製のフロント・エンド(マルチメディア編集ボックスなど)フレームワークと他のシーンを使用して、など、ジャンプでいくつかの定期的な試合欠陥、ビジネスロジック型欠陥は、ありますが、ポスト無料私たちは、これらのシーンを完了し続けることができます。

検出プロセスは、ユーザが入力を制御することができればそこにdocument.write、evalを、コールバックプロセス変数や関数を通じて、コードを見て、害を引き起こす、とすることができる場所のようなウィンドウが表示さかどうかです。あなたが入力を制御することができた場合、それはDOM XSS、入力データをエンコードする必要性が存在することを示して見直すことができるかどうかを確認するために、それを確認します。

コードの特徴点(含むがこれらに限定されない)の監査:

            var elements = location.hash;
            elements.indexOf
            
            var oBtn=document.getElementById("Btn");
            oBtn.innerHTML
            oBtn.outerHTML
            
            document.createElement
            oBtn.setAttribute
            oBtn.appendChild

            document.write
            document.writeln
            
            eval("var x = '" + location.hash + "'");
            setTimeout("alert('xss')", 1000)
            window.setTimeout
            document.setTimeout
            window.setInterval

            document.execCommand('ForeColor',false,'#BBDDCC'); 
            document.createElement
            document.createElementNS
            document.createEvent
            document.createXxx

JSの構文は非常に柔軟ですが、また、ここに記載されている多くのライブラリ関数は、完全に満杯ではない、私は文法jsのシステムのいくつかの知識を持っている必要があり、あなたが見つけることがすべてのこれらの追加機能を感じることができます。

ビジネスニーズをHTMLにユーザーが入力したデータを取得するときに、それはそうでセキュアなのinnerText()、testContent(の方法)とを使用しようとしなければならないでしょう。フレームを使用している場合、組み込みのセキュリティフレームワークの機能を使用してみてください。

参考資料

「XSSのクロスサイトスクリプティング-攻撃と防御の分析」
の「Web脆弱性保護」
https://xz.aliyun.com/t/5181
https://domgo.at/cxss/example
https://www.secpulse.com/アーカイブ/ 92286.html

おすすめ

転載: www.cnblogs.com/mysticbinary/p/12542695.html