海洋CMS V8.7 SQL注入漏洞

  • 发表于
  • Vulndb

海洋CMS V8.7漏洞

payload

海洋CMS V8.7 SQL注入漏洞

漏洞分析

在此之前我在MySQL 5.6、5.7上面复现都不成功,因为这两个版本用 extractvalue()updatexml() 报错注入不成功,后来换了系统Linux和Windows还有macOS来测试也是一样,和PHP、Apache的版本没有影响只要的还是MySQL的版本问题,所以大家测试的时候注意一下版本。

漏洞文件是在: comment/api/index.php

传入 $rlist 的值为我们构造的sql语句:

通过 ReadData 函数, implode 处理后传入 Readrlist 函数

可以看到执行的SQL语句是

海洋CMS V8.7 SQL注入漏洞

它在 $dsql->Execute('commentrlist'); 这句的时候会有一个SQL的安全检测

文件在 include/sql.class.phpCheckSql 函数

可以看到这里没有把我们的报错函数部分代入进去,如果代入进去检测的话就会这里检测到

海洋CMS V8.7 SQL注入漏洞

所以上面构造的语句也很有意思

海洋CMS V8.7 SQL注入漏洞

后面 $clean 就是要送去检测的函数,通过一番处理后得到的值为

海洋CMS V8.7 SQL注入漏洞

后面返回来执行的的SQL语句还是原样没动

海洋CMS V8.7 SQL注入漏洞

基本分析就完成了,最终执行的语句:

还有一些问题就是构造语句的问题。

刚开始传入的 %27 后面怎么变成了转义后的单引号?

开头的时候 require_once("../../include/common.php"); 就包含了这个文件,里面有一个 _RunMagicQuotes 函数,如果PHP配置没有开启 get_magic_quotes_gpc 就会用到这个函数,这个函数是把值经过 addslashes 函数的处理。此函数的作用是为所有的 ' (单引号), \" (双引号), \ (反斜线) and 空字符和以会自动转为含有反斜线的转义字符。

所以后面的SQL语句就会加上转义符号,然后经过 CheckSql 函数的时候就绕过了对报错语句的检测。

为什么要加上 两个反引号和@?

in 在MySQL里面用法是:

select * from where field in (value1,value2,value3,…)

value1必须是一个值,整数型或者文本型都可以,如果用单引号的话就会变成三个转义 \'\'\'

`在MySQL上面是作为一个转义符号来使用,一般为了不让和系统的变量冲突所以使用,一般在数据库名、表名、字段名使用,所以这里用@来使这个成为一个变量类型。