سوالی که مطرح هست اینه که متغیر $name جزئی از فرم هست یا خیر ؟
- اگر پاسخ بله هست که کاری که باید انجام بشه کاملا مشخص هست !
- اگر پاسخ خیر هست و با توجه به اینکه به اساس SQL و SQL Injection آشنایی دارید ادامه این مطلب رو دنبال کنید
آسیب پذیری واضح : در 90 درصد مواقع جدول کاربران شامل ستونی به اسم access_level ، user_type و یا غیره هست که بیانگر سطح دسترسی کاربر هست که با تحلیل پایگاه داده میتونید نام ستون رو پیدا کنید ؛ کافیه اون مقدار آپدیت بشه تا یوزر شما سطح دسترسی ادمین بگیره . پس بنا بر فرضیه گفته شده متغیر $mesal باید حاوی رشته زیر باشه :
', access_level = 'admin
نکته : این تکنیک فقط در توابع غیر استانداردی مثل mysql_query و در صورتی که کاراکتر ها خنثی نشده باشند جواب خواهد داد ؛ در تکنیک های استانداردی مثل بایندینگ تمامی کاراکتر های موجود در پارامتر های یک فیلد ESCAPE و خنثی شده .
عمل غیر ممکن در شرایط موجود : با توجه به اینکه متغیر mesal وسط رشته query اپدیت هست (قبل از where) و متغیر name (بعد از where) قرار گرفته ، امکان تاثیر گذاری بر روی اون قسمت وجود ندارد .
اما چرا گفته شده غیر ممکن در شرایط موجود ؟ چرا که تابع mysql_query فقط پاسخگوی یک statement بوده و هرگونه تلاش برای ارسال multiple statement به سمت SQL Parser پایگاه داده به وسیله این تابع با خطای php مواجه خواهد شد .
در صورت استفاده از توابعی که از multiple statement پشتیبانی میکنند خیلی راحت میشه به شکل زیر به هدف مورد نظر رسید :
$mesal = "' where name='example';" . $second_statement;
در شرایطی که منظور از Name ، فیلد قبل از where clause باشد به راحتی با overwrite کردن آن ، مقدار تغییر خواهد کرد :
$mesal = "', Name='Example";