这次这个漏洞不是因为编码问题造成的了,而是过滤不够完善。
Doccms中首先对输入进行了全局过滤
Doccms在/loader/doc.php对输入的内容进行了全局的过滤,如下
跟进cleanArrayForMysql看一下,/inc/function.php
可以看到对用户的输入调用了mysql_real_escape_string()进行过滤,这个函数把sql的几个特殊字符过滤掉了,特别是’。先来看看对’是如何处理的,如下图:

可以看到DocCms把'转换成了/'。那如果想注入的话,不用’就可以了。
比如本次注入的地方,在 在线留言-->社会调查-->投票,这里会调用/content/poll/index.php中的send()方法,看看这个方法都做了些什么。
可以看到对$request['choice']并没有再次过滤就带入了sql执行,因此,只要构造不含有’的注入语句就可以了。
这个地方$request['choice']作为id执行update,而id是数字型的,不存在闭合’的问题,因此构造不含’的注入语句就比较容易了。投票这里存在error-based blind注入,exp如下:

从上面send()方法中可以看到,对投票者的ip进行了限制,第个ip只能投一票,相信你有N+1种方法可以避开这个限制~