主流指令碼語言都支援對xpath的處理,本次例項分析以php來學習xpath注入的原理;
blog.xml:
<?xml version="1.0" encoding="utf-8"?>
1admin
0192023a7bbd73250516f069df18b500 2
jack
1d6c1e168e362bc0092f247399003a88 3
tony
cc20f43c8c24dbc0b2539489b113277a
flag
index.php:
<?php
$xml = ******xml_load_file('blog.xml');
$name = $_get['name'];
$pwd = md5($_get['pwd']);
$query = "/root/users/user[username/text()='".$name."' and password/text()='".$pwd."']";
echo $query;
$result = $xml->xpath($query);
if($result)
**很簡單,實現了乙個簡單的登陸驗證功能.其實和sql注入相似,沒有對使用者輸入的資料做過濾,導致攻擊者可以直接注入」xpath表示式」,只要知道使用者名稱就能繞過密碼驗證,
如果使用者名稱沒法得知,可以用兩個」or」來繞過驗證邏輯
這邊有個存放分數的xml檔案:
score.xml:
<?xml version="1.0" encoding="utf-8"?>
english
60chinese
70qwer123
english
24chinese
34woaichishi
english
100chinese
100vk123
查詢分數的php是:
score.php:
<?php
if (file_exists('score.xml'))']/subject[contains(foo, 'english')]/score";
$ch_scr = "//peo[@name='']/subject[contains(foo, 'chinese')]/score";
$en_qu = $xml -> xpath($en_scr);
$ch_qu = $xml -> xpath($ch_scr);
foreach ($en_qu as $key => $value)
foreach ($ch_qu as $key => $value)
}else
}?>
這裡,php用******xml_load_file()這個函式來訪問那個存分數的xml檔案,然後用xpath語法去查詢資料。
查詢vk使用者分數
依次其他兩個使用者也可以查詢。
定位到原始碼,看xml查詢語言的實現
圖中框這個就相當於sql中的語句,這就是xpath路徑選取xml節點的語句
直接解釋查詢語句
/peo 匹配到所有peo節點
這節點不止乙個,到底要哪個呢?
[@name=''] 接收到使用者名字,來查詢相應的節點(就是剛才的helen,vk)
/subject 剛才peo節點下的subject節點
這時候問題又來了,subject節點不止乙個,哪個呢?
[contains(foo, 'english')] contains函式,第乙個引數給出節點名,第二個寫字串
意思就是,匹配出他的foo子節點中,資訊含有english的那個
/score 已經找到相應的subject了,然後就是找分數了。score就是存放分數的節點
這樣就能實現從xml檔案中查詢相應資料了!
以上兩個案例僅供學習參考。
本地搭建php環境進行模擬測試,建議安裝phpstudy,只需將要復現的xml檔案和php檔案上傳至web目錄,通過瀏覽器訪問即,手工測試便於深入理解xml查詢,資料儲存方式,深一步理解漏洞形成原理。
XPATH報錯注入
extractvalue extractvalue 對xml文件進行查詢的函式 語法 extractvalue 文件,路徑 路徑寫入其他格式,就會報錯並且會返回我們寫入的非法格式內容,我們可以利用這個得到我們想得到的內容 正常查詢 第二個引數的位置格式 為 x xx 即使查詢不到也不會報錯 sele...
xpath文件詳解
基本的xpath語法類似於在乙個檔案系統中定位檔案,如果路徑以斜線 開始,那麼該路徑就表示到乙個元素的絕對路徑 aaa 選擇根元素aaa aaa ccc 選擇aaa 的所有ccc子元素 bbb 選擇所有bbb元素 ddd bbb 選擇所有父元素是ddd的bbb元素 星號 表示選擇所有由星號之前的路徑...
xpath用法詳解
選擇不包含class屬性的節點 result article.xpath span not class 選擇不包含class和id屬性的節點 result article.xpath span not class and not id 選擇不包含class expire 的span result a...