本文对华硕路由器中一个SQL注入漏洞做了简单的分析,希望能对和我一样的小白有所帮助。
漏洞描述
CVE-2023-35720 允许近源攻击者披露受影响的华硕 RT-AX92U 等路由器上的敏感信息。利用此漏洞无需经过鉴权。
该漏洞存在于 mod_webdav.so 模块中。解析请求时,该程序在使用用户提供的字符串构建 SQL 查询语句之前,未正确验证该字符串。攻击者可利用此漏洞在 root 上下文中披露信息。
固件信息
漏洞分析
RT-AX56U 受影响的最高固件版本为 RT-AX56U 3.0.0.4.386.51665。
分析该版本 mod_webdav.so:
调用array_get_element
获取Keyword参数
校验了长度和不含'
。
替换*
为%
,替换?
为_
。
根据不同情况,会拼接到不同的查询语句。
sql_get_table
示例用法:
1 | sql_get_table(db, "SELECT * FROM sqlite_master where type='table' and name='LiewenMes'", &dbResult, &nRow, &nColumn, NULL); |
第二个参数为查询语句
该函数在 libbwdpi_sql.so 和 liblightsql.so 中都有定义:
因此程序最后将拼接得到的语句作为查询语句在 sqlite 中执行。
可见漏洞的成因主要是获取用户输入后只进行了简单的过滤就拼接到 SQL 语句执行,造成 SQL 注入。
补丁分析
修复版本为 RT-AX56U 3.0.0.4.386_51679。
使用 bindiff 比较两个版本的 mod_webdav.so :
发现显著的不同是多了一个is_valid_string
函数。
用这个函数替代了之前对'
的校验。
在新版本固件文件系统中寻找该符号:
1 | $ grep -r 'is_valid_string' |
而旧版本中没有这个符号。
在 lighttpd 中发现该函数定义:
发现过滤了"
, $
, `
,;
, '
字符。
这样的过滤够不够呢……取决于程序实现吧,在mod_webdav.so中用户输入在拼接成SQL语句时基本都用''
包裹,没包裹的也是数字。
调用sql_get_table
函数的只有mod_webdav.so,因此该固件中应该不再存在类似成因的SQL注入漏洞。
结语
之前分析 IoT 漏洞基本专注于命令注入和栈溢出,SQL注入漏洞分析较少,因此写下本文记录。
后续有时间可以再模拟一下华硕路由器,做漏洞的复现。
条评论