目录
一. XML/XPath Injection (Login Form)
一. XML/XPath Injection (Login Form)
bWAPP之xpath注入如下,这里让我们登录
用户名那输入一个单引号发现报出了xmli的解析错误,可知是利用了xml/xpath解析的用户登录信息。
这里我们先不着急登录,先看下源代码来学习下这个漏洞
1. 源码分析
关键代码如下:
1. 程序接收了前台传进来的用户名和密码,未做任何过滤
2. 接着加载了本地的一个xml的文件
3. 用xpath语言从加载的xml文件中进行查找用户名和密码,如果查找到了,则进行登录
-》经过一分析我们就知道了漏洞所在点了,程序在接收数据进行xpath查询的时候没有进行过滤,针对本关这一点,我们可以构造绕过直接进行登录
if(isset($_REQUEST["login"]) & isset($_REQUEST["password"]))
{
$login = $_REQUEST["login"];
$login = xmli($login); //接收登录的用户名
$password = $_REQUEST["password"];
$password = xmli($password); //接收登录的密码
// Loads the XML file
$xml = simplexml_load_file("passwords/heroes.xml"); //加载xml数据
// XPath search
$result = $xml->xpath("/heroes/hero[login='" . $login . "' and password='" . $password . "']"); //用xpath查询内容
if($result)
{
...
}
}
2. 构造绕过
在不知道用户名和密码的情况下直接绕过登录。先把查询代码拿出来,
$result = $xml->xpath("/heroes/hero[login='" . $login . "' and password='" . $password . "']");
实际上就是这样
$result = $xml->xpath("/heroes/hero[login='用户名' and password=' 密码']");
构造用户名如下,密码随便输入
test' or '1' or '
插入进行语句后就是这样
$xml->xpath("/heroes/hero[login=' test' or '1' or ' ' and password=' xxx']");
我们要知道运算符是有优先级的,一般等于号=的优先级大于and,and的优先级大于or。即 '=' > 'and' > 'or'。login='test'为假,password='xx'为假,or '1'为真,or ''为假
所以$result为真,绕过登录