【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格式而已。