漏洞点出现在Comment Widget里:
\addons\widget\CommentWidget\CommentWidget.class.php:138
$_POST经过$data [$key] = t( $data [$key] )后成为$data。
然后$dao = M ( $data ['table'] )会实例化一个Model,用于接下来的操作:
\core\OpenSociax\functions.inc.php:431:
\core\OpenSociax\functions.inc.php:441:
若\$className不存在,就实例化Model
\core\OpenSociax\Model.class.php:60
最后$this->name = $name将\$_POST['table_name']赋给Model实例的name属性里。
回到最初的addcomment函数,下一步就是用刚实例化的Model查找数据:
$sourceInfo = $dao->where ( $map )->find ()
在查找逻辑里,如果表名不存在,那么就使用name属性的值作表名,而name属性正是\$_POST['table_name'],漏洞就是表名可控。
\core\OpenSociax\Model.class.php:908:
由于ThinkSNS前台有WAF,因此需要结合t()来绕过:
\core\OpenSociax\functions.inc.php:630
经过t()的变量都会过real_strip_tags($text):
\core\OpenSociax\functions.inc.php:2274
而real_strip_tags($text)里的strip_tags($str, $allowable_tags)会过滤掉tag,所以在SQL关键字中插入tag就能bypass waf,最后成为可以被利用的SQL注入。
直接基于内容的SQL注入就好,POST请求都要带上正确的referer。