海洋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上面是作为一个转义符号来使用,一般为了不让和系统的变量冲突所以使用,一般在数据库名、表名、字段名使用,所以这里用@来使这个成为一个变量类型。