【29】WEB安全學習----XML注入
阿新 • • 發佈:2018-12-13
一、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格式而已。