recent
أخبار ساخنة

عمل SQL سكانر في بايثون

الصفحة الرئيسية

 حقن SQL عبارة عن تقنية لحقن التعليمات البرمجية تُستخدم لتنفيذ استعلامات SQL عبر بيانات إدخال المستخدم إلى تطبيق الويب الضعيف. إنها واحدة من أكثر تقنيات اختراق الويب شيوعًا وخطورة.

يمكن أن يتسبب استغلال حقن SQL الناجح في الكثير من الأضرار الضارة لقاعدة البيانات وتطبيق الويب بشكل عام. على سبيل المثال ، يمكنه قراءة البيانات الحساسة مثل كلمات مرور المستخدم من قاعدة البيانات ، وإدراج البيانات وتعديلها وحتى حذفها.

في هذا البرنامج التعليمي ، ستتعلم كيفية إنشاء نص برمجي بسيط من لغة Python لاكتشاف ثغرة أمنية لحقن SQL في تطبيقات الويب.

دعنا نثبت المكتبات المطلوبة لهذا البرنامج التعليمي:

pip3 install requests bs4

لنستورد الوحدات الضرورية:

import requests
from bs4 import BeautifulSoup as bs
from urllib.parse import urljoin
from pprint import pprint
# initialize an HTTP session & set the browser
s = requests.Session()
s.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36"

قمنا أيضًا بتهيئة جلسة الطلبات وقمنا بتعيين وكيل المستخدم.


نظرًا لأن حقن SQL يدور حول مدخلات المستخدم ، فسنحتاج إلى استخراج نماذج الويب أولاً ، سنحتاج إلى الوظائف التالية:

def get_all_forms(url):
"""Given a `url`, it returns all forms from the HTML content"""
soup = bs(s.get(url).content, "html.parser")
return soup.find_all("form")
def get_form_details(form):
"""
This function extracts all possible useful information about an HTML `form`
"""
details = {}
# get the form action (target url)
try:
action = form.attrs.get("action").lower()
except:
action = None
# get the form method (POST, GET, etc.)
method = form.attrs.get("method", "get").lower()
# get all the input details such as type and name
inputs = []
for input_tag in form.find_all("input"):
input_type = input_tag.attrs.get("type", "text")
input_name = input_tag.attrs.get("name")
input_value = input_tag.attrs.get("value", "")
inputs.append({"type": input_type, "name": input_name, "value": input_value})
# put everything to the resulting dictionary
details["action"] = action
details["method"] = method
details["inputs"] = inputs
return details

تستخدم get_all_forms () مكتبة BeautifulSoup لاستخراج جميع علامات النموذج من HTML وإرجاعها كقائمة Python ، بينما تحصل الدالة get_form_details () على كائن علامة نموذج واحد كوسيطة وتوزع معلومات مفيدة حول النموذج ، مثل الإجراء (الهدف URL) والطريقة (GET و POST وما إلى ذلك) وجميع سمات حقل الإدخال (النوع والاسم والقيمة).

بعد ذلك ، نحدد وظيفة تخبرنا ما إذا كانت صفحة الويب بها أخطاء SQL ، سيكون هذا مفيدًا عند التحقق من وجود ثغرة أمنية في حقن SQL:

def is_vulnerable(response):
"""A simple boolean function that determines whether a page
is SQL Injection vulnerable from its `response`"""
errors = {
# MySQL
"you have an error in your sql syntax;",
"warning: mysql",
# SQL Server
"unclosed quotation mark after the character string",
# Oracle
"quoted string not properly terminated",
}
for error in errors:
# if you find one of these errors, return True
if error in response.content.decode().lower():
return True
# no error detected
return False

لا يمكنني تحديد الأخطاء لجميع خوادم قواعد البيانات ، ولتحقق أكثر موثوقية ، تحتاج إلى استخدام التعبيرات العادية للعثور على مطابقات الأخطاء ، تحقق من ملف XML هذا الذي يحتوي على الكثير منها (تستخدمه الأداة المساعدة sqlmap).

الآن بعد أن أصبح لدينا جميع الأدوات ، دعنا نحدد الوظيفة الرئيسية التي تبحث عن جميع النماذج على صفحة الويب وتحاول وضع علامات اقتباس وحروف اقتباس مزدوج في حقول الإدخال:

