1. 程式人生 > >【29】WEB安全學習----XML注入

【29】WEB安全學習----XML注入

一、XML基礎

簡介:

XML:可擴充套件標記語言。XML被設計用來是傳輸和儲存資料,XML是一種“元標記”語言,開發者可以根據自己的需要建立標記的名稱。

XML結構

XML是一種樹結構,從“根部”開始,然後擴充套件到“枝葉”,XML文件必須有根元素。

<?xml version="1.0" encoding="UTF-8"?>   //XML宣告(可選部分),定義XML的版本和編碼
<note>      //描述文件的根元素
<to>Tove</to>   //4個描述根的子元素
<from>Jani</from>    //4個描述根的子元素
<heading>Reminder</heading>    //4個描述根的子元素
<body>Don't forget me this weekend!</body>    //4個描述根的子元素
</note>    //定義根元素的結尾

XML語法規則

  • XML 文件必須有一個根元素
  • XML元素都必須有一個關閉標籤
  • XML 標籤對大小寫敏感
  • XML 元素必須被正確的巢狀
  • XML 屬性值必須加引號

PHP解析XML

<?php
    $xml_str=$_POST['xml'];
    $xml=simplexml_load_string($xml_str);  //將XML字串解釋為物件
    print_r($xml);

二、XML注入例子

XML注入攻擊,和SQL注入的原理一樣,都是攻擊者輸入惡意的程式碼來執行自身許可權以外的功能。

可測試XML文件中子元素各屬性值是否存在注入點。

PHP程式碼

<?php
  header('content-type:text/html;charset=utf-8');
  if(isset($_POST['xml'])){
    $xml_str=$_POST['xml'];
    [email protected]_load_string($xml_str);  //將XML字串解釋為物件
    if(!$xml){
      die('XML文件格式有誤,請檢查');
    }
    $username=$xml->username;
    $passwd=$xml->passwd;

    $mysqli=new mysqli();
    $mysqli->connect('localhost','root','root');
    if($mysqli->connect_errno){
      die('資料庫連線失敗:'.$mysqli->connect_error);
    }
    $mysqli->select_db('user');
    if($mysqli->errno){
      dir('開啟資料庫失敗:'.$mysqli->error);
    }
    $mysqli->set_charset('utf-8');
    $sql="SELECT username,paawd FROM users WHERE username='{$username}'";
    $result=$mysqli->query($sql);
    if(!$result){
      die('執行SQL語句失敗:'.$mysqli->error);
    }else if($result->num_rows==0){
      die('查詢結果為空');
    }else {
      $array1=$result->fetch_all(MYSQLI_ASSOC);
      echo "使用者名稱:{$array1[0]['username']},密碼:{$array1[0]['paawd']}";
    }
    $result->free();
    $mysqli->close();
  }
?>

注入測試

和POST-SQL注入一樣,只是提交資料格式換成了XML格式而已。