XÜSUSİ DÖVLƏT MÜHAFİZƏ XİDMƏTİ
XÜSUSİ RABİTƏ VƏ İNFORMASİYA
TƏHLÜKƏSİZLİYİ DÖVLƏT AGENTLİYİ

KOMPÜTER İNSİDENTLƏRİNƏ QARŞI MÜBARİZƏ
MƏRKƏZİ

İnsident bildir

Xəbərlər > XPath inyeksiya zamanı nələri bilməliyik ?!

31 May 2013

 XPath - XML sənədin müvafiq hissələrinə ixtiyari müraciət üçün nəzərdə tutulmuş bir dildir. SQL verilənlər bazası üçün nəzərdə tutulmuşsa XPath isə XML sənədlərin sorğuları üçün istifadə edilir. Nəzərə alsaq ki, XPath - da cədvəl, sütun və sətirlərin əvəzinə node - lar istifadə olunur.

 

XPath inyeksiyanın təhlükəliliyi nədədir ?!

XPath SQL - dən fərqlənən standart dildir. Hansı ki, zəif sintaksisə əsaslanan çoxlu sayda dialektə malikdir. XPath vasitəsilə bazanın bütün XML obyektlərini əldə etmık olar. Xatırladaq ki, bir çox hallarda biz sadə SELECT operatoru vasitəsilə verilənlər bazasının bütün obyektlərini əldə edə bilmirik.

NÜMUNƏ 1

Təsəvvür edək ki, bizim XML baza və autentifikasiyamız var :

<?xml version='1.0' encoding='ISO-8859-1'?> <users>
<user>
<id> 1 </id>
<username> admin </username>
<password> xp8th! </password>
</user>

 <user>
<id> 2 </id>
<username> test </username>
<password> test987 </password>
</user>

<user>
<id> 3 </id>
<username> bigolnerd </username>
<password> nerdsneedlovetoo </password>
</user>
</users>

Autentifikasiyanı reallaşdıran kod :

String username = req.getParameter("username');
String password = req.getParameter("password');
XPathFactory factory = XPathFactory.newInstance();

Xpath xpath = factory.newXPath();
File file = new File("/usr/webappdata/users.xml');

InputSource src = new InputSource(new FileInputStream(file));
XPathExpression expr = xpath.compile("//users[username/text()=' " +
username + " ' and password/text()=' " + password + ' ']/id/text()');

String id = expr.evaluate(src);

Bu kod XML sənədi yükləyir və sorğu vasitəsilə İD - ni alır, hansı ki, istifadəçinin daxil etdiyi login və şifrə ilə əlaqəlidir. Güman etmək olar ki , bu "admin" və "xp8th!". Belə olduğu halda :

//users[username/text()='admin' and password/text()='xp8th!'] /id/text()

 Heç bir digər yoxlama həyata keçirilmir və bizim tanış olan ` və ya '1' = '1; olarsa, o zaman :

//users[username/text()='admin' and password/text()='' or '1'='1' ]/id/text()

1=1 doğru verdiyinə görə sorğu bizə admin istifadəçisi üçün İD dəyərini göndərəcək

NÜMUNƏ 2

Təsəvvür edək ki, bizim belə bir XML sənədimiz var :

<?xml version="1.0" encoding="utf-8" ?>
<orders>
<customer id="1">
<name>Bob Smith</name>
<email>bob.smith@bobsmithinc.com</email>
<creditcard>1234567812345678</creditcard>
<order>
<item>
<quantity>1</quantity>
<price>10.00</price>
<name>Sprocket</name>
</item>

<item>
<quantity>2</quantity>
<price>9.00</price>
<name>Cog</name>
</item>
</order>
</customer>
...
</orders>

Verilənlər bazasının yerinə niyə görə XML istifadə edək ?!

 Əksər XML tətbiqetmələr XML verilənlər baza dampı istifadə edirlər. Əgər sizin saytınızın verilənlərinin qorunması üçün XML və istifadəçilərin daxil olması sorğuların qurulması üçün istifadə olunursa onda bu XPath inyeksiya üçün boşluq yaranır.

DİQQƏT !!!!!!! XPath inyeksiyadan necə qorunmaq olar ?!

Ən yaxşı üsul əlbətdə ki, proqramçıların istifadəçi verilənlərindən aldığı yalnız söz və simvollarını yoxlamaq olardı. Təcrübə göstərir ki, bu üsul da tam olaraq XPath inyeksiyanın qarşısını almır. Lakin tam olaraq təhlükəsizliyi təmin etmək üçün necə ki, SQL inyeksiyada təhlükəsizlik simvolları addslashes () funsiyası vasitəsilə aradan qaldırılırdısa, həmçinin Backslash (\) əlavə etməklə XPath insyeksiyanı praktik olaraq mümkünsüzləşdirmək olar.