

تحليل برمجي ثابت (Static Code Analysis) لإضافات/قوالب ووردبريس (ولغة PHP)
ما عليك سوى استنساخ المستودع وتثبيت المتطلبات وتشغيل السكربت:
$ git clone https://github.com/webarx-security/wpbullet wpbullet$ cd wpbullet$ pip install -r requirements.txt$ python wpbullet.pyالخيارات المتاحة:
--path (required) System path or download URL
Examples:
--path="/path/to/plugin"
--path="https://wordpress.org/plugins/example-plugin"
--path="https://downloads.wordpress.org/plugin/example-plugin.1.5.zip"
--enabled (optional) Check only for given modules, ex. --enabled="SQLInjection,CrossSiteScripting"
--disabled (optional) Don't check for given modules, ex. --disabled="SQLInjection,CrossSiteScripting"
--cleanup (optional) Automatically remove content of .temp folder after scanning remotely downloaded plugin (boolean)
--report (optional) Saves result inside reports/ directory in JSON format (boolean)
$ python wpbullet.py --path="/var/www/wp-content/plugins/plugin-name"
إنشاء وحدة أمر مرن ويتيح تجاوز دوال BaseClass لكل وحدة بالإضافة إلى إنشاء دوال خاصة بها.
كل وحدة في مجلد Modules تنفّذ الخصائص والدوال من core.modules.BaseClass، وبالتالي فإن المعامل المطلوب لكل وحدة هو BaseClass.
بمجرد إنشاء الوحدة، يجب استيرادها في modules/__init__.py. يجب أن يكون اسم الوحدة واسم الكلاس متطابقين حتى يتم تحميل الوحدة.
إذا كنت تفتح طلب سحب (Pull Request) لإضافة وحدة جديدة، فيرجى توفير اختبارات وحدة لوحدتك أيضًا.
Modules/ExampleVulnerability.py
from core.modules import BaseClass
class ExampleVulnerability(object):
# Vulnerability name
name = "Cross-site Scripting"
# Vulnerability severity
severity = "Low-Medium"
# Functions causing vulnerability
functions = [
"print"
"echo"
]
# Functions/regex that prevent exploitation
blacklist = [
"htmlspecialchars",
"esc_attr"
]
يتم إنشاء نمط regex في core.modules.BaseClass.build_pattern، وبالتالي يمكن تجاوزه في كل كلاس وحدة.
Modules/ExampleVulnerability.py
import copy
...
# Build dynamic regex pattern to locate vulnerabilities in given content
def build_pattern(self, content, file):
user_input = copy.deepcopy(self.user_input)
variables = self.get_input_variables(self, content)
if variables:
user_input.extend(variables)
if self.blacklist:
blacklist_pattern = r"(?!(\s?)+(.*(" + '|'.join(self.blacklist) + ")))"
else:
blacklist_pattern = ""
self.functions = [self.functions_prefix + x for x in self.functions]
pattern = r"((" + '|'.join(self.functions) + ")\s{0,}\(?\s{0,1}" + blacklist_pattern + ".*(" + '|'.join(user_input) + ").*)"
return pattern
تشغيل اختبارات الوحدة: $ python3 -m unittest