def scan_sql_injection(url):
# test on URL
for c in "\"'":
# add quote/double quote character to the URL
new_url = f"{url}{c}"
print("[!] Trying", new_url)
# make the HTTP request
res = s.get(new_url)
if is_vulnerable(res):
# SQL Injection detected on the URL itself,
# no need to preceed for extracting forms and submitting them
print("[+] SQL Injection vulnerability detected, link:", new_url)
return
# test on HTML forms
forms = get_all_forms(url)
print(f"[+] Detected {len(forms)} forms on {url}.")
for form in forms:
form_details = get_form_details(form)
for c in "\"'":
# the data body we want to submit
data = {}
for input_tag in form_details["inputs"]:
if input_tag["type"] == "hidden" or input_tag["value"]:
# any input form that is hidden or has some value,
# just use it in the form body
try:
data[input_tag["name"]] = input_tag["value"] + c
except:
pass
elif input_tag["type"] != "submit":
# all others except submit, use some junk data with special character
data[input_tag["name"]] = f"test{c}"
# join the url with the action (form request URL)
url = urljoin(url, form_details["action"])
if form_details["method"] == "post":
res = s.post(url, data=data)
elif form_details["method"] == "get":
res = s.get(url, params=data)
# test whether the resulting page is vulnerable
if is_vulnerable(res):
print("[+] SQL Injection vulnerability detected, link:", url)
print("[+] Form:")
pprint(form_details)
break

قبل استخراج النماذج وإرسالها ، تتحقق الوظيفة المذكورة أعلاه من الثغرة الأمنية في عنوان URL أولاً ، نظرًا لأن عنوان URL نفسه قد يكون ضعيفًا ، ويتم ذلك ببساطة عن طريق إلحاق حرف اقتباس بعنوان URL.

نقوم بعد ذلك بتقديم الطلب باستخدام مكتبة الطلبات والتحقق مما إذا كان محتوى الاستجابة يحتوي على الأخطاء التي نبحث عنها.

بعد ذلك ، نقوم بتحليل النماذج وتقديم عمليات إرسال بأحرف اقتباس في كل نموذج تم العثور عليه ، وهنا تشغيلي بعد الاختبار على صفحة ويب ضعيفة ومعروفة:

if __name__ == "__main__":
url = "http://testphp.vulnweb.com/artists.php?artist=1"
scan_sql_injection(url)

انتاج:

[!] Trying http://testphp.vulnweb.com/artists.php?artist=1"
[+] SQL Injection vulnerability detected, link: http://testphp.vulnweb.com/artists.php?artist=1"

كما ترى ، كان هذا ضعيفًا في عنوان URL نفسه ، ولكن بعد أن اختبرت ذلك على خادمي المحلي الضعيف (DVWA) ، حصلت على هذا الناتج:

[!] Trying http://localhost:8080/DVWA-master/vulnerabilities/sqli/"
[!] Trying http://localhost:8080/DVWA-master/vulnerabilities/sqli/'
[+] Detected 1 forms on http://localhost:8080/DVWA-master/vulnerabilities/sqli/.
[+] SQL Injection vulnerability detected, link: http://localhost:8080/DVWA-master/vulnerabilities/sqli/
[+] Form:
{'action': '#',
'inputs': [{'name': 'id', 'type': 'text', 'value': ''},
{'name': 'Submit', 'type': 'submit', 'value': 'Submit'}],
'method': 'get'}

ملاحظة: إذا كنت ترغب في اختبار البرنامج النصي على تطبيقات الويب الضعيفة مثل DVWA ، فأنت بحاجة إلى تسجيل الدخول أولاً.

استنتاج

لاحظ أنني اختبرت هذا النص البرمجي على العديد من مواقع الويب المعرضة للخطر وهو يعمل بشكل جيد. ومع ذلك ، إذا كنت تريد أداة حقن SQL أكثر موثوقية ، ففكر في استخدام sqlmap ، فهي مكتوبة بلغة Python أيضًا ، وتقوم بأتمتة عملية اكتشاف عيوب حقن SQL وكذلك استغلالها.

يمكنك تمديد هذا الرمز عن طريق إضافة ميزة استغلال ، يمكن أن تساعدك ورقة الغش هذه في استخدام أوامر SQL الصحيحة. أو قد ترغب في استخراج جميع روابط مواقع الويب والتحقق من الثغرة الأمنية في جميع صفحات الموقع ، يمكنك القيام بذلك أيضًا!


google-playkhamsatmostaqltradent