对骑士cms代码进行代码审计,通过通读的方法。
版本号:3.5.1
下载地址:http://103.45.101.75:66/2/201412/74cms.rar
通读审计
首先需要看看有哪些文件和文件夹,寻找名称里有没有带有api、admin、manage、include一类关键字的文件和文件夹,通常这些文件比较重要,在这个程序里,可以看到并没有什么PHP文件,就一个index.php,看到有一个名为include的文件夹,一般比较核心的文件都会放在这个文件夹中,我们先来看看大概有哪些文件
image.png
1.2 查看关键文件
在include里面,common.fun.php就是本程序的核心,大多数功能都在这里实现。
我们来看一下里面都有哪些关键函数
一开始就看到SQL注入过滤函数
该函数将传人的变量使用addslashes()函数进行过滤,也就过滤掉了单引号、双引号、NULL字符以及斜杠,现在我们要记住,在挖掘SQL注入等漏洞时,只要参数在拼接到SQL语句前,除非有宽字节注入或者其他特殊情况,否则使用了这个函数就不能注入了。
再往下走是一个XSS过滤的函数mystrip_tags
下面调用了new_html_special_chars和remove_xss函数去处理。
在new_html_special_chars()函数中可以看到,这个函数对&符号、双引号以及尖括号进行了html实体编码,并且使用striptags()函数进行了二次过滤。而remove_xss()函数则是对一些标签关键字、事件关键字以及敏感函数关键字进行了替换。
再往下就有获取IP的函数,此处可以伪造IP。其它程序在获取IP时没有验证IP格式,也可能利用获取IP进行注入。
下面是inserttable和updatetable函数,这里有大量的SQL语句进行查询,主要看有没有过滤问题。
再往下走则是wheresql()函数,是SQL语句查询的Where条件拼接的地方,我们可以看到参数都使用了单引号进行包裹。
还有一个访问令牌生成的函数asyn_userkey(),拼接用户名、密码salt以及密码进行一次md5,访问的时候只要在GET参数key的值里面加上生成的这个key即可验证是否有权限,被用在注册、找回密码等验证过程中,也就是我们能看到的找回密码链接里面的key。
同目录下是具体功能的文件,可以先不看
查找目录下的config文件
发现/data下的cache_config和config才是配置文件。
可以看到是,QISHI_DBCHARSET常量是GBK编码的,因此上面和数据相关的双引号解析代码处,可能存在宽字节注入。不过需要看数据库连接时设置的编码
接着找数据库连接文件/include/mysql.class.php中的connect函数
也就是当MySQL版本大于4.1时执行“set names gbk”,但当小于5.0.1时,下面不执行。
只执行set names gbk。
但set names gbk 等价于
设置客户端的编码
set character_set_client=gbk 设置连接器编码 set character_set_connection=gbk 设置返回值编码 set character_set_results=gbk client(客户端)、connection(连接器)、results(返回值)
所以,在MySQL4.1-5.0.1之间都存在宽字节注入。
通过对系统文件大概的了解,我们对这套程序的整体架构已经有了一定的了解,但是还不够,所以我们得跟读一下index.php文件,看看程序运行的时候会调用哪些文件和函数。
跟进到common.inc.php查看
可以看到引用了config.php为配置文件,common.fun.php是核心功能文件,74cms_version.php是版本文件
继续往下,可以看到对传输的数据进行过滤
再往下看到一个包含文件的操作
跟进到tpl.inc.php文件
可以看到进行了一个模版文件映射,并对smarty进行赋予属性。
现在回到index.php文件
判断是否存在缓存,然后用display将页面展示。
到这里发现了特定数据库版本存在宽字节注入,并对骑士CMS的代码有了更多了解。